本质
数据双向绑定是由 v-model=”数据来源” (data)来实现,其本质是语法糖
适用元素
- input
- textarea
- select
- checkbox
- radio
使用 v-model 后会忽略 value check selected 这些属性
例子
const App = {template: `<p><p>{{ inputText }}</p>v-model: <input type="text" v-model="inputText" />input+value: <input type="text" @input="setInputText" :value="inputText" /></p><hr /><p><p>{{ selectedValue }}</p><!--如果未能匹配到对应的 value 是空项,但 IOS 中无法触发 change 事件,用户就没有办法选择第一项,解决方法为增加一个禁用项-->v-model:<select v-model="selectedValue"><option value="" disable>请选择</option><option value="Russia">俄罗斯</option><option value="China">中国</option><option value="America">美国</option></select>change+value:<select @change="selectValue" :value="selectedValue"><option value="" disable>请选择</option><option value="Russia">俄罗斯</option><option value="China">中国</option><option value="America">美国</option></select></p><hr /><p><p>{{ cbChecked }}</p>v-model: <input type="checkbox" v-model="cbChecked" />change+value: <input type="checkbox" :checked="cbChecked" @change="setChekcbox" /></p><p><p>{{ selectedCountries }}</p>俄罗斯: <input type="checkbox" value="Russia“ v-model="selectedCountries" />中国: <input type="checkbox" value="China“ v-model="selectedCountries" />美国: <input type="checkbox" value="America“ v-model="selectedCountries" /></p><p><p>{{ gender }}</p>男: <input type="raido" value="male“ v-model="gender" />女: <input type="raido" value="female“ v-model="gender" /></p><hr /><p><p>{{ selectedValue }}</p><select v-model="selectedVal"><option value="" disabled>请选择!!!</option><optionsv-for="country of countries":key="country.id":value="country.value">{{ country.info.name}}</option></select></p><hr /><p><p>{{ Married }}</p>婚否:<inputtype=”checkbox“v-model="married"true-value="married"false-value="unmarried"/></p><hr /><p><p>{{ isAgree }}</p><inputtype=”radio“v-model="isAgree":value="isAgreeValue"/></p><p><p>{{ selectedValue2 }}</p><select v-model="selectedValue2"><option value="" disable>请选择</option><option :value="{ name: '俄罗斯', continent: 'Euro'}">俄罗斯</option><option :value="{ name: '中国', continent: 'Asia'}">中国</option><option :value="{ name: '美国', continent: 'North America'}">美国</option></select></p><hr /><p><p>{{ inputText }}</p><!-- input + value: 每次输入完成时,数据发生改变 --><input type="text" v-model="inputText" /><!-- change + value: 推动焦点时,数据发生改变 --><input type="text" v-model.lazy="inputText" /></p><hr /><p><p>{{ typeof mynumber1 }}</p><p>{{ typeof mynumber2 }}</p><input type="number" v-model="myNumber1"/><!-- 值如果无法被 parseFlot 解析,就返回原始的值 --><input type="number" v-model.number="myNumber2"/></p><hr /><p><p>{{ inputText }}</p><!-- input + value: 每次输入完成时,数据发生改变 --><input type="text" v-model="inputText" /><!-- change + value: 推动焦点时,数据发生改变 --><input type="text" v-model.lazy="inputText" /></p><hr /><p><p>{{ myText1.length }}</p><p>{{ myText2.length }}</p><input v-model="myText1"/><input v-model.trime="myText2"/></p>`,data() {return {inputText: 'inputText',selectedValue: 'China',cbChecked: false,selectedCountries: [],gender: 'female',countries: [{id: 1, info: { name: '俄罗斯', continent: 'Euro'}, value: 'Russia'},{id: 2, info: { name: '中国', continent: 'Asia'}, value: 'China'},{id: 3, info: { name: '美国', continent: 'North America'}, value: 'America'}],Married: 'unmarried',isAgree: false,isAgreeValue: '同意',selectedValue2: '',mynumber1: 1,mynumber2: 2,myText1: '',myText2: ''}},mehtods: {setInputText(e) {this.inputText = e.target.value;},selectValue(e) {this.selectedValue = e.target.value;},setChekcbox(e) {this.cbChekced = e.target.chekced;}}}Vue.createApp(App).mount('#app');
:::warning 如果未能匹配到对应的 value 是空项,但 IOS 中无法触发 change 事件,用户就没有办法选择第一项,解决方法为增加一个禁用项 :::
model 的修饰符
model.lazy 可以把事件由 input 改为 change
model.number 会类型转为 number
model.trim 会过滤掉首发的空白字符
对于输入法组织文字输出
v-model 是等到输出后才赋值,但如果用 ipnut + value 就不会
