v-model 指令在表單控件元素上建立雙向數據綁定。它會根據控件類型自動選取正確的方法來更新元素html
v-model 並不關心表單控件初始化所生成的值。由於它會選擇 Vue 實例數據來做爲具體的值。vue
<!--單行--> <!--直接綁定變量,這個變量須要在vue實例裏面的--> <div id="aa"> <input v-model="message" placeholder="edit me"> <p>Message is: {{ message }}</p> </div>
<script src="js/vue.js"></script> //引用vue <script> new Vue({ el: '#aa', //vue實例 data: { message: '' //須要有一個作雙向綁定的變量 } }) </script>
<!--多行textarea,其實相似單行--> <span>Multiline message is:</span> <p style="white-space: pre">{{ message }}</p> <br> <textarea v-model="message" placeholder="add multiple lines"></textarea>
<!--單選,相似單行,不過須要注意的是他們使用同一個v-modal--> <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>
<!--選擇列表,相似單行--> <select v-model="selected"> <option>A</option> <option>B</option> <option>C</option> </select> <span>Selected: {{ selected }}</span>
多選框須要有一個數組存放選項值react
<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>
new Vue({ el: '...', data: { checkedNames: [] //須要有一個數組存放選項值 } })
多選列表chrome
<select v-model="selected" multiple> <option>A</option> <option>B</option> <option>C</option> </select> <br> <span>Selected: {{ selected }}</span>
輸出的話若是不作處理,默認是輸出一個數組,一個選項爲一個數組元素,例如["A","B"]數組
<select v-model="selected"> <!--用v-for遍歷--> <!--v-bind綁定value(這是select元素的value)對應遍歷項的value屬性(這是data數據裏面options數組裏面的屬性value)--> <option v-for="option in options" v-bind:value="option.value"> {{ option.text }} </option> </select> <span>Selected: {{ selected }}</span>
new Vue({ el: '...', data: { selected: 'A', options: [ { text: 'One', value: 'A' }, { text: 'Two', value: 'B' }, { text: 'Three', value: 'C' } ] } }) Selected: A
首先v-for循環是遍歷options數組,每一項是一個對象option,裏面有text和value屬性app
而後將該DOM元素的value值綁定爲option的value值,那麼vue就會使用這個value值做爲每個選項的值(v-model並不關心表單控件初始化所生成的值。由於它會選擇 Vue 實例數據來做爲具體的值)spa
那麼,遍歷輸出了3個選項,每一個選項的value都是option.value,因此實現了生成動態選項的目的,至關於作了映射,經過一個value值雙向綁定
對於單選按鈕,勾選框及選擇列表選項, v-model 綁定的 value 一般是靜態字符串(對於勾選框是邏輯值)即綁定的是html元素的value值code
<!-- 當選中時,`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 實現,而且這個屬性的值能夠不是字符串。server
<div id="ooo"> <!--v-model綁定的是一個toggle變量,這個變量會返回的true或者false(本身設定的,能夠是返回別的)--> <!--分別綁定2個DOM值(動態值)的值爲數據a,b的值--> <input type="checkbox" v-model="toggle" v-bind:true-value="a" v-bind:false-value="b" > </div>
var app2 = new Vue({ el: '#ooo', data: { toggle: '', // 默認設置是'',勾選以後由於會切換到true-value的值,因此結果是true(按順序切換) a: true, b: false } })
//驗證:在chrome dev tools的console //頁面打開初始化 app2.toggle "" //沒勾選 app2.toggle false //已勾選 app2.toggle true
當頁面打開初始化的時候,是空字符串""
當勾選的時候,vue會按順序切換到綁定的值上面,true-value是排在前的,因此會切換到使用這個值,而後這個值對應的是a的true
當沒勾選的時候,vue會切換到false-value,因此是b的false
<div id="ooo"> <select v-model="selected"> <!-- 內聯對象字面量 --> <!--value綁定的是一個數組對象--> <option v-bind:value="{ number: 123 }">123</option> </select> </div>
var app2 = new Vue({ el: '#ooo', data: { selected:[] } })
//初始化的時候 app2.selected [] //當選中的時候,輸出是一個對象,因此須要再次調用對象的屬性才能獲取值 app2.selected Object {__ob__: Observer}__ob__: Observernumber: (...)get number: reactiveGetter()set number: reactiveSetter(newVal)__proto__: Object //當選中的時候 app2.selected.number 123
.lazy
在默認狀況下, v-model 在 input 事件中同步輸入框的值與數據,即輸入內容就會處理內容(除了上述 IME 部分),但你能夠添加一個修飾符 lazy ,從而轉變爲在 change 事件中同步,即輸入完成後纔出發事件處理:
<!-- 在 "change" 而不是 "input" 事件中更新 --> <input v-model.lazy="msg" >
.number
若是想自動將用戶的輸入值轉爲 Number 類型(若是原值的轉換結果爲 NaN 則返回原值),能夠添加一個修飾符 number 給 v-model 來處理輸入值:
<input v-model.number="age" type="number">
.trim
若是要自動過濾用戶輸入的首尾空格,能夠添加 trim 修飾符到 v-model 上過濾輸入:
<input v-model.trim="msg">