浅析Vue数据响应式

135 阅读1分钟

1.getter和setter的用法

1)得到姓名

let obj1 = {
姓: "高",
名: "圆圆",
姓名() {
return this.姓 + this.名;
},
age: 18
};
 
console.log(obj1.姓名()); //高圆圆,姓名后面的括号不能删掉,因为它是函数

2)需求二,姓名不要括号也能得出值

let obj2 = {
姓: "高",
名: "圆圆",
get 姓名() {
return this.姓 + this.名;
},
age: 18
};
console.log(obj2.姓名);  // 这时姓名就不是一个函数,而是变成了一个属性,所以就可以不用加括号。

3)需求三:姓名可以被改写

let obj3 = {
姓: "高",
名: "圆圆",
get 姓名() {
return this.姓 + this.名;
},
set 姓名(xxx){
this.姓 = xxx[0]
this.名 = xxx.substring(1)
},
age: 18
};
obj3.姓名 = '高媛媛'
 
console.log(`姓 ${obj3.姓},名 ${obj3.名}`);// “姓 高,名 媛媛”。用= xxx 就可以触发 set 函数,setter必须
接收一个新的值

2.defineProperty

//1.在定义完一个对象之后,想要再添加额外的setter和getter
let _xxx = 0
Object.defineProperty(obj3,'xxx',{
get(){
  return _xxx
},
set(value){
_xxx = value
}
//给obj3添加了一个虚拟属性‘xxx’,
})

// 2.用 Object.defineProperty 定义 n:0
let data1 = {}
Object.defineProperty(data1, 'n', {
  value: 0
})//给data1添加一个n属性,n的值为0.
 
console.log(`需求一:${data1.n}`)

3.数据响应式

  • 响应式的意思是一个物体能对外界的刺激做出反应,例如被打了一下身体会产生痛觉。
  • Vue 数据响应式的意思是:Vue对data一直进行监听和代理,当data中的数据发生改变时,UI页面中的数据也会响应而发生改变。因为Vue对声明的数据(属性)进行了监听和代理,即当数据变化时,Vue会立刻监听到变化,并调用渲染操作。

4.Object.defineProperty(obj3,'n',{...})

defineProperty必须有一个'n'才能代理&监听obj.n,如果忘记写'n'会发生什么?

1)Vue会给出一个警告,且只检查第一层: 92776532463346b9a708cb07301507b9_tplv-k3u1fbpfcp-zoom-1.image c3c3de34422b4be48aab1bd3e0291f0b_tplv-k3u1fbpfcp-zoom-1.image

2)Vue只检查第一层:

new Vue({
data: {
obj: {
a: 0 // obj.a 会被 Vue 监听 & 代理
}
},
template: `
<div>
{{obj.b}}
<button @click="setB">set b</button>
</div>
`,
methods: {
setB() {
this.obj.b = 1; //页面中不会显示b=1,因为Vue只监听a,对b赋值不会有任何反应
}
}
}).$mount("#app");

解决办法:

1:提前把key声明好

data: {
obj: {
a: 0 // obj.a 会被 Vue 监听 & 代理
b:undefined
}
},

2:使用Vue.set或者this.$set

methods: {
    setB() {
      Vue.set(this.obj, "b", 1);
    }
  }

5.Vue.set和this.$set

屏幕截图 2022-03-26 151648.png

6.如何解决data中数组新增key的问题?

//使用Vue中的7个API--push 
new Vue({
  data: {
    array: ["a", "b", "c"]
  },
  template: `
    <div>
      {{array}}
      <button @click="setD">set d</button>
    </div>
  `,
  methods: {
    setD() {
      this.array.push("d");
    }
  }
}).$mount("#app");

7.Vue 中,数组的变异方法有哪 7 个?

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()