首页 > 其他分享 >数据双向绑定的原理

数据双向绑定的原理

时间:2023-11-16 22:33:05浏览次数:32  
标签:vue dom data 绑定 实例 双向 原理 数据

一、双向绑定的逻辑介绍:

       双向绑定是一步步实现的,现在我们来考虑,在vue中,双向绑定的事情逻辑是什么。首先,要想实现数据双向绑定就要先实现单向绑定,也就是说,就要先实现vue里的data对象中的数据,能够替代写在template模板里的插值表达式中变量名,实现插值表达式获取数据对象的作用。

1、单项绑定——data渲染至插值表达式

       那么vue要做什么呢,vue要做的就是能够发现数据的变化,并把数据的变化通知到对应的dom元素,让对应的dom元素自己更新自己的文本内容。这短短的一句话就是data中的数据能够通过插值表达式渲染在dom元素中的原理。

       要实现上述的短短一句话,需要做哪些事情,我们可以捋一捋。首先第一点:vue能够发现数据的变化,第二点:能够通知到dom元素要更新了,第三点:dom元素接收通知自己更新自己,接下来我们来看,针对这三点如何实现。

①vue能够发现数据的变化

        vue里的数据变化,要么是你对某个数据重新赋值了,然后再对变化的数据取值,假如数据被赋值能够被某个函数发现,那么,vue也就实现了发现数据变化的功能。自然,js中存在这样一个函数——object.defineproperty(),该函数有三个参数,第一个参数是对象,第二个参数是属性,第三个是配置对象,可以给对象的某个属性加上一个配置对象,配置对象中有两个至关重要的参数,就是大家常说的getter和setter,getter会在该对象的属性值被获取时触发,setter会在该对象属性被赋值时触发。

 1 let obj={
 2         name:"xm",
 3         age:18,
 4     }
 5     Object.defineProperty(obj,"name",{
 6         enumerable:true,//允许属性被循环
 7         configurable:true,//允许属性被配置
 8         get(){
 9             console.log("我能够拦截到取obj.name的操作")
10         },
11         set(){
12             console.log("我能够拦截到给obj.name赋值的操作")
13         }
14     })

object.defineproperty()还可以给对象加上一个属性并给该属性加上配置对象

let obj={
        name:"xm",
        age:18,
    }
// 还能够给obj加一个adress属性,并给它添加对应的setter和getter
    Object.defineProperty(obj,"address",{
        enumerable:true,//允许属性被循环
        configurable:true,//允许属性被配置
        get(){
            console.log("我能够拦截到取obj.name的操作")
        },
        set(){
            console.log("我能够拦截到给obj.name赋值的操作")
        }

    })

②能够通知到dom元素要更新

        能够发现数据变化后就应该在发现数据变化后通知dom元素,如何通知呢,在vue实例创建时,数据劫持实现后,要调用一个更新数据方法,这个方法需要自定义,它需要完成以下几件事,第一,能够拿到当前文档的全部dom元素,能够拿到当前vue实例中的data数据,第二能够把dom元素的插值表达式提出来并把data对应的数据替换进去,第三能把替换完成的数据填回dom元素里,让其渲染到页面

要实现第一点:就要将vue实例对象的data和挂载点作为参数传进去,要做到第二点就要用document.querySelect()方法获取dom元素,出于性能的考虑,为了避免频繁的重绘和重排,就要将页面上的dom元素一个个添加到文档碎片中——documentfragment(),在文档碎片中完成数据匹配和替换工作,即写一个正则匹配并提取dom元素的插值表达式,把data中的数据替换进去。做到第三点就要把文档碎片中的数据取出

③dom元素接收通知自己更新自己

就是主动在setter和getter里调用封装好的自定义方法,即可完成更新。

       

vue数据双向绑定的面试回答:

主要用了两个思想来实现,即发布订阅者模式和数据劫持,数据劫持则通过object.defineproperty()方法来实现。

        首先,要实现data中的数据渲染到dom上,就要在vue实例创建时获取其控制的dom区域,将dom区域各元素的文本内容,也就是插值表达式所代表的变量替换为data中的变量,(如果是input输入框的话,则是将input的value替换为data中的变量,这里面可以做一个性能优化,为了避免重绘和重排,可以借助文档碎片documentfragm()来做一个渲染和数据替代的缓冲区,)。为了后续数据变化视图同步变化,要在vue实例创建时给其一个watcher,并将数据替换方法封装为一个cb回调函数保存到新建的watcher实例中,同时再将watcher实例交给dep也就是发布者。这样当创建一个vue实例时,页面里插值表达式或者是input输入框就已经可以正常显示data中的数据了。

       因为无法监听到数据变化,上述完成之后,只能在页面初次渲染时生效,再次刷新时仍旧做不到数据改变视图改变。要做到data数据更改,页面数据的同步变化,就要在vue实例生成时,劫持vue的data中的各项数据,同时在上一步的变量替换保存更新方法时,为了把watcher实例交给dep也就是发布者,会在watcher类调用reduce函数,reduce函数会触发被劫持数据的getter,从而在getter中,添加watcher实例到新建的dep发布者,添加完毕后,在setter中调用dep.notify方法,就可以实现数据变化,视图变化了(notify会循环其所有的watcher实例,调用watcher实例的update方法,进而触发更新dom元素内容的cb回调函数,)到此完成数据单向绑定。   

       input输入框数据变化,data数据变化的效果,则通过事件监听函数来实现。为input输入框添加一个事件监听函数,监听input事件,只要input输入有变化,就获取输入框的value值,将其赋给input绑定的数据对象,至此双向绑定结束。

 

标签:vue,dom,data,绑定,实例,双向,原理,数据
From: https://www.cnblogs.com/zsy1006/p/16972405.html

相关文章

  • 计算机组成原理:一、计算机系统概述
    参考视频:王道计算机考研计算机组成原理_哔哩哔哩_bilibili1.硬件的发展2.硬件的基本组成2.1冯诺依曼结构逻辑结构:特点:指令和数据以同等地位存储在存储器中,可以按照地址寻访。指令由操作码和地址码组成。以运算器为中心。这会带来一个问题:运算器本身是用来计算的......
  • 计算机组成原理之处理器(单周期)
    引言处理器的实现方式决定了时钟周期长度和CPI。实现方式有单周期与流水线,本篇谈谈单周期处理器。目前CPU的频率一般是3GHZ/4GHZ,但是频率是有极限值的,受cycletime影响基本的RISC-V实现存储指令:ld,sd算术逻辑指令:add,sub,and,or条件分支指令:beq实现每条指令的前两个步......
  • 指针网络原理分析
    不明确的地方,请看原文:指针网络一些难理解的关键词combinatorialproblem(组合问题):组合问题的目标是在一组有限集合中找出能够同时满足一组约束的一个满意解,在本文的语境下,是指对于给定的词元输入序列,找出能够满足一组约束的词元输出序列,作为满意解。token(词元)在本文中,词元是......
  • 软件测试/人工智能|一文告诉你ChatGPT原理与架构
    简介ChatGPT是今年最火的互联网应用,ChatGPT给我们的工作和生活带来了巨大便利,帮我们写文案,帮我们写代码等,但是当我们在于ChatGPT对话时,我们是否有想过,这么强大的一个工具,它背后的技术原理是什么?它的技术架构是怎样的?本文就告诉大家ChatGPT的原理与架构。ChatGPT的主要特点OpenAI使......
  • 软件测试/人工智能|一文告诉你ChatGPT原理与架构
    简介ChatGPT是今年最火的互联网应用,ChatGPT给我们的工作和生活带来了巨大便利,帮我们写文案,帮我们写代码等,但是当我们在于ChatGPT对话时,我们是否有想过,这么强大的一个工具,它背后的技术原理是什么?它的技术架构是怎样的?本文就告诉大家ChatGPT的原理与架构。ChatGPT的主要特点Open......
  • Windows任务管理器禁用开机启动项原理
    从win10开始,任务管理器加入了启动项管理。这里主要是针对注册表中和startup文件夹中的启动项进行管理。而通过服务、计算任务的启动项不会在这里显示。 这里禁用的主要原理是:在以下两个位置创建对应的项 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Exp......
  • 交换机原理
    交换机品牌华为、华硕、惠普、思科 什么是交换机交换机将其他网络设备(如交换机、路由器、网络防火墙、无线介入点)和所有终端设备(如计算机、服务器、网络摄像头、网络打印机)连接在一起,实现彼此的通信。交换机是构建局域网络不可或缺的集线设备。作为局域网通信的重要枢纽和......
  • Eureka原理
    学习自:【精选】Eureka原理看这一篇就够了_阿小木的愤怒的博客-CSDN博客1、分布式分布式系统:由多个应用程序协同来完成任务的一种工作模式系统。这里的任务可能是一个下单操作、复杂的统计计算、存储一个超大数据等等。总之这种任务不适合或无法由单个程序独立完成,需要多个程序协......
  • 云电脑运行原理分析
    本文分享自天翼云开发者社区《云电脑运行原理分析》,作者:大利一、虚拟化技术虚拟化技术是云电脑运行的核心技术之一。它可以将物理服务器虚拟化成多个虚拟机,每个虚拟机都拥有独立的操作系统和应用程序运行环境。虚拟机之间相互隔离,互不影响。虚拟化技术可以显著提高服务器的利用......
  • new绑定 ---- new一个对象所作的四件事情 新建一个对象 把this的指向指向这个对象
    下面对this对象的理解,哪些是正确的Athis总是指向函数的直接调用者(而非间接调用者);B如果有new关键字,this指向new出来的那个对象;C在事件中,this总是指向触发这个事件的对象;Dthis是函数运行时自动生成的一个内部对象,只能在函数内部使用;正确答案:B在事件中,this指向触发这个事......