vue数据响应式原理知识点总结

 更新时间:2020年02月16日 08:40:50   作者:SlightFly  
在本篇文章里小编给各位整理的是一篇关于vue数据响应式原理知识点总结,有兴趣的朋友们可以跟着学习下。

vue2.0数据响应式原理

对象

Obect.defineproperty 定义对象的属性mjm

defineproperty 其实不是核心的为一个对象做数据双向绑定,而是去给对象做属性标签,设置一系列操作权限,只不过属性里的get和set实现了响应式

var ob = {
  a: 1,
  b: 2
}
//1-对象 2-属性 3-对于属性的一系列配置
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  writable: false,
  enumerable: false,
  configurable: false
})
ob.a = 3
console.log(Object.getOwnPropertyDescriptor(ob, 'a'))
console.log(ob.a) //1
var ob = {
  a: 1,
  b: 2
}

//1-对象 2-属性 3-对于属性的一系列配置
/**
 * vue双向数据绑定
 * 给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法
 */
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  get: function(){
    console.log('a- get') 
  },
  set: function(){
    console.log('a- set')

  }
})
ob.a = 3
console.log(ob.a) 
//正常用法,,,使用中转,不优雅

var ob = {
  a: 1,
  b: 2
}

//1-对象 2-属性 3-对于属性的一系列配置
/**
 * vue双向数据绑定
 * 给ob的a属性设置get/set方法,则获取ob的a时,会触发get方法,设置ob的a时,会触发set方法
 */
var _value = ob.a //_value 作为一个中转
Object.defineProperty(ob, 'a' , { //a对象则是ob的绝对私有属性,,默认都是true
  get: function(){
    console.log('a- get') 
    return _value;
  },
  set: function(newValue){
    console.log('a- set')
    _value = newValue;
  }
})
ob.a = 3
console.log(ob.a) //get方法必须return ,否则返回undefined

defineProperty 定义的get和set是对象的属性,那么数组怎么办?

  做了个装饰者模式

/**
 * 概述  Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
 *            被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性。
 * 语法  Object.create(proto, [ propertiesObject ])
 */
//数组 -- 做了个装饰者模式
var arraypro = Array.prototype;
var arrob = Object.create(arraypro)
var arr = ['push', 'pop', 'shift']; //枚举这三个,vue中还有其他
arr.forEach((method, index)=>{
  arrob[method] = function(){
    var ret = arraypro[method].apply(this,arguments);
    dep.notify();
  }
})

vue3.0数据响应式原理 - Proxy

Proxy对象用于定义基本操作的自定义行为 ,用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

  和defineProperty类似,功能几乎一样,但是用法不同

为什么要是用Procy?
  1、defineProperty只能监听某个属性,不能对全对象监听
  2、所以可以省去 for in 提升效率
  3、可以监听数组,不用再去单独对数组做特异性操作
改造的observer:

vue.prototype.observer = function(obj){ //注册get/set监听
  var self = this;
  this.$data = new Proxy(this.$data, {
    get: function(target, key, receiver){
      return target[key]
    },
    set: function(target, key, value, receiver){
      // return Reflect.set(target, key, value);
      // return target[key] = value
      target[key] = value;
      self.render();
    }
  })
}

Proxy 用途 -- 校验类型 -- 真正的私有变量

Diff算法和virtua doml

//1-对象 2-属性 3-对于属性的一系列配置

以上就是小编给大家整理的全部相关知识点,感谢大家的学习如果有任何疑问可以联系脚本之家小编。

相关文章

  • 你不知道的SpringBoot与Vue部署解决方案

    你不知道的SpringBoot与Vue部署解决方案

    这篇文章主要介绍了你不知道的SpringBoot与Vue部署解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Vue嵌套iframe时$router.go(-1)后退bug的原因解析

    Vue嵌套iframe时$router.go(-1)后退bug的原因解析

    这篇文章主要介绍了Vue嵌套iframe,$router.go(-1)后退bug的问题原因及解决方法,本文给大家分享问题原因所在及解决方案,需要的朋友可以参考下吧
    2023-09-09
  • Vuex入门之Module使用详解

    Vuex入门之Module使用详解

    这篇文章主要介绍了Vuex入门之Module使用详解,由于使用单一状态树,应用的所有状态会集中到一个比较大的对象,当应用变得非常复杂时,store 对象就有可能变得相当臃肿,需要的朋友可以参考下
    2023-11-11
  • Vue keepalive学习用法及场景分析

    Vue keepalive学习用法及场景分析

    在Vue中,<keep-alive>的include属性用于指定需要缓存的组件,本文给大家介绍Vue keepalive学习用法及场景分析,感兴趣的朋友一起看看吧
    2025-03-03
  • vue路由实现登录拦截

    vue路由实现登录拦截

    这篇文章主要介绍了vue路由如何实现登录拦截,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-03-03
  • vue 使用el-table循环轮播数据列表的实现

    vue 使用el-table循环轮播数据列表的实现

    这篇文章主要介绍了vue 使用el-table循环轮播数据列表的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue3 父控件远程获取数据在子组件上显示不出来的解决方案

    vue3 父控件远程获取数据在子组件上显示不出来的解决方案

    这篇文章主要介绍了vue3 父控件远程获取数据,在子组件上显示不出来,本文给大家分享两种解决方案帮助大家解决这个问题,需要的朋友可以参考下
    2023-08-08
  • Vue使用new Blob()实现不同类型的文件下载功能

    Vue使用new Blob()实现不同类型的文件下载功能

    这篇文章主要给大家介绍了关于Vue使用new Blob()实现不同类型的文件下载功能的相关资料,在Vue项目中,经常用Blob二进制进行文件下载功能,需要的朋友可以参考下
    2023-07-07
  • vue-cli 构建骨架屏的方法示例

    vue-cli 构建骨架屏的方法示例

    这篇文章主要介绍了vue-cli 构建骨架屏的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Vue3中父子传参常见方式及用法

    Vue3中父子传参常见方式及用法

    在 Vue 3 中,父子组件之间进行通信有多种方式,下面简单介绍下常见的方式及其用法和使用场景,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01

最新评论