Vue23Web 基礎性拉滿的面試題(2025版)還沒更新完...

Vue2&3

  • 基礎性
    • 1. 關於Vue2和Vue3生命週期的差別
    • 2. Vue2&3組件之間傳參不同點
      • Vue2 傳遞與接收
      • Vue3 傳遞與接收 (使用script setup語法糖)
      • Vue3 傳遞與接收 (不使用script setup語法糖)
    • 3. Vue2&3 keep-alive 組件
      • Vue2 keep-alive
      • Vue3 keep-alive
  • 進階性
    • 爲什麽POST請求有時會重複調用兩次
      • 網路問題
      • 跨域請求與預檢請求
    • JS原型、原型鏈
      • 原型
      • 原型鏈
      • 繼承 有哪些繼承 優點是什麼
      • new 操作符具体干了什么
      • js 有哪些方法改变 this 指向
      • 对一个函数链式调用 bind,this 指向的是谁?为什么?

Alt

整個内容一般都是講Vue2&3的不同點 并無單個版本説明
博客為 >> 星光菌子 整理

基礎性

1. 關於Vue2和Vue3生命週期的差別

  • 相似的生命周期阶段
    Vue 2Vue 3 都包含以下几个核心的生命周期阶段,且对应的钩子函数功能类似

  • 创建阶段:在实例初始化时触发,主要用于初始化数据和事件
    Vue 2beforeCreatecreated
    Vue 3beforeCreatecreated
    不过在 Vue 3 的组合式 API 里,beforeCreate 和 created 可以省略因为 setup 函数在这个阶段之前执行,能完成相同的初始化工作

  • 挂载阶段:在实例挂载到 DOM 之前和之后触发
    Vue 2beforeMountmounted
    Vue 3beforeMountmounted
    功能与 Vue 2 一致

  • 更新阶段:当响应式数据发生变化,DOM 重新渲染前后触发
    Vue 2beforeUpdateupdated
    Vue 3beforeUpdateupdated
    功能与 Vue 2 一致

  • 销毁阶段:在实例销毁前后触发,用于清理一些资源
    Vue 2beforeDestroy(Vue 2.2.0 起也叫 beforeUnmount)destroyed(Vue 2.2.0 起也叫 unmounted)
    Vue 3beforeUnmountunmounted
    beforeUnmount 替代了 Vue 2 的 beforeDestroy,unmounted 替代了 destroyed

2. Vue2&3組件之間傳參不同點

Vue 2Vue 3 中,组件之间传参主要有两个明显不同点

  • 声明方式

    • Vue 2 在组件选项中使用 props 选项以对象或数组形式声明接收的属性;
    • Vue 3script setup 中使用 defineProps 宏函数来声明,在普通 script 中使用和 Vue 2 类似的 props 选项
  • 事件监听

    • Vue 2 使用 $emit 触发自定义事件,父组件使用 v-on@ 监听;
    • Vue 3script setup 中使用 defineEmits 宏函数声明可触发的事件,触发方式和 Vue 2 类似,但语法更简洁

Vue2 傳遞與接收

# 父组件 Parent.vue<template><div><!-- 引入子组件并传递数据,同时监听子组件触发的事件 --><ChildComponent :message="parentMessage" @childEvent="handleChildEvent" /></div>
</template><script>
// 引入子组件
import ChildComponent from './Child.vue';export default {components: {ChildComponent},data() {return {// 父组件的数据,用于传递给子组件parentMessage: '来自 Vue 2 父组件的数据'};},methods: {// 处理子组件触发的事件的方法handleChildEvent(data) {console.log('在 Vue 2 中收到来自子组件的数据:', data);}}
};
</script>
# 子组件 Child.vue<template><div><!-- 显示从父组件接收到的数据 --><p>{{ message }}</p><!-- 点击按钮触发向父组件发送事件 --><button @click="sendEventToParent">向父组件发送事件</button></div>
</template><script>
export default {// 声明接收父组件传递的 propsprops: ['message'],methods: {// 触发向父组件发送事件的方法sendEventToParent() {// 触发自定义事件并传递数据给父组件this.$emit('childEvent', '来自 Vue 2 子组件的数据');}}
};
</script>

Vue3 傳遞與接收 (使用script setup語法糖)

# 父组件 Parent.vue<template><div><!-- 引入子组件并传递数据,同时监听子组件触发的事件 --><ChildComponent :message="parentMessage" @child-event="handleChildEvent" /></div>
</template><script setup>
import { ref } from 'vue';
// 引入子组件
import ChildComponent from './Child.vue';// 使用 ref 创建响应式数据,作为要传递给子组件的数据
const parentMessage = ref('来自 Vue 3 父组件的数据');// 处理子组件触发的事件的方法
const handleChildEvent = (data) => {console.log('在 Vue 3 中收到来自子组件的数据:', data);
};
</script>
# 子组件 Child.vue<template><div><!-- 显示从父组件接收到的数据 --><p>{{ message }}</p><!-- 点击按钮触发向父组件发送事件 --><button @click="sendEventToParent">向父组件发送事件</button></div>
</template><script setup>
import { defineProps, defineEmits } from 'vue';// 声明接收父组件传递的 props
const props = defineProps({message: String
});// 声明可触发的自定义事件
const emits = defineEmits(['child-event']);// 触发向父组件发送事件的方法
const sendEventToParent = () => {// 触发自定义事件并传递数据给父组件emits('child-event', '来自 Vue 3 子组件的数据');
};
</script>

Vue3 傳遞與接收 (不使用script setup語法糖)

# 父组件 Parent.vue<template><div><!-- 引入子组件,传递数据并监听子组件触发的事件 --><ChildComponent :message="parentMessage" @child-event="handleChildEvent" /></div>
</template><script>
import { ref } from 'vue';
// 引入子组件
import ChildComponent from './Child.vue';export default {components: {ChildComponent},setup() {// 使用 ref 创建响应式数据const parentMessage = ref('来自 Vue 3 父组件的数据');// 处理子组件触发的事件的方法const handleChildEvent = (data) => {console.log('在 Vue 3 中收到来自子组件的数据:', data);};// 返回需要在模板中使用的数据和方法return {parentMessage,handleChildEvent};}
};
</script>
# 子组件 Child.vue<template><div><!-- 显示从父组件接收到的数据 --><p>{{ message }}</p><!-- 点击按钮触发向父组件发送事件 --><button @click="sendEventToParent">向父组件发送事件</button></div>
</template><script>
import { defineComponent } from 'vue';export default defineComponent({// 声明接收父组件传递的 propsprops: {message: {type: String,required: true}},// 声明可触发的自定义事件emits: ['child-event'],setup(props, { emit }) {// 触发向父组件发送事件的方法const sendEventToParent = () => {// 触发自定义事件并传递数据给父组件emit('child-event', '来自 Vue 3 子组件的数据');};// 返回需要在模板中使用的方法return {sendEventToParent};}
});
</script>

3. Vue2&3 keep-alive 組件

keep-alive 是 Vue 提供的一个内置组件,用于缓存动态组件或路由组件,避免组件在切换时重复创建和销毁,从而提高组件的性能和响应速度。下面分别介绍 Vue 2 和 Vue 3 中 keep-alive 的使用方法


activateddeactivated 是比較特殊的兩個鉤子,需要keep-live配合使用
當引入 keep-alive 的時候,頁面第一次進入,鉤子的觸發順序 created => mounted => activated退出時觸發 deactivated 當再次進入(前進或後退)時,只觸發activated

Vue2 keep-alive

Vue3 keep-alive

進階性

爲什麽POST請求有時會重複調用兩次

網路問題

有時瀏覽器為了確保請求的可靠性,會在網路不穩定的情況下自動重試請求
如果第一次 POST 請求因網路問題而沒有成功,瀏覽器可能會自動再發一次請求
這種情況下,我們會看到兩次 POST 請求

跨域請求與預檢請求

當我們進行跨網域請求時,尤其是使用 CORS(跨網域資源共用) 時,瀏覽器會在正式發送POST請求之前發送OPTIONS請求,這就是所謂的預檢請求
這是為了確定伺服器是否允許跨網域請求

fetch('https://api.example.com/data', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer token'},body: JSON.stringify({ key: 'value' })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));# 在開發者工具中,我們可以看到先發了一個OPTIONS請求,接著才是實際的POST請求

JS原型、原型鏈

原型

  • ① 所有引用类型都有一个 __proto__ (隐式原型) 属性,属性值是一个普通的对象
  • ② 所有函数都有一个 prototype(原型) 属性,属性值是一个普通的对象
  • ③ 所有引用类型的 __proto__ 属性指向它构造函数的 prototype

原型鏈

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的 __proto__ 隐式原型上查找,即它的构造函数的 prototype,如果还没有找到就会再在构造函数的 prototype__proto__ 中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链

原型鏈判斷

Object.prototype.__proto__; //null
Function.prototype.__proto__; //Object.prototype
Object.__proto__; //Function.prototype
Object instanceof Function; //true
Function instanceof Object; //true
Function.prototype === Function.__proto__; //true

繼承 有哪些繼承 優點是什麼

继承(inheritance)是面向对象软件技术当中的一个概念。如果一个类别 B“继承自”另一个类别 A,就把这个 B 称为“A 的子类”,而把 A 称为“B 的父类别”也可以称“AB 的超类”.

组合继承: 原型链继承和借用构造函数方法组合就是组合继承。用原型链实现对原型属性和方法的继承,用借用构造函数技术来实现实例属性的继承.

寄生组合式继承: 结合借用构造函数传递参数和寄生模式实现继承。这是最成熟的方法,也是现在库实现的方法

優點:继承可以使得子类具有父类别的各种属性和方法,在子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能


new 操作符具体干了什么

  • 新建一个空对象 obj
  • obj 的隐式原型和构造函数通过原型链连接起来
  • 将构造函数的 this 指向 obj
  • 如果该函数没有返回对象,则返回 this
// 定义一个构造函数 Person,用于创建表示人的对象
// 构造函数通常首字母大写,这是一种约定俗成的写法,用于区分普通函数
// 参数 name 表示人的姓名,参数 age 表示人的年龄
function Person(name, age) {// 将传入的 name 参数赋值给新对象的 name 属性this.name = name;// 将传入的 age 参数赋值给新对象的 age 属性this.age = age;
}// 自定义的函数 myNew,用于模拟 new 操作符的功能
// 参数 constructor 是一个构造函数,也就是我们想要用来创建对象的函数
// 使用剩余参数语法 ...args 接收传递给构造函数的所有参数,这些参数会在构造函数执行时使用
function myNew(constructor, ...args) {// 步骤 1: 创建一个新对象// Object.create(constructor.prototype) 方法用于创建一个新对象,// 并将这个新对象的原型设置为构造函数的原型。// 这样新对象就可以继承构造函数原型上定义的所有属性和方法const newObj = Object.create(constructor.prototype);// 步骤 2: 将新对象的 this 指向构造函数,并执行构造函数// constructor.apply(newObj, args) 方法调用构造函数,// 并将构造函数内部的 this 指向新创建的对象 newObj,// 同时将之前收集的参数 args 传递给构造函数,让构造函数可以根据这些参数初始化新对象的属性const result = constructor.apply(newObj, args);// 步骤 3: 判断构造函数的返回值// 如果构造函数返回的是一个对象(通过 typeof result === 'object' 判断类型为对象,// 并且 result!== null 排除返回值为 null 的情况,因为 typeof null 也会返回 'object'),// 就返回构造函数的返回值;// 否则,返回我们在步骤 1 中创建的新对象 newObjreturn typeof result === 'object' && result!== null? result : newObj;
}// 使用自定义的 myNew 函数创建对象
// 这里将 Person 构造函数作为第一个参数传递给 myNew,
// 并将 'John' 和 30 作为后续参数传递,这些参数会在 Person 构造函数执行时使用
const person = myNew(Person, 'John', 30);// 打印创建的对象
// 此时打印出的对象应该包含 name 和 age 属性,值分别为 'John' 和 30
console.log(person); 
  • Object.create(constructor.prototype):这行代码创建了一个新对象 newObj,并将其原型指向构造函数的原型,这样,新对象就可以继承构造函数原型上的属性和方法
  • constructor.apply(newObj, args)使用 apply 方法将构造函数的 this 指向新对象 newObj,并执行构造函数,将参数 args 传递给构造函数
  • 返回值判断:如果构造函数返回一个对象,则返回该对象;否则,返回新创建的对象 newObj

js 有哪些方法改变 this 指向

callapplybind
三者的第一个参数都是 this 需要指向的对象,但在后续的参数上只有 apply 是接收一个数组callbind 用逗号分开callapply 直接调用,返回的是一个值,而 bind 不直接调用,返回的是一个函数形式,执行:foo.bind(obj)()

# call()
# call() 方法允许你调用一个函数,同时指定该函数内部 this 的值,并且可以依次传递参数给函数
// 定义一个对象,后续将作为 this 的指向
const person = {name: 'Alice'
};
// 定义一个函数,函数内部使用 this 来访问属性
function introduce(hobby) {// 打印出根据 this 指向的对象属性生成的介绍语句console.log(`大家好,我叫 ${this.name},我喜欢 ${hobby}`);
}
// 使用 call 方法调用 introduce 函数,并将 person 对象作为 this 的指向
// 同时传递 '画画' 作为 introduce 函数的参数
introduce.call(person, '画画'); # -------------------------------分割線-------------------------------------# apply()
# apply() 方法和 call() 方法类似,同样用于调用函数并指定 this 的值,不同之处在于它接受一个数组作为函数的参数
// 定义一个对象,作为 this 的指向
const anotherPerson = {name: 'Bob'
};
// 定义一个函数,内部使用 this 访问属性
function introduceFood(food1, food2) {// 打印出根据 this 指向的对象属性生成的喜欢食物的语句console.log(`我叫 ${this.name},我喜欢吃 ${food1}${food2}`);
}
// 使用 apply 方法调用 introduceFood 函数
// 将 anotherPerson 对象作为 this 的指向
// 并以数组形式传递 '披萨' 和 '汉堡' 作为函数参数
introduceFood.apply(anotherPerson, ['披萨', '汉堡']); # -------------------------------分割線-------------------------------------# bind()
# bind() 方法会创建一个新的函数,在调用时会将 this 的值设置为你提供的值,并且可以预先传入部分参数
// 定义一个对象,作为 this 的指向
const student = {name: 'Charlie'
};
// 定义一个函数,内部使用 this 访问属性
function study(subject) {// 打印出根据 this 指向的对象属性生成的学习语句console.log(`${this.name} 正在学习 ${subject}`);
}
// 使用 bind 方法创建一个新的函数 newStudy
// 将 student 对象作为新函数内部 this 的指向
// 并预先传入 '数学' 作为参数
const newStudy = study.bind(student, '数学');
// 调用新函数
newStudy(); 

对一个函数链式调用 bind,this 指向的是谁?为什么?

JavaScript 中,对一个函数链式调用 bind 时,this 最终指向的是第一次调用 bind 时所指定的对象

  • 原因
    bind 方法会创建一个新的函数,在调用时这个新函数的 this 值会被锁定为 bind 方法调用时第一个参数所指定的对象
    当对一个函数多次链式调用 bind 时,后续的 bind 调用并不会改变第一次 bind 所确定的 this 指向因为后续的 bind 是基于前一次 bind 所创建的新函数来操作的,而前一次 bind 已经固定了 this 的指向
// 定义一个简单的函数,函数内部打印 this 的值
function printThis() {console.log(this);
}
// 创建一个对象,后续会将其作为 this 指向
const obj1 = { name: 'obj1' };
const obj2 = { name: 'obj2' };
// 第一次调用 bind,将 this 指向 obj1
const bound1 = printThis.bind(obj1);
// 对 bound1 再次调用 bind,尝试将 this 指向 obj2
const bound2 = bound1.bind(obj2);
// 调用最终绑定后的函数
bound2(); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot实现旅游酒店平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…

【程序自动分析——并查集,离散化】

题目 代码&#xff08;注意不是把p修改为unordered_map&#xff0c;而是增加一个get&#xff09; #include <bits/stdc.h> using namespace std;const int N 2e510; //n个数据&#xff0c;可能引入2*n个离散点int p[N]; bool cannot; unordered_map<int, int> mp…

审批流AntV框架蚂蚁数据可视化X6饼图(附注释)

大家好&#xff0c;这次使用的是AntV的蚂蚁数据可视化X6框架&#xff0c;类似于审批流的场景等&#xff0c;代码如下&#xff1a; X6框架参考网址&#xff1a;https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址&#xff0c;直接复制下方代码进行调试…

linux取代ls的命令行工具:eza

官方仓库 https://github.com/eza-community/eza 安装 cargo install eza验证 eza --version用法 替换ls 别名 安装文档 官方提供的安装文档是这个 https://github.com/eza-community/eza/blob/main/INSTALL.md 可以通过cargo命令安装&#xff0c;debian还可以通过apt安装…

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)

文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤&#xff08;Ollama方式&#xff09;1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…

redis热key

在 Redis 中&#xff0c;热 Key&#xff08;Hot Key&#xff09; 是指被频繁访问的 Key&#xff0c;可能会导致以下问题&#xff1a; 性能瓶颈&#xff1a;单个 Redis 实例的 CPU 或网络带宽被耗尽。 数据倾斜&#xff1a;在 Redis 集群中&#xff0c;热 Key 可能导致某个节点…

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …

Axure常用变量及使用方法详解

点击下载《Axure常用变量及使用方法详解.pdf》 摘要 Axure RP 作为一款领先的前端原型设计工具&#xff0c;提供了全面的 变量 和 函数 系统&#xff0c;以支持复杂的交互设计和动态内容展示。本文将从专业角度详细解析 Axure 中的 全局变量、中继器数据集变量/函数、元件变量…

SpringBoot - 用责任链模式实现业务编排

文章目录 前因责任链&#xff1a;像工作台一样组织代码CodeSEQ3.1 定义处理器规范3.2 实现具体处理器3.3 共享上下文3.4 组装责任链 适用场景优势 前因 2000多行的业务逻辑里&#xff0c;各种校验规则、促销计算、库存操作像意大利面条一样缠绕在一起。最要命的是这样的代码结…

upload-labs详解(13-20)文件上传分析

目录 upload-labs-env upload-labs-env第十三关 文件包含漏洞 代码 测试 上传一个.jpg图片 上传一个.png文件 上传一个.gif图片 upload-labs-env第十四关 代码 思路 upload-labs-env第十五关 代码 思路 upload-labs-env第十六关 代码 思路 测试 上传gif格式…

网络安全通信架构图

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS&#xff0c;这2个有什么区别呢&#xff1f;以及HTTPS是怎么通信的&#xff1f;包括对称加密、非对称加密、摘要、…

Java中的String类

目录 1. String类的重要性 2. 常用方法 2.1 字符串构造 2.2 String对象的比较 2.3 字符串查找 2.4 转化 2.5 字符串替换 2.6 字符串拆分 2.7 字符串截取 2.8 其他操作方法 2.9 字符串的不可变性 2.10 字符串修改 3. StringBuilder和StringBuffer 3.1 StringBuilde…

深度分页介绍及优化建议

深度分页介绍 查询偏移量过大的场景我们称为深度分页&#xff0c;这会导致查询性能较低&#xff0c;例如&#xff1a; # MySQL 在无法利用索引的情况下跳过1000000条记录后&#xff0c;再获取10条记录 SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10 深度分页问题的原…

live555推流服务器异常

1.后端异常信息&#xff1a; MultiFramedRTPSink::afterGettingFrame1(): The input frame data was too large for our buffer size (100176). 48899 bytes of trailing data was dropped! Correct this by increasing "OutPacketBuffer::maxSize" to at least m…

每日OJ_牛客_宵暗的妖怪_DP_C++_Java

目录 牛客_宵暗的妖怪_DP 题目解析 C代码 Java代码 牛客_宵暗的妖怪_DP 宵暗的妖怪 描述&#xff1a; 露米娅作为宵暗的妖怪&#xff0c;非常喜欢吞噬黑暗。这天&#xff0c;她来到了一条路上&#xff0c;准备吞噬这条路上的黑暗。这条道路一共被分为n 部分&…

20250306-笔记-精读class CVRPEnv:step(self, selected)

文章目录 前言一、if self.time_step<4:控制时间步的递增判断是否在配送中心特定时间步的操作更新更新当前节点和已选择节点列表更新需求和负载更新访问标记更新负无穷掩码更新步骤状态&#xff0c;将更新后的状态同步到 self.step_state 二、使用步骤总结 前言 class CVRP…

Flowable 基本入门

flowable.7z官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、Flowable介绍 Flowable是BPMN的一个基于java的软件实现&#xff0c;不过Flowable不仅仅包括BPMN&#xff0c;还有DMN决策表和CMMN Case管理引擎&#xff0c;并且有自己的用户管理、微服务API等一系列功能&a…

完全背包-一维数组

52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和…

景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁

在人工智能技术重塑全球产业格局的今天&#xff0c;高质量训练数据已成为驱动算法进化的核心燃料。作为数据智能服务领域的领军者&#xff0c;景联文科技深耕数据标注行业多年&#xff0c;以全栈式数据解决方案为核心&#xff0c;构建起覆盖数据采集、清洗、标注、质检及算法调…

洛谷B2074 计算星期几

B2074 计算星期几 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream> #include<unordered_map> #include<string> using namespace std; int main() {unordered_map<int, string> m { { 1,"Monday" },{2,"Tue…