Vuejs响应式原理具体解析

这次给大家带来Vuejs响应式原理具体解析,使用Vuejs响应式原理的注意事项有哪些,下面就是实战案例,一起来看一下。

响应式原理

> vuejs中的模型(model)和视图(view)是保持同步的,在修改数据的时候会自动更新视图,这其实依赖于Object.defineProperty方法,所以vuejs不支持IE8及以下版本,vuejs通过劫持getter/setter方法来监听数据的变化,通过getter进行依赖收集,在数据变更执行setter的时候通知视图更新。

Object.defineProperty

> Object.defineProperty可以定义对象的属性或修改对象的属性
> 目前可以通过 Object.defineProperty描述的属性分为两种:数据属性和访问器属性

// obj: 对象// prop: 对象中的属性// descriptor: 对象中的属性的特性Object.defineProperty(obj,prop,descriptor);

登录后复制

数据属性 > 数据属性的descriptor包含四种:value、writable、enumerable、configurable

var person = {  name: 'json',  age: 18}Object.defineProperty(person, 'name', {  value: 'John',     // 属性的值,默认为undefined  writable: false,    // 是否可以重写属性的值,设为false便是只读的  enumerable: false,   // 是否可枚举(for in或Object.keys),默认为false  configurable: true   // 是否可以删除或者重新设定上述配置,默认为false})person.name = 'new name';console.log(person.name); // 'John'for(key in person) console.log(person[key]);  // 18Object.defineProperty(person, 'name', {  writable: true,      enumerable: true,     configurable: false   })person.name = 'new name';console.log(person.name); // 'new name'for(key in person) console.log(person[key]);  // 'new name',18

登录后复制

访问器属性 > 访问器属性的desciptor包含四种:get、set、enumerable、configurable

var person = { _age: 20 };Object.defineProperty(person, 'age',{  get: function(){    return this._age;  },  set: function(age){    this._age = age < 0 ? 0 : age;  }});person.age = 5;   // _age == 5person.age = -3;  // _age == 0person._age = -3;  // _age == -3

登录后复制

Vuejs劫持数据的做法

function observer(value, cb) {  // 遍历对象的所有属性并为对象添加对应的访问器属性  Object.keys(value).forEach((key) => defineReactive(value, key, value[key] , cb))}function defineReactive (obj, key, val, cb) {  Object.defineProperty(obj, key, {    enumerable: true,    configurable: true,    get: ()=>{      /*....依赖收集等....*/    },    set:newVal=> {      cb();/*订阅者收到消息的回调,这里为render函数,即重新渲染*/    }  })}class Vue {  constructor(options) {    this._data = options.data;    observer(this._data, options.render)  /*把所有数据变成可观察的*/  }}let app = new Vue({  el: '#app',  data: {    text: 'text',    text2: 'text2'  },  render(){    console.log("render");  }})

登录后复制

残留问题 > 上述实现只有通过app._data_text才会触发set,那么怎样才能做到app.text就能触发set呢
代理

> 通过在this对象中添加访问器属性即可实现代理,然后就可以用app.text来代替app._data.text了

_proxy(options.data);/*构造函数中*//*代理*/function _proxy (data) {  const that = this;  Object.keys(data).forEach(key => {    Object.defineProperty(that, key, {      configurable: true,      enumerable: true,      get: function proxyGetter () {        return that._data[key];      },      set: function proxySetter (val) {        that._data[key] = val;      }    })  });}

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

nodejs如何实现微信支付

使用nodejs在微信中调用收货地址

以上就是Vuejs响应式原理具体解析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2772446.html

(0)
上一篇 2025年3月8日 13:17:10
下一篇 2025年2月28日 15:32:37

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS的class、构造函数、工厂函数使用方法

    这次给大家带来JS的class、构造函数、工厂函数使用方法,使用JSclass、构造函数、工厂函数的注意事项有哪些,下面就是实战案例,一起来看一下。 到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立。现…

    编程技术 2025年3月8日
    200
  • JS使用递归实现网页版简洁计算器

    这次给大家带来JS使用递归实现网页版简洁计算器,JS使用递归实现网页版简洁计算器的注意事项有哪些,下面就是实战案例,一起来看一下。 递归实现网页版计算器可以简化代码,设计思路: 1、css+html实现计算器的外观,给每个button绑定n…

    编程技术 2025年3月8日
    200
  • JS怎样让元素沿着抛物线轨迹运动

    这次给大家带来JS怎样让元素沿着抛物线轨迹运动,JS让元素沿着抛物线轨迹运动的注意事项有哪些,下面就是实战案例,一起来看一下。 js实现小球抛物轨迹运动的大致思路: 1、用setInterval()方法,进行间隔性刷新,更新小球位置,以实现…

    编程技术 2025年3月8日
    200
  • vue.js vue-router提升用户体验

    这次给大家带来vue.js vue-router提升用户体验,vue.js vue-router提升用户体验的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 大家都知道对于单页应用,官方提供了vue-router进行路由跳转的处理,…

    编程技术 2025年3月8日
    200
  • JS与ajax同源策略在项目中怎样使用

    这次给大家带来JS与ajax同源策略在项目中怎样使用,JS与ajax同源策略在项目中使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一、回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascri…

    编程技术 2025年3月8日
    200
  • 新手必看的js实现异步方法

    这次给大家带来新手必看的js实现异步方法,新手必看js实现的注意事项有哪些,下面就是实战案例,一起来看一下。 某天突然写了个方法要从后台调用数据,显示在前台页面,但是输出结果总是空undefined,得不到数据。多方找资料才发现,原来是入了…

    编程技术 2025年3月8日
    200
  • js怎么实现隔行变色

    这次给大家带来js怎么实现隔行变色,js实现隔行变色的注意事项有哪些,下面就是实战案例,一起来看一下。 function createTable(){ //创建表格 var table = document.createElement(“t…

    编程技术 2025年3月8日
    200
  • 在angularjs中怎样实现echart图表

    这次给大家带来在angularjs中怎样实现echart图表,在angularjs中实现echart图表的注意事项有哪些,下面就是实战案例,一起来看一下。 ehcart是百度做的数据图表,基于原生js。接口和配置都写的很好很易读,还可以用于…

    编程技术 2025年3月8日
    200
  • node.js实现web终端操作多用户

    这次给大家带来node.js实现web终端操作多用户,node.js实现web终端操作多用户的注意事项有哪些,下面就是实战案例,一起来看一下。 terminal(命令行)作为本地IDE普遍拥有的功能,对项目的git操作以及文件操作有着非常强…

    编程技术 2025年3月8日
    200
  • JS动态规划使用详解

    这次给大家带来JS动态规划使用详解,JS动态规划使用的注意事项有哪些,下面就是实战案例,一起来看一下。 其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了。稍微复杂的,可能会想到…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论