前言
主要做一些Vue3的学习笔记,方便后续查找。查缺补漏
提示:以下是本篇文章正文内容,下面案例可供参考
环境搭建
## 安装或者升级
npm install -g @vue/cli
## 保证 vue cli 版本在 4.5.0 以上
vue --version
## 创建项目
vue create my-project
setup
新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次
- 执行时机
在beforeCreate之前执行(一次), 此时组件对象还没有创建。this是undefined, 不能通过this来访问data/computed/methods / props
- 返回值
一个对象,用于模板的属性和方法。会与data、methods合并,setup优先级高。
- 参数
setup(props, context) / setup(props, {attrs, slots, emit})
import Child from "./Child.vue";
import { defineComponent, ref, reactive } from "vue";
export default defineComponent({
name: "HomeView",
components: {
Child,
},
setup() {
const count = ref(1);
function update() {
count.value++;
}
// 返回一个proxy的代理对象,被代理的是里面的对象
const user = reactive({
name: "小明",
age: 18,
});
const update2 = () => {
user.name += "++";
};
return {
count,
update,
user,
update2,
};
},
});
ref
定义一个数据的响应式,用来处理基本类型数据(也可以使用对象,要.value)。
reactive
定义多个数据的响应式,用来处理对象(递归深度响应式)。
计算属性与监视
- computed函数
- watch函数
- watchEffect函数
import { defineComponent, reactive, computed, watch, watchEffect } from "vue";
export default defineComponent({
name: "HomeView",
components: {},
setup() {
const user = reactive({
firstName: 'A',
lastName: 'B'
})
const fullName1 = computed(()=>{
console.log('fullName1');
return user.firstName + '--' + user.lastName;
})
const fullName2 = computed({
get () {
console.log('fullName2 get')
return user.firstName + '-' + user.lastName
},
set (value: string) {
console.log('fullName2 set')
const names = value.split('-')
user.firstName = names[0]
user.lastName = names[1]
}
})
watch(user, ({firstName, lastName})=>{
console.log(firstName, lastName, 1111)
},{
immediate: true, // 是否初始化立即执行一次, 默认是false
deep: true, // / 是否是深度监视, 默认是false
});
/*
watch多个数据:
使用数组来指定
如果是ref对象, 直接指定
如果是reactive对象中的属性, 必须通过函数来指定
*/
watch([() => user.firstName, () => user.lastName, fullName2], (values) => {
console.log('监视多个数据', values)
})
watchEffect(()=>{
console.log(user.firstName, user.lastName, 2222)
});// 不需要指定对象,默认带有immediate
return {
user,
fullName1,
fullName2
};
},
});
</script>
生命周期
vue3 对比 vue2生命周期:
beforeCreate
-> 使用setup()
created
-> 使用setup()
beforeMount
->onBeforeMount
mounted
->onMounted
beforeUpdate
->onBeforeUpdate
updated
->onUpdated
beforeDestroy
->onBeforeUnmount
destroyed
->onUnmounted
errorCaptured
->onErrorCaptured
import { defineComponent, onMounted, onUpdated, onUnmounted, onBeforeMount, onBeforeUpdate, onBeforeUnmount } from "vue";
export default defineComponent({
name: "HomeView",
setup() {
onBeforeMount(() => {
console.log('--onBeforeMount')
})
onMounted(() => {
console.log('--onMounted 可以放些异步请求')
})
onBeforeUpdate(() => {
console.log('--onBeforeUpdate')
})
onUpdated(() => {
console.log('--onUpdated')
})
onBeforeUnmount(() => {
console.log('--onBeforeUnmount')
})
onUnmounted(() => {
console.log('--onUnmounted')
})
return {}
}
});
toRefs
把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref
function useReatureX() {
const state = reactive({
foo2: 'a',
bar2: 'b',
})
setTimeout(() => {
state.foo2 += '++'
state.bar2 += '++'
}, 2000);
return toRefs(state)
}
ref
获取组件中的标签元素
const inputRef = ref<HTMLElement|null>(null)
shallowReactive 与 shallowRef
-
shallowReactive : 只处理了对象内最外层属性的响应式(浅响应式)。与reactive类似;
-
shallowRef:只处理了value的响应式, 不进行对象的reactive处理。与ref类似;
区别:reactive与ref实现的是深度响应式, 而shallowReactive与shallowRef是浅响应式。
readonly 与 shallowReadonly
只读对象。
- readonly:深度只读。
- shallowReadonly:浅度只读。
const state = reactive({
a: 1,
b: {
c: 2
}
})
const rState1 = readonly(state)
const rState2 = shallowReadonly(state)
toRaw 与 markRaw
- toRaw:代理对象变成普通对象,数据变化,界面不变化。
- markRaw:标记的对象数据,再也不能变成代理对象。
toRef与ref
- toRef:把响应式数据state对象中的某个属性变成ref对象。数据互通,会相互影响。
- ref:吧响应式对象中的某个属性使用ref进行包装,变成一个ref对象。不会相互影响。
const state = reactive({
foo: 1,
bar: 2
})
const foo = toRef(state, 'foo')
const foo2 = ref(state.foo)
customRef
创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制
provide 与 inject
provide和
inject提供依赖注入,功能类似 2.x 的
provide/inject
响应式数据的判断
- isRef: 检查一个值是否为一个 ref 对象
- isReactive: 检查一个对象是否是由
reactive
创建的响应式代理 - isReadonly: 检查一个对象是否是由
readonly
创建的只读代理 - isProxy: 检查一个对象是否是由
reactive
或者readonly
方法创建的代理