首页 / VUE / Vue3.0 响应式原理
Vue3.0 响应式原理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Vue3.0 响应式原理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2124字,纯文字阅读大概需要4分钟。
内容图文
![Vue3.0 响应式原理](/upload/InfoBanner/zyjiaocheng/1039/9a18bfd5ff74432596454560e3eac1a4.jpg)
vue 3.0 响应式系统的升级
使用Proxy对象 重写响应式系统
- 可以监听动态新增的属性
- 可以监听删除的属性
- 可以监听数组的索引和length属性
响应式核心函数
- reactive/ref/toRefs/computed
- effect
- track 手机依赖
- trigger 更新依赖
Proxy 对象中的两个小问题
第一个问题: set 和 deleteProperty 需要返回布尔类型的值
第二个问题:Proxy 和 Reflect 使用 receiver
Proxy 中的 receiver: Proxy 或者继承 Proxy 的对象
Reflect 中的receiver:如果 target对象设置了getter,getter中的this指向 receiver
const obj = {
get foo() {
console.log(this)
return this.bar
}
}
const proxy = new Proxy(obj, {
get (target, key, receiver) {
if (key === 'bar') {
console.log('value - bar')
}
return Reflect.get(target, key, receiver)
},
set (target, key, value, receiver) {
return Reflect.set(target, key, value, receiver),
deleteProperty(target, key) {
return Reflect.deleteProperty(target, key)
}
}
})
console.log(proxy.foo)
// Proxy {}
// value - bar
track 收集依赖 和 trigger 更新依赖
let activeEffect = null
export function effect (callback) {
activeEffect = callback
callback() // 访问响应式对象,收集依赖
activeEffect = null
}
let targetMap = new WeakMap()
export function track (target, key) {
if (!activeEffect) return
let depsMap = targetMap.get(target)
if (!depsMap) {
depsMap.set(key, (depsMap = new Map()))
}
let dep = depsMap.get(key)
if (!dep){
depsMap.set(key, (dep = new Set()))
}
}
export function (target, key) {
let depsMap = targetMap.get(target)
if (!depsMap) return
let dep = depsMap.get(key)
dep && dep.forEach((effect) => {
effect()
})
}
reactive VS ref
- ref 可以把基本数据类型,转成响应式对象
- ref 返回对象,重新赋值成对象也是响应式的
- reactive 返回的对象,重新赋值丢失响应式
- reactive 返回的对象不可以解构
toRefs
接收一个 reactive 返回的响应式对象
如果传入的参数不是 reactive 返回的响应式对象(__v__isRef),直接返回
然后再把传入对象挂载到一个新的对象返回
可以对对象进行解构
import { reactive, effect, toRefs } from './reactivity.js '
function useProduct () {
const product = reactive({
name: 'iPhone',
price: 5000,
count: 3
})
return toRefs(product)
}
const {price, count} = useProduct()
let total = 0
effect(() => {
total = price.value * count.value
})
console.log(total)
price.value = 4000
console.log(total)
内容总结
以上是互联网集市为您收集整理的Vue3.0 响应式原理全部内容,希望文章能够帮你解决Vue3.0 响应式原理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。