温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Vue.js中响应式的原理是什么

发布时间:2021-07-09 11:09:06 来源:亿速云 阅读:137 作者:Leah 栏目:web开发

今天就跟大家聊聊有关Vue.js中响应式的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

关于Vue.js

Vue.js是一款MVVM框架,上手快速简单易用,通过响应式在修改数据的时候更新视图。Vue.js的响应式原理依赖于Object.defineProperty,尤大大在Vue.js文档中就已经提到过,这也是Vue.js不支持E8  以及更低版本浏览器的原因。Vue通过设定对象属性的 setter/getter  方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图。

将数据data变成可观察(observable)的

那么Vue是如何将所有data下面的所有属性变成可观察的(observable)呢?

function observer(value) {     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();/*订阅者收到消息的回调*/         }     }) }  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");     } })

为了便于理解,首先考虑一种最简单的情况,不考虑数组等情况,代码如上所示。在initData中会调用observe这个函数将Vue的数据设置成observable的。当_data数据发生改变的时候就会触发set,对订阅者进行回调(在这里是render)。

那么问题来了,需要对app._date.text操作才会触发set。为了偷懒,我们需要一种方便的方法通过app.text直接设置就能触发set对视图进行重绘。那么就需要用到代理。

代理

我们可以在Vue的构造函数constructor中为data执行一个代理proxy。这样我们就把data上面的属性代理到了vm实例上。

_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;             }         })     }); }

看完上述内容,你们对Vue.js中响应式的原理是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI