Vue.js 表单控件绑定 v-model
v-model 主要用于input、textarea、select等表单控件元素上创建双向数据绑定,所谓双向绑定就是js中vue实例化的data对象的数据与其渲染的dom元素上的内容保持一致
1、text 文本
|
1
2
3
4
|
<div id="app"> <h1>{{message}}</h1> <input type="text" v-model="message"/></div> |
|
1
2
3
4
5
6
|
new Vue({ el:'#app', data:{ message:'Hello World !' }}) |
查看页面效果,随着文本输入框种的内容发生改变,与Vue实例中data绑定的h1的内容也相应发生改变
2、textarea 多行文本
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--多行文本--><div id="text"> <p>Multiline message is: {{msg}}</p> <textarea v-model="msg"></textarea></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm = new Vue({ el:'#text', data:{ msg:'' } })</script> |
3、checkbox 复选框
(1)、单个勾选框,逻辑值
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--单个勾选框,逻辑值--><div id="app"> <input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{checked}}</label></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm1 = new Vue({ el:'#app', data:{ checked:true } });</script> |
(2)、多个勾选框,绑定到同一个数组
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!--多个勾选框,绑定到同一个数组--><div id="app1"> <input type="checkbox" id="jack" value="jack" v-model="checkNames"> <label for="jack">Jack</label> <input type="checkbox" id="jhon" value="jhon" v-model="checkNames"> <label for="jhon">Jhon</label> <input type="checkbox" id="mike" value="mike" v-model="checkNames"> <label for="mike">Mike</label> <p>Checked Names: {{checkNames}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm1 = new Vue({ el:'#app', data:{ checked:true } });</script> |
4、radio 单选按钮
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!--单选按钮--><div id="app2"> <input type="radio" id="male" value="male" v-model="gender"> <label for="male">Male</label> <input type="radio" id="female" value="female" v-model="gender"> <label for="female">Female</label> <p>Gender: {{gender}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm3 = new Vue({ el:'#app2', data:{ gender:'' } });</script> |
5、select 选择列表
(1)、单选列表
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!--单选列表--><div id="app3"> <select v-model="selected"> <option>A</option> <option>B</option> <option>C</option> </select> <p>Selected: {{selected}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm4 = new Vue({ el:'#app3', data:{ selected:'' } });</script> |
(2)、多选列表,绑定到一个数组
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!--多选列表--><div id="app4"> <select v-model="selected" multiple> <option>A</option> <option>B</option> <option>C</option> </select> <p>Selected: {{selected}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm5 = new Vue({ el:'#app4', data:{ selected:[] }});</script> |
动态选项,用v-for渲染
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<!--动态选项,用v-for渲染--><div id="app5"> <select v-model="selected"> <option v-for="option in options" v-bind:value="option.value">{{option.text}}</option> </select> <p>Selected: {{selected}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm6 = new Vue({ el:'#app5', data:{ selected:'A', options:[ {text:'One', value:'A'}, {text:'Two', value:'B'}, {text:'Three', value:'C'} ] }});</script> |
绑定Value
对于单选按钮,勾选框及选择列表选项,v-model绑定的数据通常是静态字符串(对于勾选框是逻辑值)
|
1
2
3
4
5
6
7
8
9
10
|
<!-- 当选中时,`picked` 为字符串 "a" --><input type="radio" v-model="picked" value="a"><!-- `toggle` 为 true 或 false --><input type="checkbox" v-model="toggle"><!-- 当选中时,`selected` 为字符串 "abc" --><select v-model="selected"> <option value="abc">ABC</option></select> |
但是有时我们想绑定 value 到 Vue 实例的一个动态属性上,这时可以用 v-bind 实现,并且这个属性的值可以不是字符串。
|
1
2
3
4
5
6
7
8
9
|
<!--复选框--><div id="app1"> <input type="checkbox" v-model="toggle" v-bind:true-value="a" v-bind:false-value="b"></div>// 当选中时vm.toggle === vm.a// 当没有选中时vm.toggle === vm.b |
单选按钮
|
1
2
3
|
<input type="radio" v-model="pick" v-bind:value="a">// 当选中时vm.pick === vm.a |
选择列表设置
|
1
2
3
4
5
6
7
8
|
<select v-model="selected"> <!-- 内联对象字面量 --> <option v-bind:value="{ number: 123 }">123</option></select>// 当选中时typeof vm.selected // -> 'object'vm.selected.number // -> 123 |
同时,我们也可以通过 过滤器的方式去监控页面内容变化
|
1
2
3
4
5
6
7
|
<div id="app"> <h1>{{message}}</h1> <input type="text" v-model="message"/> <pre> {{$data|json}} </pre></div> |
修饰符
除了以上用法,v-model指令后面还可以添加多个参数(number、lazy、debounce)
1、number
如果想将用户的输入自动转换为Number类型(如果原始值得转换结果为NaN,则返回原值),则可以添加一个number特性。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<div id="app"> <input type="text" v-model="msg" number><br> {{msg}}</div><script src="js/vue.js"></script><script> new Vue({ el:'#app', data:{ msg:'仅处理number类型的数字' } })</script><!-- 另外一种写法 <div id="app1"> <input v-model.number="age" type="text"> <p>My age is: {{age}}</p></div> --> |
2、lazy
在默认情况下,v-model在input事件中同步输入框的值与数据,我们可以添加一个lazy特性,从而将数据改到在change事件中发生。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<div id="app"> <input type="text" v-model="msg" lazy><br> {{msg}}</div><script src="js/vue.js"></script><script> new Vue({ el:'#app', data:{ msg:'内容是在change事件后才改变的' } })</script> |
我们在input输入框中输入内容,虽然触发了input事件,但是因为加入了lazy属性,msg的值一直没有发生变化。
一直到input输入框发生change事件之后
3、debounce
设置一个最小的延时,在每次敲击之后延时同步输入框的值与数据。如果每次更新都要进行高耗操作(例如:在input中输入内容时要随时发送AJAX请求),那么它较为有用
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<div id="app"> <input type="text" v-model="msg" debounce="5000"><br> {{msg}}</div><script src="js/vue.js"></script><script> new Vue({ el:'#app', data:{ msg:'内容是在5s后才改变的' } }) |
改变input输入框中的内容,msg的值没有马上改变,5s后才发生改变
4、.trim
如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<div id="app1"> <input v-model="msg1" type="text"> <p>The common message is: {{msg1}}</p> <hr> <input v-model.trim="msg2" type="text"> <p>The trim message is: {{msg2}}</p></div><script src="https://unpkg.com/vue/dist/vue.js"></script><script> var vm1 = new Vue({ el:'#app1', data:{ msg1:'', msg2:'' } }) |










浙公网安备 33010602011771号