登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025 年度开源项目评选中
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
什么是双向绑定? 双向绑定的原理? 如何实现双向绑定?
待办的
#IAGA54
陌生人
拥有者
创建于
2024-07-29 16:19
<p><strong>什么是双向绑定?</strong></p><p>我们先从单向绑定切入</p><p>单向绑定非常简单,就是把 Model 绑定到 View,当我们用 JavaScript 代码更新 Model 时,View 就会自动更新</p><p>双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了 View,Model 的数据也自动被更新了,这种情况就是双向绑定</p><p><img src="https://img.bosszhipin.com/beijin/cms/4d266dd67595407d2f5cd2fd8a4c446bceb4162adcce9c8ed358cb008b64ac2adaf0d6be4b15459a86ef4bf2101c104f.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p>当用户填写表单时,View 的状态就被更新了,如果此时可以自动更新 Model 的状态,那就相当于我们把 Model 和 View 做了双向绑定</p><p>关系图如下</p><p><img src="https://img.bosszhipin.com/beijin/cms/cceebbb7eaf2883af5fc0b47f032d6d3ceb4162adcce9c8ed358cb008b64ac2aed0df3c9f90148a09153c350af09985a.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p><strong>双向绑定的原理是什么?</strong></p><p>我们都知道 Vue 是数据双向绑定的框架,双向绑定由三个重要部分构成</p><ul><li>数据层(Model):应用的数据及业务逻辑</li><li>视图层(View):应用的展示效果,各类 UI 组件</li><li>业务逻辑层(ViewModel):框架封装的核心,它负责将数据与视图关联起来</li></ul><p>而上面的这个分层的架构方案,可以用一个专业术语进行称呼:MVVM</p><p>这里的控制层的核心功能便是 “数据双向绑定” 。自然,我们只需弄懂它是什么,便可以进一步了解数据绑定的原理<strong>理解 ViewModel</strong></p><p>它的主要职责就是:</p><ul><li>数据变化后更新视图</li><li>视图变化后更新数据</li></ul><p>当然,它还有两个主要部分组成</p><ul><li>监听器(Observer):对所有数据的属性进行监听</li><li>解析器(Compiler):对每个元素节点的指令进行扫描跟解析,根据指令模板替换数据,以及绑定相应的更新函数</li></ul><p><strong>实现双向绑定</strong></p><p>我们还是以 Vue 为例,先来看看 Vue 中的双向绑定流程是什么的</p><ol><li>new Vue()首先执行初始化,对 data 执行响应化处理,这个过程发生 Observe 中;defineReactive 时为每⼀个 key 创建⼀个 Dep 实例</li><li>同时对模板执行编译,找到其中动态绑定的数据,从 data 中获取并初始化视图,这个过程发生在 Compile 中;初始化视图时读取某个 key,例如 name1,创建⼀个 watcher1</li><li>同时定义⼀个更新函数和 Watcher,将来对应数据变化时 Watcher 会调用更新函数</li><li>由于 data 的某个 key 在⼀个视图中可能出现多次,所以每个 key 都需要⼀个管家 Dep 来管理多个 Watcher;由于触发 name1 的 getter 方法,便将 watcher1 添加到 name1 对应的 Dep 中</li><li>将来 data 中数据⼀旦发生变化,会首先找到对应的 Dep,通知所有 Watcher 执行更新函数;当 name1 更新,setter 触发时,便可通过对应 Dep 通知其管理所有 Watcher 更新</li></ol><p>流程图如下:<img src="https://img.bosszhipin.com/beijin/cms/6c155f92bf101d7f3474c8db1dc5a5f2ceb4162adcce9c8ed358cb008b64ac2a92d08620afbe4bc5b07a8d61e4550181.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p style="text-align: left;"><strong>实现思路</strong></p><ol><li style="text-align: left;">defineReactive 时为每⼀个 key 创建⼀个 Dep 实例</li><li style="text-align: left;">初始化视图时读取某个 key,例如 name1,创建⼀个 watcher1</li><li style="text-align: left;">由于触发 name1 的 getter 方法,便将 watcher1 添加到 name1 对应的 Dep 中</li><li style="text-align: left;">当 name1 更新,setter 触发时,便可通过对应 Dep 通知其管理所有 Watcher 更新</li></ol>
<p><strong>什么是双向绑定?</strong></p><p>我们先从单向绑定切入</p><p>单向绑定非常简单,就是把 Model 绑定到 View,当我们用 JavaScript 代码更新 Model 时,View 就会自动更新</p><p>双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了 View,Model 的数据也自动被更新了,这种情况就是双向绑定</p><p><img src="https://img.bosszhipin.com/beijin/cms/4d266dd67595407d2f5cd2fd8a4c446bceb4162adcce9c8ed358cb008b64ac2adaf0d6be4b15459a86ef4bf2101c104f.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p>当用户填写表单时,View 的状态就被更新了,如果此时可以自动更新 Model 的状态,那就相当于我们把 Model 和 View 做了双向绑定</p><p>关系图如下</p><p><img src="https://img.bosszhipin.com/beijin/cms/cceebbb7eaf2883af5fc0b47f032d6d3ceb4162adcce9c8ed358cb008b64ac2aed0df3c9f90148a09153c350af09985a.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p><strong>双向绑定的原理是什么?</strong></p><p>我们都知道 Vue 是数据双向绑定的框架,双向绑定由三个重要部分构成</p><ul><li>数据层(Model):应用的数据及业务逻辑</li><li>视图层(View):应用的展示效果,各类 UI 组件</li><li>业务逻辑层(ViewModel):框架封装的核心,它负责将数据与视图关联起来</li></ul><p>而上面的这个分层的架构方案,可以用一个专业术语进行称呼:MVVM</p><p>这里的控制层的核心功能便是 “数据双向绑定” 。自然,我们只需弄懂它是什么,便可以进一步了解数据绑定的原理<strong>理解 ViewModel</strong></p><p>它的主要职责就是:</p><ul><li>数据变化后更新视图</li><li>视图变化后更新数据</li></ul><p>当然,它还有两个主要部分组成</p><ul><li>监听器(Observer):对所有数据的属性进行监听</li><li>解析器(Compiler):对每个元素节点的指令进行扫描跟解析,根据指令模板替换数据,以及绑定相应的更新函数</li></ul><p><strong>实现双向绑定</strong></p><p>我们还是以 Vue 为例,先来看看 Vue 中的双向绑定流程是什么的</p><ol><li>new Vue()首先执行初始化,对 data 执行响应化处理,这个过程发生 Observe 中;defineReactive 时为每⼀个 key 创建⼀个 Dep 实例</li><li>同时对模板执行编译,找到其中动态绑定的数据,从 data 中获取并初始化视图,这个过程发生在 Compile 中;初始化视图时读取某个 key,例如 name1,创建⼀个 watcher1</li><li>同时定义⼀个更新函数和 Watcher,将来对应数据变化时 Watcher 会调用更新函数</li><li>由于 data 的某个 key 在⼀个视图中可能出现多次,所以每个 key 都需要⼀个管家 Dep 来管理多个 Watcher;由于触发 name1 的 getter 方法,便将 watcher1 添加到 name1 对应的 Dep 中</li><li>将来 data 中数据⼀旦发生变化,会首先找到对应的 Dep,通知所有 Watcher 执行更新函数;当 name1 更新,setter 触发时,便可通过对应 Dep 通知其管理所有 Watcher 更新</li></ol><p>流程图如下:<img src="https://img.bosszhipin.com/beijin/cms/6c155f92bf101d7f3474c8db1dc5a5f2ceb4162adcce9c8ed358cb008b64ac2a92d08620afbe4bc5b07a8d61e4550181.png?x-oss-process=image/quality,q_60" alt="" data-href="" style="height: auto;"/></p><p style="text-align: left;"><strong>实现思路</strong></p><ol><li style="text-align: left;">defineReactive 时为每⼀个 key 创建⼀个 Dep 实例</li><li style="text-align: left;">初始化视图时读取某个 key,例如 name1,创建⼀个 watcher1</li><li style="text-align: left;">由于触发 name1 的 getter 方法,便将 watcher1 添加到 name1 对应的 Dep 中</li><li style="text-align: left;">当 name1 更新,setter 触发时,便可通过对应 Dep 通知其管理所有 Watcher 更新</li></ol>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Vue
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册