Vue3 常见面试题
核心特性
Vue3 有哪些新特性?
- Composition API
- 更好的 TypeScript 支持
- 性能优化(更小的包体积、更快的渲染)
- Fragments(多根节点组件)
- Teleport(传送门)
- Suspense(异步组件)
- 自定义渲染器 API
- 响应式系统重写(Proxy 替代 Object.defineProperty)
大约 2 分钟
vue3.0中可以继续使用vue2.x中的生命周期钩子,但有两个被更名:
beforeDestroy 改名为 beforeUnmount
destroyed 改名为 unmounted
vue3.0也提供了Composition API 形式的生命周期钩子,与vue2.x中钩子对应关系如下:
beforeCreate = => setup()
created = => setup()
beforeMount = => onBeforeMount()
mounted = => onMounted()
beforeUpdate = => onBeforeUpdate()
updated ==> onUpdated()
beforeUnmount = => onBeforeUnmount()
unmounted = => onUnmounted()
<template>
<h1>个人信息</h1>
姓: <input type="text" v-modal="person.firstName" />
名:<input type="text" v-modal="person.lastName" />
<br/>
全名:<span>{{ person.fullName }} </span>
</tempalte>
<script>
import { reactive, computed } from "vue";
export default {
setup(){
let person = reactive({
firstName: "张",
lastName: "三",
})
//计算属性--简写(没有考虑计算属性被修改的情况)
// person.fullName = computed( () => {
// return person.firstName + person.lastName;
// })
//计算属性--完整写法(考虑读和写)
person.fullName = computed({
get(){
return person.firstName + "-" + person.lastName;
}
set(value){
const arr = value.split("-");
person.firstName = arr[0];
person.lastName = arr[1];
}
})
return {
person,
}
}
}
</script>
与vue2.x中watch配置一致
监视reactive定义的响应式数据中某个属性时: deep配置有效
vue2写法
<template>
<h1>求和:{{ sum }}</h1>
<button @click="sum++">点我+1</button>
</tempalte>
<script>
export default {
watch: {
//简写
// sum(newValue, oldValue){
// console.log("sum变化了", newValue, oldValue);
// }
// 可配置属性
sum: {
immediate: true, //立即监听
deep: true, //深度监听
handler(newValue, oldValue){
console.log("sum变化了", newValue, oldValue);
}
}
}
}
</script>
const todoId = ref(1)
const data = ref(null)
watch(todoId, async () => {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${todoId.value}`
)
data.value = await response.json()
}, { immediate: true })