本质
数据双向绑定是由 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>
<options
v-for="country of countries"
:key="country.id"
:value="country.value">
{{ country.info.name}}
</option>
</select>
</p>
<hr />
<p>
<p>{{ Married }}</p>
婚否:
<input
type=”checkbox“
v-model="married"
true-value="married"
false-value="unmarried"
/>
</p>
<hr />
<p>
<p>{{ isAgree }}</p>
<input
type=”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 就不会