v-model的实现原理

摘要:
v-model将忽略所有表单元素的value、checked和selected属性的初始值,并始终使用Vue实例的数据作为数据源。V-model在内部对不同的输入元素使用不同的属性,并抛出不同的事件:因此,输入内容将在输入时绑定到某事物,该事物的值将被更改//$Event指当前触发的事件对象//$Event.target指当前触发事件对象的dom;

基础用法

  • v-model 本质上不过是语法糖,可以用 v-model 指令在表单 <input><textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。v-model 会忽略所有表单元素的 valuecheckedselected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。

  • v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:

    • text 和 textarea 元素使用 value 属性和 input 事件;
    • checkbox 和 radio 使用 checked 属性和 change 事件;
    • select 字段将 value 作为 prop 并将 change 作为事件。

实现原理

  • v-model只不过是一个语法糖而已,真正的实现靠的还是

    • v-bind:绑定响应式数据

    • 触发oninput 事件并传递数据

  • 举例如下:

    <input v-model="sth" />
    //  等同于
    <input :value="sth" @input="sth = $event.target.value" /> //自html5开始,input每次输入都会触发oninput事件,所以输入时input的内容会绑定到sth中,于是sth的值就被改变;
    //$event 指代当前触发的事件对象;
    //$event.target 指代当前触发的事件对象的dom;
    //$event.target.value 就是当前dom的value值;
    //在@input方法中,value => sth;
    //在:value中,sth => value;
  • v-model是双向绑定,即表单可以拿到vue中的数据,表单中的数据也可以传到vue中
    而v-bind:value 只能是表单拿到vue的数据,vue无法拿到表单的数据
    个人理解,有瑕疵以后补充
  • v-bind

    • 缩写::
    • 预期:any (with argument) | Object (without argument)
    • 参数:attrOrProp (optional)
    • 修饰符:
      • .prop - 被用于绑定 DOM 属性。
      • .camel - (2.1.0+) 将 kebab-case 特性名转换为 camelCase.
      • .sync (2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器。
    • 用法:
      动态地绑定一个或多个特性,或一个组件 prop 到表达式。
      在绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。可以通过下面的教程链接查看详情。
      在绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。
      没有参数时,可以绑定到一个包含键值对的对象。注意此时 class 和 style 绑定不支持数组和对象。

    v-on

    • 缩写:@
    • 预期:Function | Inline Statement | Object
    • 参数:event
    • 修饰符:
      • .stop - 调用 event.stopPropagation()。
      • .prevent - 调用 event.preventDefault()。
      • .capture - 添加事件侦听器时使用 capture 模式。
      • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
      • .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
      • .native - 监听组件根元素的原生事件。
      • .once - 只触发一次回调。
      • .left - (2.2.0) 只当点击鼠标左键时触发。
      • .right - (2.2.0) 只当点击鼠标右键时触发。
      • .middle - (2.2.0) 只当点击鼠标中键时触发。
      • .passive - (2.3.0) 以 { passive: true } 模式添加侦听器
    • 用法:
      绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
      从 2.4.0 开始,v-on 同样支持不带参数绑定一个事件/监听器键值对的对象。注意当使用对象语法时,是不支持任何修饰器的。
      用在普通元素上时,只能监听 原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
      在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event 属性:v-on:click="handle('ok', $event)"
  • Vue.js为两个最为常用的指令提供了特别的缩写:

    v-bind缩写

    <!--完整语法-->
    <a v-bind:href="http://t.zoukankan.com/url">测试</a>
    <!--缩写-->
    <a :href="http://t.zoukankan.com/url">测试</a>

    v-on缩写

    <!--完整语法-->
    <a v-on:click="doSomething">修改</a>
    <!--缩写-->
    <a @click="doSomething">修改</a>

免责声明:文章转载自《v-model的实现原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux/windows 双平台csv文件生成方法大规模请求下,Linux 服务器连接数优化设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

colorUI样式笔记

字体大小 类名 介绍 实际属性 说明 text-xsl 特大号字 font-size: 120rpx; 用于图标、数字等特大显示 text-xs 说明文本 font-size: 20rpx; 说明文本,标签文字等关注度低的文字 text-sl 较大号字 font-size: 80rpx; 用于图标、数字等较大显示 text-xxl 特...

RxJava学习(一)

注意:文字和图片转载自抛物线博客 参考:http://gank.io/post/560e15be2dca930e00da1083 RxJava 到底是什么 一个词:异步。 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs usin...

selenium 定位方式

在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素。其中By类的常用定位方式共八种,现分别介绍如下。 1. By.name() 假设我们要测试的页面源码如下: <button aria-label="Google Search" name="bt...

使用事件和消息队列实现分布式事务(转+补充)

虽然本文并非笔者原创,但是我们在非强依赖的事务中原理上也是采用这种方式处理的,不过因为没有仔细去总结,最近在整理和总结时看到了,故转载并做部分根据我们实际情况的完善和补充。 不同于单一架构应用(Monolith), 分布式环境下, 进行事务操作将变得困难, 因为分布式环境通常会有多个数据源, 只用本地数据库事务难以保证多个数据源数据的一致性. 这种情况下,...

Windows编程系列:Windows中的消息

win32控制台程序 控制台程序整个执行过程是按照代码的顺序依次执行,到main函数的结束,标志着整个程序的退出。 1 int main() 2 { 3 4 return 0; 5 } 整个过程可以描述为以下: Windows应用程序 Windows应用程序会响应来自用户和操作系统的事件。 来自用户的事件包括:鼠标单击,按键,触摸屏手势...

selenium元素定位之多个元素中选择其中的一个

1、xpath匹配到多个元素如何选择指定的元素定位(1)xpath匹配到多个元素,选择指定的元素,通过末尾的数字选择具体的元素 (//span[@id=‘example’])[2] (2)xpath定位到统计标签的最后一个 //span[@id='example']/a[last()] (3)xpath定位同级标签的倒数第二个 //span[@id='ex...