setup(props, context) / setup(props, {attrs, slots, emit})
-
props: 包含props配置声明且传入了的所有属性的对象
-
attrs: 包含没有在props配置中声明的属性的对象, 相当于 this.$attrs
-
slots: 包含所有传入的插槽内容的对象, 相当于 this.$slots
-
emit: 用来分发自定义事件的函数, 相当于 this.$emit
-
App.vue
<Child :msg=“msg” msg2=“context.attrs中测试文字” @X=“X”>
- Child.vue
-
作用: 定义一个响应式的数据
-
语法: const xxx = ref(initValue)
-
返回的是一个ref对象,对象中value属性,如果需要对数据操作,通过ref对象调用value属性方式进行操作
-
操作数据: xxx.value
-
HTML模板中操作数据: 不需要.value
-
一般用来定义一个基本类型的响应式数据
-
作用: 定义多个数据的响应式
-
const proxy = reactive(obj): 接收一个普通对象然后返回该普通对象的响应式代理器对象
-
响应式转换是“深层的”:会影响对象内部所有嵌套的属性
-
内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的
=================================================================================
- 对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截)
- 问题:对象直接新添加的属性或删除已有属性, 界面不会自动更新,比如表单都是通过v-model双向绑定data里面的数据然后修改数据的
- 数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持
- 问题: 直接通过下标替换元素或更新length, 界面不会自动更新 arr[1] = {}
Object.defineProperty(data, ‘count’, {
get () {},
set () {}
})
- 通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等
-
handler: 包含捕捉器(trap)的占位符对象,可译为处理器对象,也就是用来监视数据变化
-
traps提供属性访问的方法。这类似于操作系统中捕获器的概念
-
target被 Proxy 代理虚拟化的对象。它常被作为代理的存储后端,也就是目标对象
-
通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作
-
Vue3的响应是深度式的响应
本文详细比较了Vue2和Vue3中的响应式系统,包括props、attrs、ref以及reactive的使用方法,重点讲解了Vue3通过Proxy和Reflect实现的深度响应式处理,以及与Vue2中defineProperty方法的差异。
1万+

被折叠的 条评论
为什么被折叠?



