本质

数据双向绑定是由 v-model=”数据来源” (data)来实现,其本质是语法糖

适用元素

  • input
  • textarea
  • select
  • checkbox
  • radio

使用 v-model 后会忽略 value check selected 这些属性

例子

  1. const App = {
  2. template: `
  3. <p>
  4. <p>{{ inputText }}</p>
  5. v-model: <input type="text" v-model="inputText" />
  6. input+value: <input type="text" @input="setInputText" :value="inputText" />
  7. </p>
  8. <hr />
  9. <p>
  10. <p>{{ selectedValue }}</p>
  11. <!--
  12. 如果未能匹配到对应的 value 是空项,
  13. IOS 中无法触发 change 事件,用户就没有办法选择第一项,解决方法为增加一个禁用项
  14. -->
  15. v-model:
  16. <select v-model="selectedValue">
  17. <option value="" disable>请选择</option>
  18. <option value="Russia">俄罗斯</option>
  19. <option value="China">中国</option>
  20. <option value="America">美国</option>
  21. </select>
  22. change+value:
  23. <select @change="selectValue" :value="selectedValue">
  24. <option value="" disable>请选择</option>
  25. <option value="Russia">俄罗斯</option>
  26. <option value="China">中国</option>
  27. <option value="America">美国</option>
  28. </select>
  29. </p>
  30. <hr />
  31. <p>
  32. <p>{{ cbChecked }}</p>
  33. v-model: <input type="checkbox" v-model="cbChecked" />
  34. change+value: <input type="checkbox" :checked="cbChecked" @change="setChekcbox" />
  35. </p>
  36. <p>
  37. <p>{{ selectedCountries }}</p>
  38. 俄罗斯: <input type="checkbox" value="Russia“ v-model="selectedCountries" />
  39. 中国: <input type="checkbox" value="China“ v-model="selectedCountries" />
  40. 美国: <input type="checkbox" value="America“ v-model="selectedCountries" />
  41. </p>
  42. <p>
  43. <p>{{ gender }}</p>
  44. 男: <input type="raido" value="male“ v-model="gender" />
  45. 女: <input type="raido" value="female“ v-model="gender" />
  46. </p>
  47. <hr />
  48. <p>
  49. <p>{{ selectedValue }}</p>
  50. <select v-model="selectedVal">
  51. <option value="" disabled>请选择!!!</option>
  52. <options
  53. v-for="country of countries"
  54. :key="country.id"
  55. :value="country.value">
  56. {{ country.info.name}}
  57. </option>
  58. </select>
  59. </p>
  60. <hr />
  61. <p>
  62. <p>{{ Married }}</p>
  63. 婚否:
  64. <input
  65. type=”checkbox
  66. v-model="married"
  67. true-value="married"
  68. false-value="unmarried"
  69. />
  70. </p>
  71. <hr />
  72. <p>
  73. <p>{{ isAgree }}</p>
  74. <input
  75. type=”radio
  76. v-model="isAgree"
  77. :value="isAgreeValue"
  78. />
  79. </p>
  80. <p>
  81. <p>{{ selectedValue2 }}</p>
  82. <select v-model="selectedValue2">
  83. <option value="" disable>请选择</option>
  84. <option :value="{ name: '俄罗斯', continent: 'Euro'}">俄罗斯</option>
  85. <option :value="{ name: '中国', continent: 'Asia'}">中国</option>
  86. <option :value="{ name: '美国', continent: 'North America'}">美国</option>
  87. </select>
  88. </p>
  89. <hr />
  90. <p>
  91. <p>{{ inputText }}</p>
  92. <!-- input + value: 每次输入完成时,数据发生改变 -->
  93. <input type="text" v-model="inputText" />
  94. <!-- change + value: 推动焦点时,数据发生改变 -->
  95. <input type="text" v-model.lazy="inputText" />
  96. </p>
  97. <hr />
  98. <p>
  99. <p>{{ typeof mynumber1 }}</p>
  100. <p>{{ typeof mynumber2 }}</p>
  101. <input type="number" v-model="myNumber1"/>
  102. <!-- 值如果无法被 parseFlot 解析,就返回原始的值 -->
  103. <input type="number" v-model.number="myNumber2"/>
  104. </p>
  105. <hr />
  106. <p>
  107. <p>{{ inputText }}</p>
  108. <!-- input + value: 每次输入完成时,数据发生改变 -->
  109. <input type="text" v-model="inputText" />
  110. <!-- change + value: 推动焦点时,数据发生改变 -->
  111. <input type="text" v-model.lazy="inputText" />
  112. </p>
  113. <hr />
  114. <p>
  115. <p>{{ myText1.length }}</p>
  116. <p>{{ myText2.length }}</p>
  117. <input v-model="myText1"/>
  118. <input v-model.trime="myText2"/>
  119. </p>
  120. `,
  121. data() {
  122. return {
  123. inputText: 'inputText',
  124. selectedValue: 'China',
  125. cbChecked: false,
  126. selectedCountries: [],
  127. gender: 'female',
  128. countries: [
  129. {id: 1, info: { name: '俄罗斯', continent: 'Euro'}, value: 'Russia'},
  130. {id: 2, info: { name: '中国', continent: 'Asia'}, value: 'China'},
  131. {id: 3, info: { name: '美国', continent: 'North America'}, value: 'America'}
  132. ],
  133. Married: 'unmarried',
  134. isAgree: false,
  135. isAgreeValue: '同意',
  136. selectedValue2: '',
  137. mynumber1: 1,
  138. mynumber2: 2,
  139. myText1: '',
  140. myText2: ''
  141. }
  142. },
  143. mehtods: {
  144. setInputText(e) {
  145. this.inputText = e.target.value;
  146. },
  147. selectValue(e) {
  148. this.selectedValue = e.target.value;
  149. },
  150. setChekcbox(e) {
  151. this.cbChekced = e.target.chekced;
  152. }
  153. }
  154. }
  155. Vue.createApp(App).mount('#app');

:::warning 如果未能匹配到对应的 value 是空项,但 IOS 中无法触发 change 事件,用户就没有办法选择第一项,解决方法为增加一个禁用项 :::

model 的修饰符

model.lazy 可以把事件由 input 改为 change
model.number 会类型转为 number
model.trim 会过滤掉首发的空白字符

对于输入法组织文字输出

v-model 是等到输出后才赋值,但如果用 ipnut + value 就不会