1 文本 最简单的 v-model

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <!--    和 value 变量进行双向绑定(即变化会互相影响)-->
     <input v-model="value"/>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         },
         watch: {
             value: function () {
                 console.log(typeof this.value)
             }
         }
     })
 </script>
 </body>
 </html>

输入啥,就打印啥:

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_Vue

不止是 input ,还可是其他标签。 v-model 指令在表单:

  • <input>
  • <textarea> 
  • <select> 

元素上创建双向数据绑定。它会根据控件类型,自动选取正确方法来更新元素。有点神奇,但本质不过是个语法糖。

它负责监听用户的输入事件以更新数据,并对一些极端场景特殊处理。

v-model 会忽略所有表单元素的 valuecheckedselected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JS 在组件的 data 选项中声明初始值。

对于需要使用输入法(如中文、日文、韩文等)的语言, v-model 不会在输入法组合文字过程中得到更新。若想处理这个过程,用 input 事件。

<script>
     new Vue({
         el: '#app',
         data: {
             message: '',
             checked: false
         }
     })
 
 </script>

2 多行文本

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <!--    和 value 变量进行双向绑定(即变化会互相影响)-->
 <!--    <input v-model="value"/>-->
     <textarea v-model="value" rows="10" cols="50"></textarea>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         }
     })
 </script>
 </body>
 </html>

在文本区域插值 (<textarea></textarea>) 并不会生效,应用 v-model 来代替。

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_html_02

3 复选框

3.1 单个复选框

绑定到布尔值:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <input type="checkbox" v-model="value"></input>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         }
     })
 </script>
 </body>
 </html>

效果:

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_vue.js_03

3.2 多个复选框

绑定到同一个数组:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>TodoList</title>
     <script src='vue.js'></script>
 </head>
 <body>
 
 <div id='example-3'>
     <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
     <label for="jack">Jack</label>
     <input type="checkbox" id="john" value="John" v-model="checkedNames">
     <label for="john">John</label>
     <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
     <label for="mike">Mike</label>
     <br>
     <span>Checked names: {{ checkedNames }}</span>
 </div>
 
 <script>
     new Vue({
         el: '#example-3',
         data: {
             checkedNames: []
         }
     })
 </script>
 </body>
 </html>

效果:

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_html_04

4 单选框

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>TodoList</title>
     <script src='vue.js'></script>
 </head>
 <body>
 
 <div id="example-4">
     <input type="radio" id="one" value="One" v-model="picked">
     <label for="one">One</label>
     <br>
     <input type="radio" id="two" value="Two" v-model="picked">
     <label for="two">Two</label>
     <br>
     <span>Picked: {{ picked }}</span>
 </div>
 
 <script>
     new Vue({
         el: '#example-4',
         data: {
             picked: ''
         }
     })
 </script>
 </body>
 </html>

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_Vue_05

5 选择框

单选时:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>TodoList</title>
     <script src='vue.js'></script>
 </head>
 <body>
 
 <div id="example-5">
     <select v-model="selected">
         <option disabled value="">请选择</option>
         <option>A</option>
         <option>B</option>
         <option>C</option>
     </select>
     <span>Selected: {{ selected }}</span>
 </div>
 
 <script>
     new Vue({
         el: '#example-5',
         data: {
             selected: ''
         }
     })
 </script>
 </body>
 </html>

若 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,推荐像该案例这样,提供一个值为空的禁用选项。

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_vue.js_06

lazy 修饰符

现在希望提高性能,等失去焦点了再把内容完全输出:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <input type="text" v-model.lazy="value"/>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         }
     })
 </script>
 </body>
 </html>

number

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <input type="text" v-model.number="value"/>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         },
         watch: {
             value: function () {
                 console.log(typeof this.value)
             }
         }
     })
 </script>
 </body>
 </html>

输入是字符串时,类型判断没问题:

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_Vue_07

输入数值时,也能识别了:

Vue实战(12)-表单绑定:提升用户体验,轻松实现数据收集_html_08

trim

去除首尾空格:

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Vue中的表单绑定</title>
     <script src="../vue.js"></script>
 </head>
 <body>
 <div id="root">
     <input type="text" v-model.trim="value"/>
     {{value}}
 </div>
 <script>
     new Vue({
         el: "#root",
         data: {
             value: ""
         },
         watch: {
             value: function () {
                 console.log(typeof this.value)
             }
         }
     })
 </script>
 </body>
 </html>