• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

竹千代

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Vuejs的$watch实现原理

大概原理如下面代码所示:

class Vue { //Vue对象
    constructor (options) {
      this.$options=options;
      let data = this._data=this.$options.data;
      Object.keys(data).forEach(key=>this._proxy(key));
      // 拿到data之后,我们循环data里的所有属性,都传入代理函数中
      observe(data,this);
    }
    $watch(expOrFn, cb, options){  //监听赋值方法
      new Watcher(this, expOrFn, cb);
      // 传入的是Vue对象
    }

    _proxy(key) { //代理赋值方法
      // 当未开启监听的时候,属性的赋值使用的是代理赋值的方法
      // 而其主要的作用,是当我们访问Vue.a的时候,也就是Vue实例的属性时,我们返回的是Vue.data.a的属性而不是Vue实例上的属性
      var self = this
      Object.defineProperty(self, key, {
        configurable: true,
        enumerable: true,
        get: function proxyGetter () {
          return self._data[key]
          // 返回 Vue实例上data的对应属性值
        },
        set: function proxySetter (val) {
          self._data[key] = val
        }
      })
    }
  }

Watcher的相关实现原理,参见我的另一片博客:  

vuejs的双向绑定实现原理

posted on 2017-09-19 15:51  竹千代  阅读(391)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3