登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025年度个人数据报告已发布,快来看看你的成长👉
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册