现在的前端框架 如果没有个数据的双向/单向绑定,都不好意思说是一个新的框架,至于为什么需要这个功能,从jq或者原生js开始做项目的前端工作者,应该是深有体会。

以下也是个人对vue的双向绑定原理的一些浅薄认识,当然 再vue框架的真正实现上,比我分析的要复杂的多。主要是来了解思想

首先看下下面这段主要代码:

let data = {price:5,quantity:2};
let target = null;
// 一个抽象出来的dep类
class Dep {
constructor () {
this.subscribers = []; // 每次调用类时,都会将这个属性更新
}
depend() {
// 当 target存在 并且没有被订阅
if(target && !this.subscribers.includes(target)) {
this.subscribers.push(target);
}
}
// 循环更新被存储的函数/属性
notify() {
this.subscribers.forEach(sub => sub())
} }
// 循环data的所有属性
Object.keys(data).forEach(key => {
let internalValue = data[key];
// 每个属性获得一个依赖实例
const dep = new Dep();
// 对当前data属性描述符 get与set进行数据拦截,进行获取/设置新的data属性值
Object.defineProperty(data,key, { get() {
dep.depend() // 存储一个当前我们需要进行双向数据绑定数据/函数。
return internalValue;
}
set(newValue) {
internalValue = newValue;
dep.notify(); // 重新更新一个存储的函数。
}
}) })
// 一个只有当企图使用数据双向绑定时才会触发的函数。
function watcher(myFunc) {
target = myFunc;
target();
target = null;
} watcher(() => {
data.total = data.price * data.quantity;
})

首先我们来解释一下 我们的vue项目 所有的函数或者是某个被用来做双向数据绑定的值都是绑定在 data 上的,也就是 data.property

1:dep  一个用来进行数据双向绑定的类,

  a: constructor: 绑定属性,每次进来需要相应双向绑定时 都将目标属性进行重置,用来进行之后的操作。

  b: depend: 这个解释为依赖,可以理解为将目标函数(属性 比如data.name),推进一个全局的存储阵列中。

  c: notify:这个可以解释为更新页面被绑定的数据 执行这个函数,可以将重新设置/输入的属性 发生视图上的变化。

2:obeject.defiepropoerty()  这个js api接口是实现当数据发生改变时 拦截数据(属性)的。

该api方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

// 语法:
Object.defineProperty(obj, prop, descriptor)

  obj要在其上定义属性的对象。

  prop要定义或修改的属性的名称。

  descriptor将被定义或修改的属性。

  返回值是:被传递给函数的对象。

 简单的描述:

该方法允许精确添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,能够在属性枚举期间呈现出来(for...in 或 Object.keys方法), 这些属性的值可以被改变,也可以被删除。这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。

如果您能看懂上面的代码运行模式 那么就可以看懂下面的这幅图了,基本思想就是这样。

vue的双向绑定原理解析(vue项目重构二)的更多相关文章

  1. vue的双向绑定原理及实现

    前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图 ...

  2. vue的双向绑定原理浅析与简单实现

    很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. ...

  3. vue数据双向绑定原理

    vue的数据双向绑定的小例子: .html <!DOCTYPE html> <html> <head> <meta charset=utf-> < ...

  4. Vue数据双向绑定原理及简单实现

    嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...

  5. Vue之双向绑定原理动手记

    Vue.js的核心功能有两个:一是响应式的数据绑定系统,二是组件系统.本文是通过学习他人的文章,从而理解了双向绑定原理,从而在自己理解的基础上,自己动手实现数据的双向绑定. 目前几种主流的mvc(vm ...

  6. Vue.js双向绑定原理

    Vue.js最核心的功能有两个,一个是响应式的数据绑定系统,另一个是组件系统.本文仅仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化的代码实现一个简单的hello world示例. 一.访问器属 ...

  7. 探讨vue的双向绑定原理及实现

    1.vue的实现原理 vue的双向绑定是由数据劫持结合发布者-订阅者模式实现的,那么什么是数据劫持?vue是如何进行数据劫持的?说白了就是通过Object.defineProperty()来劫持对象属 ...

  8. 【Vue】vue的双向绑定原理及实现

    vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,我们可以先来看一下通过控制台输出一个定义在vue初始化数据上的对象是个什么东西. 代码: var ...

  9. 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

    最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...

随机推荐

  1. 探测web服务质量方法

  2. AppWidget源码分析---updateAppWidget过程分析

    转[原文] 前面一篇文章,分析了AppWidgetProvider和RemoteView的源码,从中我们可以知道它们的实现原理,AppWidgetProvider是一个BroadcastReceive ...

  3. Activity启动的四种方式

    Activity启动方式有四种,分别是: standardsingleTopsingleTasksingleInstance 可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大 ...

  4. tomcat配置访问图片路径映射到磁盘路径

    首先,我在调试页面的时候发现,图片路径为: /webapps/pic_son/img/1234565456.jpg 但是,tomcat中webapps的文件夹下的pic_son项目中,img文件夹是空 ...

  5. MQ 个人小结

    在PCS项目: talking 发送队列1.1 创建@Beanpublic Queue orderTakingQueue() { return createQueue(orderTakingQueue ...

  6. tyvj 1091 等差数列 dp

    P1091 等差数列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 广东汕头聿怀初中 Train#3 Problem 3 描述 等差数列的定义是一个数列S, ...

  7. Android获取所有应用的资源id和对应的uri

    背景 在某些应用中,为了实现应用apk资源放入重复利用,或者使用反射得到本应用的资源,需要使用反射方式获得,但Resources类中也自带了这种获取方式,并且功能更加强大 你可以获取string,co ...

  8. 栈的基本操作--java实现

    package com.wyl.linklist; /** * 栈的定义及相关操作 * 用数组实现栈 * 栈是一个线性表,不过进栈和出栈操作在表尾操作 * @author wyl * */ publi ...

  9. CentOS下安装mysql及配置使用

    最近一直使用的是CentOS,平时用的最多的数据库是Sql Server,对于mysql还停留在上学的时候,早已忘得一干二净,写这篇内容目的是,重新学习如何安装使用mysql. 一.安装mysql 操 ...

  10. IIS注册.NET

    IIS中ASP.NET的版本号此时可选的有1.1.2.0和4.0三个,如果想让IIS把3个版本都集成上,那NET Framework 3种都要安装,默认安装到的是C 盘. IIS注册方式如下:1.1: ...