reactive数据不响应

我们知道,reactive函数用于创建对象等复杂数据的响应式代理对象,当该对象的属性发生变化时,会自动触发视图更新。

但在Vue 3中,当我们使用`reactive`创建的对象或数组进行赋值时,尽管能够完成正常的赋值操作,但却无法触发响应式变化。

复制代码
let student = reactive({})
let obj={
    name:"一一",
    sex:"女"
}
student=obj;

上述代码student=obj可以实现将obj的值赋给student,但不能在页面众响应式变化。


问题根源

问题在于每次直接将对象或数组赋值给`reactive`创建的对象时,导致`reactive`创建的响应式对象直接被新赋值的对象代理。由于Vue 3中所有操作都在`Proxy`代理对象上执行,这导致了响应式失效。

所以说,相当于地址被替换了,赋值后已经不是原来的响应式代理对象了。

知道原因之后,就很好解决了。

法一:避免直接赋值,而是在对象内部进行赋值,以保持响应式效果

javascript 复制代码
let obj={
    name:"一一",
    sex:"女"
}


let student=reactive({})
student=obj

//改为
//↓↓↓↓↓↓↓↓↓↓↓↓

let data = reactive({
    student:null,
})
data.student=obj

法二:另一种解决方法是直接使用`ref`

javascript 复制代码
let obj={
    name:"一一",
    sex:"女"
}


let student=reactive({})
student=obj

//改为
//↓↓↓↓↓↓↓↓↓↓↓↓

let student=ref({})
student.value=obj

Vue 3的响应式机制是基于ES6的`Proxy`实现的。

`Proxy`本身用于对象拦截,通过`new Proxy`返回的值触发`get`和`set`方法,并通过ES6的`Reflect`进行反射,动态地对被代理对象的属性进行操作。由于`Proxy`是基于对象的拦截,当对象本身是原始值时,拦截无效,响应式也就失效。而`ref`在实现响应式时通过`.value`包裹一层对象,从而解决了这个问题。

相关推荐
1024肥宅6 分钟前
手写 Promise:深入理解 JavaScript 异步编程的核心
前端·javascript·promise
铅笔侠_小龙虾9 分钟前
Vue 学习目录
前端·vue.js·学习
zhousenshan9 分钟前
Vite 前端构建工具
vue.js
悟能不能悟11 分钟前
vue的history和hash模式有什么不一样
前端·vue.js
你不是我我14 分钟前
【Java 开发日记】我们来说一说 Redis IO 多路复用模型
java·开发语言·redis
想七想八不如1140815 分钟前
408操作系统 PV专题
开发语言·算法
浩瀚地学17 分钟前
【Java】ArrayList
java·开发语言·经验分享·笔记
Uso_Magic21 分钟前
VOL问题记录!!!
vue.js
阿杰同学25 分钟前
Java 设计模式 面试题及答案整理,最新面试题
java·开发语言·设计模式