当前位置: 首页 > news >正文

vue2面试题:什么是双向数据绑定

vue2面试题:什么是双向数据绑定

  • 回答思路:1.什么是双向绑定-->2.双向数据绑定的原理-->3.如何实现双向数据绑定
    • 1.什么是双向绑定
    • 2.双向数据绑定的原理
    • 3.如何实现双向数据绑定
      • 来一个构造函数:执行初始化,对data执行响应化处理
      • 编译compile
      • 依赖收集

回答思路:1.什么是双向绑定–>2.双向数据绑定的原理–>3.如何实现双向数据绑定

1.什么是双向绑定

把Model绑定到View上为单向绑定,双向绑定就是在单向绑定的基础上,用户更新了view后model也会随之更新

2.双向数据绑定的原理

Dep:属性订阅器
Observer:监听器(对所有属性进行监听)
Compile:解析器(对每个节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数)
Watcher:观察者(负责建立Vue实例属性与视图之间的联系,在属性值发生变化时更新视图)

vue.js采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,在数据发生变动时发布消息给订阅者,触发相应的监听回调,分为一下几个步骤:
在这里插入图片描述
(1)对需要监听的数据对象进行递归遍历,包括子属性对象的属性,都加上setter、getter,改变其中值就会触发setter,Observer就能监听到了
(2)compile解析模板指令,将模板指令替换成数据,然后初始化渲染页面视图,绑定更新函数,添加订阅者,一旦有数据变化就通知watcher进行更新
(3)watcher是observer和compile的通信桥梁,主要作用:1.自身实例化时往Dep中添加订阅者2.自身必须要有一个update()函数3.等属性变动时Dep会调用dep.notify()通知watcher,watcher调用自身的update()方法进行更新,并触发compile绑定的回调函数

3.如何实现双向数据绑定

来一个构造函数:执行初始化,对data执行响应化处理

class Vue { constructor(options) { this.$options = options; this.$data = options.data; // 对data选项做响应式处理 observe(this.$data); // 代理data到 vm上 proxy(this); // 执行编译new Compile(options.el, this); } 
}

在observer中对data响应化的具体操作:

function observe(obj) { if (typeof obj !== "object" || obj == null) { return; } new Observer(obj); 
} class Observer { constructor(value) { this.value = value; this.walk(value); 
} 
walk(obj) { Object.keys(obj).forEach((key) => { defineReactive(obj, key, obj[key]); }); } 
}

编译compile

对每个元素节点的指令进行扫描和解析,根据指令替换数据,以及绑定相应的更新函数

class Compile { constructor(el, vm) { this.$vm = vm; this.$el = document.querySelector(el); //获取dom if (this.$el) { this.compile(this.$el); } } compile(el) { const childNodes = el.childNodes; Array.from(childNodes).forEach((node) => { // if (this.isElement(node)) { // console.log(" " + node.nodeName); 
} else if (this.isInterpolation(node)) { console.log(" " + node.textContent); // 判断是否为插值文本{{}} } if (node.childNodes && node.childNodes.length > 0) { //判断是否有子元素 this.compile(node); // 对子元素进行递归遍历} 
}); 
} 
isElement(node) { return node.nodeType == 1; 
} 
isInterpolation(node) { return node.nodeType == 3 && /\{\{(.*)\}\}/.test(node.textContent); } 
}

依赖收集

依赖收集,创建Dep实例

function defineReactive(obj, key, val) { this.observe(val); const dep = new Dep(); Object.defineProperty(obj, key, { get() { Dep.target && dep.addDep(Dep.target);// Dep.target 就是Watcher实例 return val; }, set(newVal) { if (newVal === val) return; dep.notify(); // 通知dep执行更新方法 }, 
}); 
}

相关文章:

  • DP活动:HMI-Board以太网数据监视器(一)以太网外设的使用
  • 看完「繁花」我悟了:认真赚钱,终成大佬
  • 图灵日记之java奇妙历险记--异常包装类泛型
  • Abaqus许可分析工具
  • 超清短视频素材库有那些?哪里可以找到超清短视频素材?
  • 数据结构_单链表-1.23
  • 【每日一题】2765. 最长交替子数组-2024.1.23
  • 论文阅读 1| 从仿真域到实验域无监督轴承故障诊断的新型联合传输网络
  • 使用DTS实现TiDB到GaiaDB数据迁移
  • 从0开始学习mysql 第一节:mysql基础查询
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • 【开源】基于JAVA的人事管理系统
  • 国内首个openEuler师训营圆满结营!麒麟信安深化产教融合,助力培养国产操作系统高质量师资人才
  • SPN的重要性 | 保障服务安全和身份验证
  • 鸿蒙5.0发布时间已定!何处寻得移动开发加速器?
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Angular6错误 Service: No provider for Renderer2
  • avalon2.2的VM生成过程
  • ES学习笔记(12)--Symbol
  • Java多线程(4):使用线程池执行定时任务
  • node学习系列之简单文件上传
  • passportjs 源码分析
  • storm drpc实例
  • Vue--数据传输
  • 回顾2016
  • 简析gRPC client 连接管理
  • 理解在java “”i=i++;”所发生的事情
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我与Jetbrains的这些年
  • 函数计算新功能-----支持C#函数
  • # 透过事物看本质的能力怎么培养?
  • ${factoryList }后面有空格不影响
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (附源码)计算机毕业设计高校学生选课系统
  • (剑指Offer)面试题34:丑数
  • (实战篇)如何缓存数据
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net 4.0发布后不能正常显示图片问题
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 代码性能 - (1)
  • .NET4.0并行计算技术基础(1)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @Mapper作用
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @RunWith注解作用
  • [<事务专题>]
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [BZOJ3757] 苹果树
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素