vue动态数据绑定3--深层次数据变化逐层往上传播
2017-08-01 21:24
471 查看
基于vue动态数据绑定2,再多考虑一个问题:”深层次数据变化如何逐层往上传播”。举个例子。
为了实现深层次数据变化的向上传播,需要得到被改变的数据的父级并触发相应的回调函数,然后再逐级向上触发每一层级的回调函数。实现代码如下:
在vue数据绑定2的基础上,增加了this.parent、提示。parentKey用于得到相应元素的上级,然后再得到上级的上级… 。
效果如下:
let app = new Observer({ name: { first: 'yy', last: 'jm' }, age: 18 }); app2.$watch('name', function (newName) { console.log('你的姓名发生了变化') }); app.data.name.firstName = 'hahaha'; // 输出:你的姓名发生了变化。
为了实现深层次数据变化的向上传播,需要得到被改变的数据的父级并触发相应的回调函数,然后再逐级向上触发每一层级的回调函数。实现代码如下:
<script> function Observer(data, events, parent, parentKey){ this.data = data; this.events = events || {}; this.parent = parent || {}; this.parentKey = parentKey || ''; this.walk(data, this.events); } Observer.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, key) }; 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的上级,如果有的话 var parent = self.parent; // 保存key的上级的key值 var parentKey = self.parentKey; // 循环寻找上级触发事件 while (parent) { self.$emit(parentKey, newVal); parentKey = parent.parentKey; parent = parent.parent; } //触发当前key事件 self.$emit(key, newVal); } // 如果这个newVal是obj,继续递归调用new Observer if (typeof newVal === "object") { return new Observer(newVal, events, this, key); } } }) } Observer.prototype.$watch = function(key, listener) { if(!this.events[key]){ this.events[key] = []; }; this.events[key].push(listener); } 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 || {}) }) } var data = { user: { name: { first: { y: "y" }, last: "jm" }, age: 18 }, address: "成都" } let app = new Observer(data); app.$watch('user', function() { console.log('你改变了user'); }); app.$watch('name', function(){ console.log('你改变了name'); }); app.$watch('first', function(){ console.log('你改变了first'); }); app.$watch('y', function(y){ console.log(`你改变了y, 现在是${y}`); }); app.$watch('age', function(age){ console.log(`你的age改变了,现在是${age}`); }); app.$watch('address', function(address){ console.log(`你的address改变了,现在是${address}`); }); app.data.user.age = 20; </script>
在vue数据绑定2的基础上,增加了this.parent、提示。parentKey用于得到相应元素的上级,然后再得到上级的上级… 。
效果如下:
相关文章推荐
- vue动态数据绑定1--如何监听一个对象的变化
- vue动态数据绑定2---响应数据变化
- vue.js动态数据绑定学习
- vue.js动态数据绑定学习笔记
- 动态数据绑定之监听对象变化
- Vue实现动态响应数据变化
- vue中属性动态绑定数据方法
- vue里面v-bind和Props 利用props绑定动态数据的方法
- WPF Datagrid Header数据绑定,表头复选框实现全选、全否、部分选中,根据条目动态变化
- Vue 动态响应数据变化
- vue实现动态数据绑定
- vue里面v-bind和Props 利用props绑定动态数据
- vue动态载入变量键值名,实现数据双向绑定
- 第三天(Vue双向数据绑定,computed属性,动态css绑定)
- IFE糯米学院-Vue动态数据绑定(一)
- 初探Vue原理之view-model的数据动态双向绑定
- WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果
- vue-cli2.9.2版本和webpack3.6.0版本在饿了么项目中mock数据的变化
- 利用vue-router的动态路由和路由传值实现同一模板渲染不同数据
- 浅谈vue中数据双向绑定的实现原理