简单谈谈Vue数据响应式的理解?

响应式是一个抽象的概念,并不是一个具体的实例。是指能对外界的刺激做出反应。
Vue中的数据响应式,就是数据改变,UI页面做出响应。
Vue中的data是响应式,当修改Vue实例中的data属性时,UI页面中data会做出响应,
(Vue2)通过使用Object.defineProperty来实现数据响应式。
const vm = new Vue(options) option:({data:myDate})
 
options.data
会被Vue监听,
会被Vue实例代理,
每次对data的读写都会被Vue监控,
Vue会在data变化时更新UI

 

Vue中如何实现数据响应式?
 
1、通过getter和setter修改对象属性是实现数据响应
//修改姓名
let obj = {
  姓: "yang",
  名: "kerry",
  age: 18,
  get 姓名() {
    return this.姓 + this.名;
  },
  set 姓名(xxx) {
    //设置姓名为obj.姓名
    this.姓 = xxx[0];
    this.名 = xxx.substring(1);
  }};
obj3.姓名 = "诸葛亮";
console.log(`姓名:${obj.姓}${obj.名}`);

 

2、定义完成的对象通过Object.defineProperty(obj,prop,descriptor)
 
参数
  • obj:要在其上定义属性的对象。
  • prop:要定义或修改的属性的名称。
  • descriptor:将被定义或修改的属性描述符。
 
返回值
  • 被传递给函数的对象。
let data = {};
data.c = 0;
Object.defineProperty(data, "n", {
  get() {
    return this.c;
  },
  set(value) {
    if (value < 0) return;
    this.c = value;
  }});
 
console.log(data.n);//输出0
data.n=-1
console.log(data.n)//输出0,当n=-1<0data的属性n不变
data.n=1
console.log(data.n)//输出1
 
 
3、给数组添加元素
通过Vue.set(this.array,3,'d')实现数据响应,也可以通过this.array.push('d')实现数据响应
 
import Vue from "vue/dist/vue.js";
 
Vue.config.productionTip = false;
 
new Vue({
  data: {
    array: ["a", "b", "c"]
  },
  template: `
    <div>
      {{array}}
      <button @click="setD">set d</button>
    </div>
  `,
  methods: {
    setD() {
      Vue.set(this.array,3,'d');//可以实现添加d元素
      //this.array[3] = "d"; //请问,页面中会显示 'd' 吗?,不会显示
      //this.array.push('d') 可以添加d元素
    }
  }}).$mount("#app");

 

 
注意:
数组变异方式7个
  • push( )
  • pop( )
  • shift( )
  • unshift( )
  • splice( )
  • sort( )
  • reverse( )
会自动添加监听和代理,this.$set 作用于数组时,并不会自动添加监听和代理。
set 了之后再用 this.array[n] += 1 是否会触发 UI 更新(答案是不会)
 
 
posted @ 2021-02-26 23:55  蛰鸣  阅读(311)  评论(0编辑  收藏  举报