vue动态数据绑定2---响应数据变化
来源:互联网 发布:做微商拍小视频软件 编辑:程序博客网 时间:2024/06/16 05:44
在动态数据绑定1的基础上,考虑传递回调函数。在实际应用中,当特定数据发生改变的时候,我们是希望做一些特定的事情的,而不是每一次都只能打印出一些信息。所以,我们需要支持传入回调函数的功能。举个例子。
let app = new Observer({ name: 'yjm', age: 20 }); // 你需要实现 $watch 这个 API app1.$watch('age', function(age) { console.log(`我的年纪变了,现在已经是:${age}岁了`) }); app1.data.age = 100; // 输出:'我的年纪变了,现在已经是100岁了'
要实现上述功能,首先要监听数据的变化,将被监听的数据对象及相应的回调函数放到一个对象events里,当数据变化之后,再从events里拿出被触发的数据对象的回调函数,并触发该回调函数,对数据的变化做出响应。
<script>function Observer(data, events) { this.data = data; // 存放监听事件的回调 this.events = events || {}; this.walk(data, this.events);}// 遍历对象的各个属性,为其添加setter和getterObserver.prototype.walk = function(data, events) { for(var key in data) { if(data.hasOwnProperty(key)){ if(typeof(data[key]) == 'object'){ new Observer(data[key], events) }; this.convert(key, data[key], events); } }}Observer.prototype.convert = function(key, val, events) { var self = this; Object.defineProperty(this.data, key, { enumerable: true, configurable: true, get: function() { console.log('你访问了' + key); return val; }, set: function(newVal) { console.log('你设置了', key, ',新的值为', newVal); if (newVal !== val) { val = newVal; // 触发当前key事件 self.$emit(key, newVal); } // 如果这个newVal是obj,继续递归调用new Observer if (typeof newVal === "object") { return new Observer(newVal, events); } } })}// 将所监听事件及其回调函数添加到events对象Observer.prototype.$watch = function(key, listener) { if(!this.events[key]){ this.events[key] = []; }; this.events[key].push(listener);}// 触发事件,并调用events里的相应事件的回调函数Observer.prototype.$emit = function() { var key = [].shift.call(arguments); var data = [].slice.call(arguments); if(!this.events[key] || this.events[key].length < 1) return; this.events[key].forEach(function(listener){ listener(data || {}) })}let data={ name: "yjm", address: "成都"};let app =new Observer(data);app.$watch('name', function(name){ console.log(`你的名字变了,现在是${name}`);});app.$watch('address', function(address){ console.log(`你的地址改变了,现在是${address}`);});app.data.name = 'jmy';</script>
相较于动态数据绑定1,实现传递回调函数主要是添加了一个事件对象events,将被监听的对象及其回调函数保存到events,在事件对象被触发的时候,调用events里保存的相应的回调函数。实现效果如下:
阅读全文
0 0
- vue动态数据绑定2---响应数据变化
- Vue 动态响应数据变化
- IFE Vue动态数据绑定
- vue动态数据绑定3--深层次数据变化逐层往上传播
- vue动态数据绑定1--如何监听一个对象的变化
- vue.js动态数据绑定学习
- vue中属性动态绑定数据方法
- Vue监听数据变化
- Vue实现双向绑定的原理以及响应式数据
- vue数据绑定
- vue MVVM数据绑定
- Vue.js数据绑定
- vue的数据绑定
- Vue数据绑定
- Vue--数据双向绑定
- vue.js数据绑定
- Vue双向数据绑定
- Vue基础:数据绑定
- RocketMQ(二)——集群部署
- Java通过反射来获取类的私有构造方法和成员方法
- 语法糖
- 特征缩放
- [WUA APIs]UpdateSession
- vue动态数据绑定2---响应数据变化
- 53. Maximum Subarray
- java常用异常类
- [WUA APIs]WebProxy
- Linux下/usr/local/lib 和 /usr/lib 里的内容有什么区别?
- linux(二)------多线程并发服务器
- OpenCL优化方法-Single Work-Item Kernel的良好设计实践
- Menu初级入门
- Kmeans聚类代码实现、作业及优化