美文网首页
Vue 数据响应式

Vue 数据响应式

作者: fanison | 来源:发表于2020-05-14 21:00 被阅读0次

Vue 数据响应式

getter、setter

let obj = {
  姓: "高",
  名: "圆圆",
  姓_名() {
    return this.姓 + this.名;
  },
  get 姓名() {
    return this.姓 + this.名;
  },
  set 姓名(xxx){
    this.姓 = xxx[0]
    this.名 = xxx.slice(1)
  }
};
console.log("需求一:" + obj.姓_名());
console.log("需求二:" + obj.姓名);
obj.姓名 = '高媛媛'
console.log(`需求三:姓 ${obj.姓},名 ${obj.名}`)

Object.defineProperty()

该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
可以给对象添加value属性,添加 getter/setter(用于对属性的读写进行监控)

var _xxx = 0
Object.defineProperty(obj,'xxx',{
  get() {
    return _xxx
  },
  set(v) {
    _xxx = v
  }
})

Object.defineProperty() 存在的问题

1、未定义就使用 Property or method "n" is not defined on the instance but referenced during render

new Vue({
  data: {},
  template: `
    <div>{{n}}</div>
  `
}).$mount("#app");

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; //面中不会显示 1 
      Vue.set( this.obj, 'b' , 1)
      this.$set( this.obj, 'b', 1)
      console.log(Vue.set === this.$set)  //作用相同
    }
  }
}).$mount("#app");

解决措施:Vue.set 或 this.$set

变更方法

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

https://cn.vuejs.org/v2/guide/list.html?#%E5%8F%98%E6%9B%B4%E6%96%B9%E6%B3%95

测试题

<div id="app">
    <span class=span-a>
      {{obj.a}} 
    </span>
    <span class=span-b>
      {{obj.b}}
    </span>
  </div>
var app = new Vue({
  el: '#app',
  data: {
    obj: {
      a: 'a',
    }
  },
})
app.obj.a = 'a2'
app.obj.b = 'b'

最终span-a 中显示a2,span-b 中显示b

span-b 之所以会显示 b,是因为视图在显示 span-a 的 a2 时,顺便更新了 span-b。
因为视图更新其实是异步的。

  1. 当我们让 a 从 'a1' 变成 'a2' 时,Vue 会监听到这个变化,但是 Vue 并不能马上更新视图,因为 Vue 是使用 Object.defineProperty 这样的方式来监听变化的,监听到变化后会创建一个视图更新任务到任务队列里。(文档有写)
  2. 所以在视图更新之前,要先把余下的代码运行完才行,也就是会运行 b = 'b'。
  3. 等到视图更新的时候,由于 Vue 会去做 diff(文档有写),于是 Vue 就会发现 a 和 b 都变了,自然会去更新 span-a 和 span-b。

代理

https://codesandbox.io/s/bold-heyrovsky-8jcm2

相关文章

  • 前端面试题【Day02】

    本篇绪论 1,Vue响应式原理 1,Vue响应式原理 在vue实例中声明的数据就是响应式的。响应式:数据发生改变,...

  • 2020-12-25

    Vue数据响应式 响应式:当一个物体对外界刺激做出反应,就是响应式。例如:我打你一拳你知道躲。 Vue 数据响应式...

  • Vue的响应式浅析

    1 Vue如何实现响应式? Vue的响应式是建立在监听data中的数据. 2 在Vue2中响应式的实现 Vue通过...

  • Vue源码03-响应式原理

    这节将专门讲解vue MVVM响应式处理 Vue采用的是 实现数据的响应式 数据劫持 Observer类 Obse...

  • 学习vue的响应式 mvvm -01 数据响应式

    理解VUE的设计思想:VUE的核心是MVVM MVVM框架的三要素:数据响应式 模板引擎以及渲染 数据响应式:监听...

  • Vue数据响应式

    1.什么是数据响应式 在 Vue 中,当 data 中的数据发生改变时,视图会进行更新,这就是Vue数据响应式的概...

  • 深入理解Vue数据响应式

    Vue数据响应式主要研究的是 Vue 构造选项中 data 属性的特性 深入响应式 官方文档 网址: https:...

  • VUE中数据响应式原理

    1.vue数据响应式的原理2.数据属性的四大特性3.访问器属性4.getter和setter vue数据响应式主要...

  • 双向绑定

    数据响应式原理 vue实现数据响应式的原理就是利用了Object.defineProperty(),重新定义了对象...

  • Vue 数据响应式原理

    前言 Vue.js 的核心包括一套“响应式系统”。 “响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码...

网友评论

      本文标题:Vue 数据响应式

      本文链接:https://www.haomeiwen.com/subject/npvxohtx.html