一文了解vue中watcher数据双向绑定原理(附代码)

之前的文章《解析vue中observer数据双向绑定原理(代码分享)》中,给大家了解了vue中observer数据双向绑定原理。下面本篇文章给大家了解vue中watcher数据双向绑定原理,一定的参考价值,有需要的朋友可以参考一下。

一文了解vue中watcher数据双向绑定原理(附代码)

vue数据双向绑定原理,和简单的实现,本文将实现mvvm的watcher

微信截图_20210823095546.jpg

1)vue数据双向绑定原理-observer

2)vue数据双向绑定原理-observer

立即学习“前端免费学习笔记(深入)”;

3)vue数据双向绑定原理-observer

vue数据双向绑定原理,和简单的实现,本文将实现mvvm的Watcher

上面的步骤已经实现了监听器,和订阅器,当属性发生改变,发出通知,那么这个通知是通知谁呢,肯定是订阅者watcher.Watcher订阅者作为Observer和Compile之间通信的桥梁,主要做的事情是:

1、在自身实例化时往属性订阅器(dep)里面添加自己

2、自身必须有一个update()方法

3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则释放自己。

// Watcherfunction Watcher(vm, exp, cb) {  this.cb = cb;  this.$vm = vm;  this.exp = exp;  // 此处为了触发属性的getter,从而在dep添加自己,结合Observer更易理解  this.value = this.get(); // 将自己添加到订阅器的操作}Watcher.prototype = {  update: function () {    this.run(); // 属性值变化收到通知  },  run: function () {    var value = this.get(); // 取到最新值    var oldVal = this.value;    if (value !== oldVal) {      this.value = value;      this.cb.call(this.$vm, value, oldVal); // 执行Compile中绑定的回调,更新视图    }  },  get: function () {    Dep.target = this; // 将当前订阅者指向自己, 缓存    var value = this.$vm[this.exp]; // 强制触发监听的getter,添加自己到属性订阅器中    Dep.target = null; // 添加完毕,重置释放    return value;  },};

登录后复制

订阅者要缓存自己,并且告诉监听器,要把我加到订阅器里面去。所以还要改造下监听器

function defineReactive(data, key, val) {  var dep = new Dep()  observe(val); // 监听子属性  Object.defineProperty(data, key, {    ....    get: function() {      // 由于需要在闭包内添加watcher,所以可以在Dep定义一个全局target属性,暂存watcher, 添加完移除      Dep.target && dep.addDep(Dep.target);      return val;    },    ....  });}

登录后复制

实例化Watcher的时候,调用get()方法,通过Dep.target=watcherInstance标记订阅者是当前watcher实例,强行触发属性定义的getter方法,getter方法执行的时候,就会在属性的订阅器dep添加当前watcher实例,从而在属性值有变化的时候watcherInstance就能收到更新通知。

实现MVVM

到这儿先将监听器Observer和监听者Watcher连起来,先模拟一些数据,实现简单的数据绑定

function Vue(data, el, exp) { this.data = data; observe(data); el.innerHTML = this.data[exp]; // 初始化模板数据的值 new Watcher(this, exp, function (value) { el.innerHTML = value; }); return this; } var ele = document.querySelector("#name"); var vue = new Vue( { name: "hello world", }, ele, "name" ); setInterval(function () { vue.data.name = "chuchur " + new Date() * 1; }, 1000);

登录后复制

这可以看到div的和内容初始为hello world,每隔一秒之后变换为chuchur加时间戳,虽然是实现了,但是与想象的还差很多。是vue.name不是vue.data.name,所以这里需要给Vue实例添加一个属性代理的方法,使访问vm的属性代理为访问vm.data的属性,改造后的代码如下:

function Vue(options) {  this.$options = options || {};  this.data = this.$options.data;  // 属性代理,实现 vm.xxx -> vm.data.xxx  var self = this;  Object.keys(this.data).forEach(function(key) {    self.proxy(key); // 绑定代理属性  });  observe(this.data, this);  el.innerHTML = this.data[exp]; // 初始化模板数据的值  new Watcher(this, exp, function(value) {    el.innerHTML = value;  });  return this;}Vue.prototype = {  proxy: function(key) {    var self = this;    Object.defineProperty(this, key, {      enumerable: false,      configurable: true,      get: function proxyGetter() {        return self.data[key];      },      set: function proxySetter(newVal) {        self.data[key] = newVal;      }    });  }}

登录后复制

然后就可以通过vue.name,直接改版模板的数据了,下一步就要实现解析器Complie 

[完]

推荐学习:vue数据双向绑定原理-observer

以上就是一文了解vue中watcher数据双向绑定原理(附代码)的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月13日 05:33:31
下一篇 2025年3月6日 09:17:11

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

相关推荐

  • 浅析vue中complie数据双向绑定原理(代码详解)

    之前的文章《一文了解vue中watcher数据双向绑定原理(附代码)》中,给大家介绍了解了vue中complie数据双向绑定原理。下面本篇文章给大家了解vue中complie数据双向绑定原理,伙伴们过来看看吧。 vue数据双向绑定原理,和简…

    2025年3月13日
    200
  • Uniapp自定义vue导航菜单组件完成菜单动态高亮

            前几日使用uniapp框架写项目, 需要自定义vue导航菜单组件,并且完成菜单动态高亮,简而言之,tab组件内完成点哪哪个发生高亮。【相关推荐:《vue.js教程》】         这里需要使用uniapp scroll-…

    2025年3月13日
    200
  • 深入了解vue中mixins的用法和注意事项

    本篇文章带大家了解一下vue中mixins(混入)特性,介绍一下mixins的使用方法和注意点,希望对大家有所帮助! mixins基础概况 vue中的解释是这样的,如果觉得语言枯燥的可以自行跳过嘿~ 混入 (mixins): 是一种分发 V…

    2025年3月13日 编程技术
    200
  • vue的八大生命周期状态分别是什么

    vue的八大生命周期状态:1、beforeCreate;2、created;3、beforeMount;4、mounted;5、beforeUpdate;6、updated;7、beforeDestroy;8、destroyed。 本教程操…

    2025年3月13日
    200
  • vuejs是什么时候出来的

    vuejs是2013年受到Angular的启发,开发出来的一款轻量框架,最初命名为Seed;2013年12月更名为vue,图标颜色是代表勃勃生机的绿色,版本号是“0.6.0”。2014年1月24日,vue正式对外发布,版本号是“0.8.0”…

    2025年3月13日
    200
  • vue怎么读取文件内容

    vue读取文件内容的方法:1、创建一个test.properties测试内容;2、通过“readTestFile(){const file = this.loadFile(‘test.properties’)&#82…

    2025年3月13日
    200
  • 怎么离线安装vue环境

    离线安装vue环境的方法:1、cmd运行命令“npm config get cache”;2、内网电脑安装nodejs;3、内网全局安装目录;4、内网命令安装离线依赖包;5、把vue项目复制到内网;6、查看全局命令是否正常即可。 本文操作环…

    2025年3月13日 编程技术
    200
  • vue脚手架安装步骤

    vue脚手架安装步骤:1、安装node环境;2、通过“npm install -g vue-cli”安装vue-cli脚手架;3、根据提示选择安装插件;4、安装项目依赖;5、运行“npm run dev”即可。 本文操作环境:windows…

    2025年3月13日 编程技术
    200
  • vue传值方式有哪些

    vue传值方式有:1、prop向下传递,事件向上传递;2、子组件通过$emit触发父组件的自定义事件;3、通过定义公共实例文件来进行非父子组件之间的传值。 本文操作环境:windows7系统、vue2.5.17版,DELL G3电脑。 vu…

    2025年3月13日
    200
  • vue有哪三种传值方式

    vue三种传值方式:1、“父传子”;父组件通过prop给子组件下发数据(传值)。2、“子传父”;子组件通过“事件”给父组件发送消息。3、“非父子传值”;非父子组件之间需要定义个公共的公共实例文件“bus.js”,作为中间仓库来传值。 本教程…

    2025年3月13日
    200

发表回复

登录后才能评论