实现双向数据绑定

实现双向数据绑定,第1张

MVVM框架主要包含3个部分: model 、 view 和 viewmodel 。

简单的来说,就是框架的控制器层(这里的控制器层是一个泛指,可以理解为控制view行为和联系model层的中间件)和UI展示层(view层)建立一个双向的数据通道。当这两层中的任何一方发生变化时,另一层将会自动作出相应的变化。

一般来说要实现这种双向数据绑定,在前端我目前了解的有三种形式:

目前angular,regular的实现都是基于脏检查。当发生某些特定的事情的时候,框架会调用相关的digest方法。内部逻辑就是遍历所有的 watcher ,对监控的属性做对比。如果值发生了变化,则执行相应的 handler 。

当系统进入脏检查阶段,遍历所有的 $watch 绑定的 watcher ,然后对比 watcher.get() 与 watcher.last ,如果不同则运行对应的 watcher.fn(newvalue, oldvalue) 。然后再进入下一个watcher的检查。

何时进行脏检查?

由于regularjs是基于脏检查,所以当不是由regularjs本身控制的闷链友 *** 作(如事件、指令)引起的数据 *** 作,可能需要你手动的去同步data与view的数据. $update方法即帮助将你的data同步到view层.

]( https://regularjs.github.io/reference?syntax-zh#bind-once )元素来控制你的观察者数量。

使用ES7中的 Object.observe 方法对对象(或者其属性)进行监蚂槐控观察,一旦其发生唤基变化时,将会执行相应的handler。这是目前监控属性数据变更最完美的一种方法,语言(浏览器)原生支持,没有什么比这个更好了。唯一的遗憾就是目前支持广度还不行,有待全面推广。

vue.js和avalon.js实现数据双向绑定的原理就是属性访问器。

它使用了ES5中的定义标准属性的Object.defineProperty 方法。

Object.defineProperty 使用示例:

首先,vuejs在实例化的过程中,会对遍历传给实例化对象选项中的data 选项,遍历其所有属性并使用 Object.defineProperty 把这些属性全部转为 getter/setter。

同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染。这样就实现了所谓的双向数据绑定。

本小节我们将介绍 Vue 中数据的双向绑定指令v-model 。 v-model的学习相对简单。我们可以用v-model指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

2. 木子解释

用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。— 官方定义

v-model 是 vue 提供的用陪亏来对表单控件做数据双向绑定的指令。它可以根清逗据用户的输入动态改变其绑定的值,同样可以根据绑定值的改变来 *** 作页面 DOM 的更新。

3. 基本用法

接下来我们将详细介绍 v-model 在不同表单答乱卖元素上的使用。

3.1 单行文本 input

实例演示

Document

名称是: {{ name }}

12345678910111213141516171819202122232425

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过 v-model 给输入框 input 和 name 形成双向绑定,当 input 中数据发生改变时 name 也会发生改变。同理,我们在控制台通过 vm.name = "" 给 name 赋值时输入框的内容也会发生改变。

3.2 多行文本 textarea

实例演示

Document

描述是: {{ desc }}

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过 v-model 给输入框 textarea 和 desc 形成双向绑定,当 textarea 中数据发生改变时 desc 也会发生改变。同理,我们在控制台通过vm.desc = ""给 desc 赋值时输入框的内容也会发生改变。

实例演示

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过v-model给单个选择框checkbox和isDelivery形成双向绑定,当checkbox改变选中状态时isDelivery也会发生改变。同理,我们在控制台通过vm.isDelivery = true给isDelivery赋值时checkbox的选中状态也会发生改变。

实例演示

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过 v-model 给多个选择框checkbox和types形成双向绑定,当任意 checkbox 改变选中状态时 types 也会发生改变。同理,我们在控制台通过vm.types = []给types赋值时对应 checkbox 的选中状态也会发生改变。

实例演示

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过 v-model 给单选按钮 radio 和 isFree 形成双向绑定,当 radio 改变选中状态时 isFree 也会发生改变。同理,我们在控制台通过vm.isFree = 0给 isFree 赋值时 radio 的选中状态也会发生改变。

实例演示

"运行案例" 可查看在线运行效果

代码解释: 上述代码,我们通过 v-model 给选择框 select 和 company 形成双向绑定,当 select 改变选项时 company 也会发生改变。同理,我们在控制台通过vm.company = 0给 company 赋值时 select 的选中项也会发生改变。

对于单选按钮、复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值):

但是有时我们可能想把值绑定到 Vue 实例的一个动态属性上,这时可以用 v-bind 实现,并且这个属性的值可以不是字符串。

代码解释: 上述代码中,我们通过 true-value 和 false-value 给 复选框指定来选中和非选中的值,当选中时vm.isDelivery === 'yes' ,当没有选中时vm.isDelivery === 'no'

代码解释: 上述代码中,我们通过 v-bind:value 给 randio 指定选中的值,当 radio 选中时vm.pick === vm.a 。

代码解释: 上述代码中,我们通过v-bind:value给 option 指定 value 值,当 该 option 选中时 vm.selected 的值为{ number: 123 } 。

在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步:

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

本小节我们介绍了 Vue 数据双向绑定 v-model 的使用,主要包括以下知识点:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12491398.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存