对于vue中数据响应式原理说法,vuex里面的数据是响应式的吗
Vue.js的核心包括一个“响应式系统”。“响应式”是指当数据发生变化时,Vue会通知使用数据的代码。例如,当在视图渲染中使用数据时,当数据改变时,视图将自动更新。
:
目录
1.es语法的getter和setter2的Define属性。ES语法3。VUE的代理和数据监控4。Vue的数据响应
1. ES语法的getter和setter
在开始了解Vue的数据响应原理之前,我们首先要知道ES语法中getter和setter方法的具体用法。
Getter和setter方法是用get和set关键字向对象添加虚拟属性的一种方式。这种属性其实并不存在,是getter和setter模拟出来的一种属性。目的是为属性设置一个值函数和一个值函数,拦截属性的访问行为,从而对属性的访问做出一些限制。如下所示(以下代码来自mdn)
吸气方法
const obj={
日志:[a , b , c],
Get latest() {//在普通方法之前添加Get关键字
if (this.log.length==0) {
返回未定义的;
}
返回this . log[this . log . length-1];
}
}
console . log(obj . latest);//输出C,得到不带括号的属性名。
Setter方法
常量语言={
设置当前(名称){
this.log.push(名称);
},
日志:[]
}
language.current= EN
language.current= FA
console . log(language . log);//输出数组[EN , FA]
2. ES语法的 defineProperty
defineProperty方法直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回这个对象,它可以用来在对象被定义后修改或添加属性。
语法是:
Object.defineProperty(对象,属性,描述符)
添加常规属性:
let data={
男:0
}
Object.defineProperty(data, n ,{
Value: 1 //添加属性的值就是它的值
})
Console.log(`${data.n}`) //则n的输出值为1
它还可以用来添加getter和setter的虚拟属性。
让数据1={
_n: 0
}
Object.defineProperty(数据1, n ,{
get(){
归还这个。_n
},
设置(值){
if(值0)返回
这个。_n=值
}//直接声明get/set即可。
})//因为表示虚属性为N,即get n(){},set n(value){},所以在定义函数时不需要写N。
3. Vue对数据的代理和监听
代理,就是简单来说,我自己的一些事情我不亲自处理,而是交给别人帮我处理,而那个做事的人就是代理人。这个逻辑中有两个关键点需要明确。代理人是处理操作的人,他处理操作的东西不属于他,而属于委托他代理的人。
所以相对于Vue数据代理,data {0}数据对象是委托给代理的,它找到的代理是Vue实例vm。data {0} data object要为vm做的是管理data {0} data object中的数据操作。所以data{}数据对象只负责内部数据的产生,产生的数据的管理和操作完全交给vm。
那么vm如何控制和操作data{}数据对象中的数据呢?换句话说,当data{}数据对象中的任何属性值改变时,vm如何及时知道?
因此,使用ES语法中的getter和setter方法。getter和setter方法控制的属性的任何操作都会被这两个函数检测到,而getter和setter方法形成的属性都是虚属性,是不存在的。所以,如果一个用户想在没有代理vm的情况下直接修改data{} data object的属性,并且无法获取对应的实体属性,那么只能通过getter和setter方法进行修改,所以它的修改会被vm检测到。
因此,为了完全控制data{}数据对象中的数据,在创建Vue实例时,vm必须对传入的data{}数据对象进行一些处理。处理是将data{}数据对象中的属性改为由getter和setter方法控制的虚拟属性,保存在代理数据对象obj中并返回。
但是,为了防止用户直接修改原始数据{0}属性,原始数据{0}对象的物理属性已经全部更改。如果添加的虚拟属性名称与物理属性名称相同,则原来的实际属性将被虚拟属性覆盖。用户的修改属性值是由getter和setter方法修改的虚拟属性。这样,数据对象的所有属性的任何改变都将被Vue实例vm检测到。
让我的数据={n:0}
let=proxy({ data:my data })//类似于let vm=new Vue({data: myData})
函数代理({data}/*解构赋值*/) {
let _n=data.n
Object.define属性(data, n ,{//覆盖原来的data.n属性
get(){
return _n
},
set(newValue){
if(newValue0)返回
_n=新值
}
})//改变data{}数据对象本身的属性,通过闭包可以形成上下文,这样原来的实际属性值就存在于闭包的context _n中。
const obj={}
Object.defineProperty(obj, n ,{
get(){
返回数据. n
},
设置(值){
data.n=值
}
})//为data{}数据对象添加一个代理来操作data{}数据对象。
Return obj //obj是数据{}的代理
}
4. Vue的数据响应式
所谓应对,就是当事情发生变化时,会做出相应的反应。
Vue中的数据data有响应。上面提到的Vue使用getter和setter方法,通过Object.defineProperty()函数代理和监控数据。一旦数据发生变化,Vue就会改变数据对应的UI视图,这就是Vue的数据响应性。
但是当Vue使用Object.defineProperty设置监控时,只能对Vue实例化时已经存在于数据对象中的属性设置监控,而不能对不存在或后来添加的属性设置监控。
要解决这个问题,有两种方法:
1.提前声明所有属性。
2.使用Vue.set和this。$set用于添加属性
用Vue.set和this添加属性。$set将通知Vue为在此之后添加的属性设置监听操作。
Vue.set(this.data , m , 10 )
这个。$ set (this。data , m , 10 )//为vm的数据对象添加一个属性。m的值是10
3.阵列变化
对于数组数据的增加,无法控制新数据的数量,所以无法提前声明所有的数据值,一个一个设置太麻烦,而数组是常用的对象数据类型之一。所以vue的作者篡改了push、pop等添加、删除数组的功能。用户在vue中添加和删除数组时仍然使用push和pop,但是额外的处理是在内部完成的。这些被篡改的API会将数据代理添加到数组中,并根据数据响应改变UI视图。
以上是对Vue的数据响应的详细了解。更多关于Vue的数据响应,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。