全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Vue数据驱动模拟实现2

一、前言

在随笔“模拟Vue之数据驱动1”结尾处,我们说到如果监听的属性是个对象呢?那么这个对象中的其他属性岂不就是监听不了了吗?

如下:

 

倘若user中的name、age属性变化,如何知道它们变化了呢?

今儿,就来解决这一问题。

通过走读Vue源码,发现他是利用Observer构造函数为每个对象创建一个Observer对象,来监听数据的,如果数据中的属性又是一个对象,那么就又通过Observer来监听嘛。

其实,核心思想就是树的先序遍历(关于树,可参考here)。如我们将上述Demo中的data数据,图形化一下,就更加明白了,如下:

 

好了,理清了大体思路,下面我们就一起来创建一个Observer吧。

二、Observer构造

Observer整体结构如下:

function Observer(data){
 //如若this不是Observer对象,即创建一个
 if(!(this instanceof Observer)){
 return new Observer(data);
 }
 this.data = data;
 this.walk(data); 
}

let p = Observer.prototype = Object.create(null);

p.walk = function(data){
 /*
 TODO:监听data数据中的所有属性,
 并查看data中属性值是否为对象,
 若为对象,就创建一个Observer实例
 */ 
}

p.convert = function(key, val){
 //TODO:通过Object.defineProperty监听数据 
}

好了,下面,我们一起来完成walk以及convert方法吧。

-walk-

首先,我们在walk方法中实现对data对象中的所有属性监听,如下:

p.walk = function(data){
 let keys = Object.keys(data);
 keys.forEach( key => {
 let val = data[key];
 this.convert(key, val);
 });
}

且,由于属性中可能又会是一个对象,那么,我们就有必要监听它们。

怎么办呢?

如果是个对象,再次利用Observer构造函数,处理它不就完了么。

如下:

p.walk = function(data){
 let keys = Object.keys(data);
 keys.forEach( key => {
 let val = data[key];
 //如果val为对象,则交给Observer处理
 if(typeof val === 'object'){
  Observer(val);
 }
 this.convert(key, val);
 });
}

你可能会有这样的疑问,如果直接利用Observer处理对象,那么不就与父对象失去关联了么?

然而并没有,因为JavaScript对于对象是指向地址关系,所以怎么会失去关联呢。

-convert-

对于convert方法,就比较简单了,一如既往就是利用Object.defineProperty监听数据,如下:

p.convert = function(key, val){
 Object.defineProperty(this.data, key, {
 get: ()=>{
  console.log('访问了'+key+' 值为'+val);
  return val;
 },
 set: (newVal)=>{
  console.log('设置了'+key+' 值为'+newVal);
  if(newVal !== val){
  val = newVal;
  }
 }
 });
}

好了,到此,一个简单的Observer就构造完成,下面我们就来测试下,是否成功监听了每个属性。

<script src="./observer.js"></script>
<script>
 let data = {
 user: {
  name: 'Monkey',
  age: 24
 },
 lover: {
  name: 'Dorie',
  age: 23
 }
 };
 Observer(data);
</script>

效果如下:

Perfect,完整代码见github。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Vue  # 数据驱动  # Vue数据驱动表单渲染  # 轻松搞定form表单  # 浅谈vuejs实现数据驱动视图原理  # 详解VueJS 数据驱动和依赖追踪分析  # Vue数据驱动模拟实现5  # Vue数据驱动模拟实现4  # Vue数据驱动模拟实现1  # Vue数据驱动模拟实现3  # 详解Vue数据驱动原理  # 好了  # 创建一个  # 是个  # 就来  # 值为  # 象中  # 是一个  # 这一  # 会有  # 又是  # 他是  # 就有  # 遍历  # 说到  # 不就  # 今儿  # 又会  # 我们一起  # 到此  # 来完成 


相关文章: 专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星如何配置系统实现高效建站?  家具网站制作软件,家具厂怎么跑业务?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  开心动漫网站制作软件下载,十分开心动画为何停播?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  ,网页ppt怎么弄成自己的ppt?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  实例解析angularjs的filter过滤器  如何用美橙互联一键搭建多站合一网站?  内部网站制作流程,如何建立公司内部网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  javascript中的try catch异常捕获机制用法分析  湖北网站制作公司有哪些,湖北清能集团官网?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  黑客入侵网站服务器的常见手法有哪些?  图册素材网站设计制作软件,图册的导出方式有几种?  简单实现Android验证码  郑州企业网站制作公司,郑州招聘网站有哪些?  如何高效配置IIS服务器搭建网站?  北京制作网站的公司,北京铁路集团官方网站?  建站之星安装后如何配置SEO及设计样式?  建站主机选哪家性价比最高?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  如何获取上海专业网站定制建站电话?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  建站主机空间推荐 高性价比配置与快速部署方案解析  如何配置FTP站点权限与安全设置?  如何打造高效商业网站?建站目的决定转化率  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  建站主机如何选?高性价比方案全解析  建站OpenVZ教程与优化策略:配置指南与性能提升  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何在服务器上配置二级域名建站?  如何快速搭建高效服务器建站系统?  如何快速选择适合个人网站的云服务器配置?  制作网站公司那家好,网络公司是做什么的?  如何在腾讯云免费申请建站?  如何快速生成橙子建站落地页链接?  实例解析Array和String方法  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  微信小程序 input输入框控件详解及实例(多种示例)  家庭建站与云服务器建站,如何选择更优?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建支持数据库操作的智能建站平台?  如何快速完成中国万网建站详细流程?  ,制作一个手机app网站要多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。