vue-learning:9-template-v-model
表单元素的双向绑定指令v-model
目录
v-model
的基础用法v-model
双向绑定实现的原理v-model
绑定值的输出类型(字符串、数组、布尔值、自定义)v-model
修饰符:.lazy .number .trim
VUE为表单元素交互提供了一个能实现双向数据绑定的指令:v-model
v-model基础用法
<input type="text" v-model="value" />
v-model双向绑定实现的原理
我们先理解下双向绑定中“双向”指的什么?
可以理解为信息在逻辑层和视图层两个方向的互相传递。
ui <=> js
我们前面总结过的指令,都是将逻辑层数据的变化传到视图层更新显示,这是单向数据绑定。比如对于表单的输入框,我们需要向它提供初始值,或通过按钮控制改变它的值。
<div id="example_1">
<input type="number" v-bind:value="value"/>
<button @click="changeValue">按钮加10</button>
<p>{{ value }}</p>
</div>
new Vue({
el: "#example_1",
data: {
value: 0
},
methods: {
changeValue() {
this.value += 10
}
}
})
上面这个例子,逻辑层中的值value
改变了,都会通过v-bind
指令同步到输入框中显示出来。这是逻辑层向视图层的单向传递。但是如果我们直接在输入框中改变值,value
的值并不会显示改变。也就是说在视图层输入框中值的改变没有通知到逻辑层对应的value
改变。
如果要实现这点,我们就需要利用到表单元素自身的事件,如input
输入框元素的input
事件。能监控到输入框内容的改变,从而处理相应的逻辑。对于这个例子,我们需要在input
事件处理函数中将当前输入值赋给value
。利用之前学过的VUE中事件绑定指令v-on
实现:
<div id="example_2">
<input type="number" v-bind:value="value" v-on:input="updateValue" />
<p>{{ value }}</p>
</div>
new Vue({
el: "#example_2",
data: {
value: 0
},
methods: {
updateValue(e) {
this.value = e.target.value
}
}
})
这样就实现了视图层和逻辑层的双向绑定。但是像上面这种写法,一个input
元素要绑定v-bind
指令,同时还要绑定v-on
指令,不够优雅。
所以VUE直接用一个指令v-model
来绑定,替代上面的写法实现同一种功能,这就是v-model
的双向绑定。
<input type="number" v-bind:value="value" v-on:input="updateValue" />
<input type="number" v-model="value" />
上面例子,点击按钮会让逻辑层data中的value值加10,这个改变会同步到视图层,显示在input输入框中。同时,直接在视图层input输入框中输入内容也会使逻辑层中value值改变。这就是v-model
的双向绑定。
具体双向绑定实现的原理,其时很简单,v-model
指令不过是个语法糖而已,v-model
绑定表单元素,会使用该表单元素对应的属性和事件,来实现双向绑定。
但是,VUE内部会智能的根据不同的表单元素,来选用该元素对应的属性和事件来实现v-model
双向绑定,并且绑定的值输出类型也会不同。
- text 和 textarea 元素使用 value 属性和 input 事件,值为字符串文本;
- checkbox 和 radio 使用 checked 属性和 change 事件,checkbox为单个时绑定值为布尔值,多选为数组,radio绑定依value值类型;
- select 字段将 value 作为 prop ,并将 change 作为事件。多选时为数组
v-model绑定值的输出类型(字符串、数组、布尔值、自定义)
点击查看DEMO:v-model
绑定值的输出类型(字符串、数组、布尔值、自定义)
<div id="example_4">
<!-- 当选中时,`picked` 为 `value`的值 -->
<input type="radio" v-model="picked" value="a">
<input type="radio" v-model="picked" value="b">
<span>{{ picked }}</span><br/>
<!-- `toggle`类型为非Array时,会忽略value值,直接赋值为 true 或 false 。但是当为数组时,会将value值添加进去-->
<input type="checkbox" value="1" v-model="toggle">
<span>{{ toggle }}</span><br/>
<!-- `multiChecked`必须为Array类型时才能将值添加到数组,否则为全选true / false -->
<input type="checkbox" value="a" v-model="multiChecked">
<input type="checkbox" value="b" v-model="multiChecked">
<input type="checkbox" value="c" v-model="multiChecked">
<span>{{ multiChecked }}</span><br/>
<!-- -->
<select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option><!-- 当不存在value特性时,会取内容A作为值 -->
<option value="b">B</option>
<option value="c">C</option>
</select>
<span>{{ selected }}</span><br/>
</div>
new Vue({
el: "#example_4",
data: {
picked: '',
toggle: '',
// toggle: [],
multiChecked: [],
// multiChecked: '',
selected: '',
toggle_self: '',
selected_self: '',
}
})
v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值),但是有时我们可能想把值绑定到一个自定义数据或动态数据上,这时可以用 v-bind 实现,并且v-bind绑定的这个属性的值可以不是字符串。
<!-- 自定义输出值,选中后toggle_self为 yes 或 no -->
<input
type="checkbox"
v-model="toggle_self"
true-value="yes"
false-value="no"
>
<span>{{ toggle_self }}</span><br/>
<!-- 自定义输出值,选中后elected_self为对象{number:123} -->
<select v-model="selected_self">
<!-- 内联对象字面量 -->
<option v-bind:value="{ number: 123 }">123</option>
</select>
<span>{{ selected_self }}</span>
<span>{{ selected_self.number }}</span><br/>
v-model修饰符:.lazy .number .trim
.number
v-model
绑定的值一般情况下都是字符串形式,即使input[type="number"]
时。我们可以验证一下:
<!-- 先触发输入框,再点击按钮,发现内容为字符串拼接形式,而不是相加结果 -->
<div id="example_3">
<input type="number" v-model:value="value"/>
<button @click="changeValue">按钮加10</button>
<p>{{ value }}</p>
</div>
new Vue({
el: "#example_3",
data: {
value: 0
},
methods: {
changeValue() {
this.value += 10
}
}
})
210101010
如果要实现点击按钮是数值相加结果,我们可以在按钮事件处理函数中对value
类型进行处理,如:
this.value = Number(this.value) + 10
this.value = this.value * 1 + 10
但是Vue提供了更为简单的方法,使用.number
修饰符
<input type="number" v-model:value.number="value"/>
.lazy
在默认情况下,v-model
在每次 input
事件触发后将输入框的值与数据进行同步,表现为实时触发。你可以添加 .lazy
修饰符,从而转变为使用 change
事件进行同步,表现为输入框失去焦点后触发。
<!-- 在“change”时而非“input”时更新 -->
<input type="number" v-model:value.lazy="value_lazy"/>
oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。
.trim
对于input
或textarea
表单元素,如果要自动过滤用户输入的首尾空白字符,可以给 v-model
添加 trim
修饰符。
<input type="text" v-model:value.trim="value_trim"/>
vue-learning:9-template-v-model的更多相关文章
- vue报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
在.vue文件中引入了 element-ui 的 table 和 pagination 组件后,报错:Component template should contain exactly one roo ...
- 小白学习VUE第二课:环境搭建 VUE Node.js VSCode template模板
环境搭建 VUE Node.js VSCode template模板: 首先安装node:http://www.runoob.com/nodejs/nodejs-install-setup.html ...
- Vue.js:轻量高效的前端组件化方案
转发一篇尤老师对vue.js的介绍,了解vue.js的来龙去脉.不过现在已经是2.0了,也有添加一些新的东西,当然有些东西也改了. Vue.js:轻量高效的前端组件化方案 Vue.js 是我在2014 ...
- Vue系列:如何将百度地图包装成Vue的组件
主要分解为如下步骤: (1)在html文件中引入百度地图, <script type="text/javascript" src="http://api.map.b ...
- Vue.js:轻量高效的前端组件化方案(转载)
摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...
- 【转】Vue.js:轻量高效的前端组件化方案
摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...
- Deep learning:五十一(CNN的反向求导及练习)
前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- 转载 Deep learning:六(regularized logistic回归练习)
前言: 在上一讲Deep learning:五(regularized线性回归练习)中已经介绍了regularization项在线性回归问题中的应用,这节主要是练习regularization项在lo ...
- 组件嵌套时报:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
在组件嵌套的过程中,报了一个错误: 这里报错的原因是:vue的组件(模板)只能有一个根节点,即.vue文件中的<template>标签下只能有一个子元素. 因此,建议大家在写.vue组件的 ...
随机推荐
- compass与css sprite(雪碧图)
什么是css sprite? css sprite,中文叫雪碧图,也有人喊CSS精灵,就是一种背景拼合的技术,然后通过background-position来显示雪碧图中需要显示的图像. MDN相关链 ...
- linux CentOs 7.4 64位 系统下 nuxt部署 、nginx 安装、node环境及软连接,pm2软连接
一.nginx安装 1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2 ...
- oracle一些常见的问题
对于权限审计和大部分语句,by session无效,无论指定by session/by access还是不指定,审计都自动为by access. 审计的语句级可以指定ALL,但是ALL只包括大部分语句 ...
- TIJ——Chapter Six:Access Control
package:the library unit The levels of access control from "most access" to "least ac ...
- Quick BI独创千人千面的行级权限管控机制
摘要 就数据访问权限而言,阿里巴巴以“被动式授权”为主,你需要什么权限就申请什么权限.但是,在客户交流过程中,我们发现绝大多数企业都是集中式授权,尤其是面向个人的行级权限管控,管理复杂度往往呈几何增长 ...
- 从入侵到变现——“黑洞”下的黑帽SEO分析
概述 由于互联网入口流量主要被搜索引擎占据,网站在搜索引擎中的排名直接影响到市场营销效果,因此SEO服务应运而生.SEO(Search Engine Optimization)全称为搜索引擎优化,是指 ...
- ES6对象的super关键字
super是es6新出的关键字,它既可以当作函数使用,也可以当作对象使用,两种使用方法不尽相同 1.super用作函数使用的时候,代表父类的构造函数,es6规定在子类中使用this之前必须先执行一次s ...
- 2019-8-31-dotnet-通过-WMI-拿到显卡信息
title author date CreateTime categories dotnet 通过 WMI 拿到显卡信息 lindexi 2019-08-31 16:55:58 +0800 2019- ...
- Logtail提升采集性能
默认性能限制 为防止滥用消耗过多机器资源,我们对默认安装的Logtail进行了一系列的资源限制.默认安装的Logtail最多日志采集速度为20M/s,20个并发发送. 其他资源限制请参考:启动参数 h ...
- Simpson公式的应用(HDU 1724/ HDU 1071)
辛普森积分法 - 维基百科,自由的百科全书 Simpson's rule - Wikipedia, the free encyclopedia 利用这个公式,用二分的方法来计算积分. 1071 ( T ...