问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vue是怎么将数据绑定到组件的原理

发布网友 发布时间:2022-04-22 07:30

我来回答

3个回答

热心网友 时间:2022-04-06 13:10

vue将数据绑定到组件的原理如下:

1、当实例化一个Vue构造函数,会执行 Vue 的 init 方法,在 init 方法中主要执行三部分内容,一是初始化环境变量,而是处理 Vue 组件数据,三是解析挂载组件。以上三部分内容构成了 Vue 的整个执行过程。

2、Vue 实现了一个 观察者-消费者(订阅者) 模式来实现数据驱动视图。通过设定对象属性的 setter/getter 方法来监听数据的变化,而每个属性的 setter 方法就是一个观察者, 当属性变化将会向订阅者发送消息,从而驱动视图更新。

3、Vue 的订阅者 watcher 实现在 /src/watchr.js 。构建一个 watcher 最重要的是 expOrFn 和 cb 两个参数,cb 是订阅者收到消息后需要执行的回调,一般来说这个回调都是视图指令的更新方法,从而达到视图的更新,但是这也不是必须的,订阅回调也可以是一个和任何无关的纯函数。一个订阅者最重要的是要知道自己订阅了什么,watcher 分析 expOrFn 的 getter 方法,从而间接获得订阅的对象属性。

4、Vue 双向数据绑定实现

数据与视图的绑定与同步,最终体现在对数据的读写处理过程中,也就是 Object.defineProperty() 定义的数据 set、get 函数中。Vue 中对于的函数为 defineReactive,在精简版实现中,我只保留了一些基本特性:

function defineReactive(obj, key, value) {
   var dep = new Dep()
   Object.defineProperty(obj, key, {
       enumerable: true,
       configurable: true,
       get: function reactiveGetter() {
           if (Dep.target) {
               dep.depend()
           }
           return value
       },
       set: function reactiveSetter(newVal) {
           if (value === newVal) {
               return
           } else {
               value = newVal
               dep.notify()
           }
       }
   })
}

在对数据进行读取时,如果当前有 Watcher(对数据的观察者吧,watcher 会负责将获取的新数据发送给视图),那将该 Watcher 绑定到当前的数据上(dep.depend(),dep 关联当前数据和所有的 watcher 的依赖关系),是一个检查并记录依赖的过程。而在对数据进行赋值时,如果数据发生改变,则通知所有的 watcher(借助 dep.notify())。这样,即便是我们手动改变了数据,框架也能够自动将数据同步到视图。

热心网友 时间:2022-04-06 14:28

这里有我参照vue源码实现的简单的数据绑定的代码 网页链接

热心网友 时间:2022-04-06 16:02

目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,来动态修改model和 view,并没有多高深。所以无需太过介怀是实现的单向或双向绑定。
实现数据绑定的做法有大致如下几种:
发布者-订阅者模式(backbone.js)
脏值检查(angular.js)
数据劫持(vue.js)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见好多鱼在水里活蹦乱跳 教你如何将让reaver PIN 进度随意更改精确前四位 求个保存PIN进度的方法 ...不上外接键盘,但鼠标一直有用,谁能告诉我怎么回事,先谢了。。_百度... 相机SD卡,卡上图片电脑显示不出来 相机SD卡用读卡器插到电脑上DCIM文件夹不显示照片怎么解决? win10查询错误日志的方法-win10怎么查询错误日志 电脑系统日志文件如何查看电脑里的系统日志 电脑事件日志在哪里看怎样查看电脑使用的日志 win11系统日志在哪里看 win11系统日志怎么看 松江HJ-1825控制模块,接消防广播怎么接?有没有接... vuedata外面申明的变量模板引擎可以用吗 请问松江HJ-1825控制模块,接消防广播怎么接?有没... 信科的红外线体温枪测量温度的精准度怎么样? 消防控制模块的HJ-1825型输入输出模块 如何让vue中变量作为一个参数传递 一般来说,乐源的红外线体温计质量怎么样? 现实社会中有没有存储私人物品的仓库? 松江云安HJ-1825输入输出模块如何接线? vue中定义一个变量获取table的显示行数 消防电路中1825是什么作用的模块 测体温的红外线体温枪哪个好,打算买个呢? hj一1825输入输出模块报故障怎么查能否拆除模块,红... 一级造价工程师报考专业都有哪些? “神舟七号”载人航天飞行的圆满成功标志着我国成为... vue变量替换为特定值之后总是变成之前的值 一般红外体温枪的质量保障是多久的?是不是也可以... 租用银行保险箱寄存个人物品 额温枪体温枪哪个牌子好? 家里准备装修. 北京哪里可以寄存家具? 松江HJ-1825输出输入模块,接无源反馈,模块巡检灯... 活立的体温枪好不好? vue jsx语法怎样使用变量 1825输入输出气体灭火装置线怎么接 和泰达品牌的体温计和鱼跃体温计质量哪个好呢? 如何更方便的管理vue全局组件 测温枪哪个品牌的比较好?大概多少钱? 松江HJ1825输入输出模块接线图 vue怎么在组件里写methods 请问有好用的质量好的红外线体温计吗? 消防图中的1825是什么意思 70度以及280度常开防火阀的控制模块箱是输入模块还... 下列数据最接近实际的是一支普通水银体温计的质量... vue怎么动态注册组件呢? 松江飞繁1825模块到配电箱强切怎么接线 vue 组件传值,传过来的值不能被渲染,怎么办? HJ-1825的介绍 松江消防主机3208那个怎么接消防应急广播,主机上... 消防控制模块上的返回公共长开反馈各代表什么意思? 火灾报警输入模块hj-1750怎么接线