1. v-model 基本使用

  • 表单空间在实际开发中是非常常见的。特别是对于用户信息的提交,需要大量的表单。
  • Vue 中使用 v-model指令来实现表单元素和数据的双向绑定。
  • 案例解析:
    • 当我们在输入框输入内容时
    • 因为input 中的 v-model绑定了message,所以会实时将输入的内容传递给 message,message发生改变。
    • 当message 发生改变时,因为上面我们使用 Mustache语法,将message的值插入到 DOM中,所以 DOM会发生响应的改变。
    • 所以,通过 v-model 实现了双向的绑定。
  • 当然,我们也可以将 v-model 用于 textarea 元素

GIF.gif

  1. <div id="app">
  2. <input type="text" v-model="message">
  3. <h2>{{message}}</h2>
  4. </div>
  5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  6. <script type="text/javascript">
  7. const app = new Vue({
  8. el: '#app',
  9. data: {
  10. message: '你好'
  11. }
  12. })
  13. </script>

2. v-model 原理

  • v-model 其实是一个语法糖,它的背后本质上是包含两个操作:
    • v-bind绑定一个 value属性
    • v-on 指令给当前元素绑定 input事件(输入框事件监听)
  • 也就是说下面的代码等同:
    1. <input type="text" v-model="message">
    2. <input type="text" v-bind:value="message" v-on:input="message = $event.target.value">

3. v-model: radio

  • HTML radio

    name 属性相同,radio 才能互斥

htmlradio.gif

  1. <label for="male">
  2. <input type="radio" name="gender" id="male" value="男" />
  3. </label>
  4. <label for="female">
  5. <input type="radio" name="gender" id="female" value="女" />
  6. </label>
  • v-model radio

    使用 v-modelname 属性可以不用写

v-modelradio.gif

  1. <div id="app">
  2. <label for="male">
  3. <input type="radio" id="male" value="男" v-model="gender"/>
  4. </label>
  5. <label for="female">
  6. <input type="radio" id="female" value="女" v-model="gender"/>
  7. </label>
  8. <h2>您当前选择的是:{{gender}}</h2>
  9. </div>
  10. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  11. <script type="text/javascript">
  12. const app = new Vue({
  13. el: '#app',
  14. data: {
  15. gender: '男'
  16. }
  17. })
  18. </script>

4. v-model: checkbox

  • 复选框分为两种情况:单个勾选框和多个勾选框
  • 单个勾选框
    • v-model 即为布尔值
    • 此时 input 的value 并不影响 v-model的值
  • 多个复选框
    • 当是多个复选框时,因为可以选中多个,所以对应的 data中属性是一个数组。
    • 当选中某一个时,就会将input 的value 添加到数组中。

单个复选框:同意协议案例
image.png

  1. <div id="app">
  2. <label for="agree">
  3. <input type="checkbox" id="agree" v-model="isAgree"/>同意协议
  4. </label>
  5. <h2>当前选择:{{isAgree}}</h2>
  6. <button type="button" :disabled="!isAgree">下一步</button>
  7. </div>
  8. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  9. <script type="text/javascript">
  10. const app = new Vue({
  11. el: '#app',
  12. data: {
  13. isAgree: false
  14. }
  15. })
  16. </script>

多个复选框:选择爱好案例
image.png

  1. <div id="app">
  2. <label><input type="checkbox" v-model="hobbies" value="篮球" />篮球</label>
  3. <label><input type="checkbox" v-model="hobbies" value="足球" />足球</label>
  4. <label><input type="checkbox" v-model="hobbies" value="乒乓球" />乒乓球</label>
  5. <h2>您选中爱好: {{hobbies}}</h2>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  8. <script type="text/javascript">
  9. const app = new Vue({
  10. el: '#app',
  11. data: {
  12. isAgree: false,
  13. hobbies: []
  14. }
  15. })
  16. </script>

5. v-model: select

  • 和 checkbox一样,select也分单选和多选两种情况。
  • 单选:只能选中一个值
    • v-model 绑定的是一个值
    • 当我们选中 option中的一个时,会将它对应的 value 赋值到 mySelect中
  • 多选:可以选中多个值
    • v-model 绑定的是一个数组
    • 当选中多个值时,就会将选中的 option对应的 value 添加到数组 mySelect 中

单选:选择最喜欢的水果
GIF.gif

  1. <div id="app">
  2. <select v-model="mySelect">
  3. <option disabled value="">请选择</option>
  4. <option value="苹果">苹果</option>
  5. <option value ="橘子">橘子</option>
  6. <option value ="香蕉">香蕉</option>
  7. </select>
  8. <h2>当前选中的是: {{mySelect}}</h2>
  9. </div>
  10. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  11. <script type="text/javascript">
  12. const app = new Vue({
  13. el: '#app',
  14. data: {
  15. mySelect: []
  16. }
  17. })
  18. </script>

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

多选
只需要在 select标签加上 multiple 属性就可实现多选

按住 Ctrl 键进行多选~

  1. <div id="app">
  2. <select v-model="mySelect" multiple>
  3. <option value="苹果">苹果</option>
  4. <option value ="橘子">橘子</option>
  5. <option value ="香蕉">香蕉</option>
  6. </select>
  7. <h2>当前选中的是: {{mySelect}}</h2>
  8. </div>
  9. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  10. <script type="text/javascript">
  11. const app = new Vue({
  12. el: '#app',
  13. data: {
  14. mySelect: []
  15. }
  16. })
  17. </script>

6. 值绑定

  1. <div id="app">
  2. <label v-for="item in originHobbies" :for="item">
  3. <input type="checkbox" v-model="hobbies" :id="item" :value="item" />{{item}}
  4. </label>
  5. <h2>您选中爱好: {{hobbies}}</h2>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  8. <script type="text/javascript">
  9. const app = new Vue({
  10. el: '#app',
  11. data: {
  12. hobbies: [],
  13. originHobbies: ['篮球', '足球', '羽毛球', '乒乓球']
  14. }
  15. })
  16. </script>
  • 通过 originHobbies 自动将数组内容加到 input 里面 进行值绑定

7. 修饰符

  • lazy 修饰符:
    • 默认情况下,v-model 默认是在 input 事件中同步输入框的数据的。
    • 也就是说,一旦有数据发生对应的 data 中的数据就会自动发生改变。
    • lazy 修饰符可以让数据在失去焦点或者回车时才更新。
  • number 修饰符:
    • 默认情况下,在输入框中无论我们输入的是字母还是数字,都会被当做是字符串类型进行处理。
    • 但是如果我们希望处理的是数字类型,那么最好直接将内容当做数字处理。
    • number 修饰符可以在输入框中输入的内容自动转成数字类型
  • trim 修饰符:

    • 如果输入的内容首尾有很多空格,通常我们希望将其去除
    • trim 修饰符可以过滤内容左右两边的空格
  • lazy 代码演示:加上 lazy message内容不会实时进行改变,只有失去焦点或回车才会更新

    1. <input type="text" v-model.lazy="message">

  • number 代码演示

GIF.gif

  1. <div id="app">
  2. <input type="number" v-model="message">
  3. <h2>{{typeof message}}: {{message}}</h2>
  4. </div>
  5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  6. <script type="text/javascript">
  7. const app = new Vue({
  8. el: '#app',
  9. data: {
  10. message: 0
  11. }
  12. })
  13. </script>

一开始显示 number: 0 是因为 input 为 number 类型,而 v-model 默认绑定是 string类型的,所以在进行修改 输入框内容的时候,类型被转为 string。

加上 number 修饰符之后:
GIF.gif

  1. <input type="number" v-model.number="message">
  • trim 代码演示:

使用前 VS 使用后
GIF.gifGIF.gif

  1. <div id="app">
  2. <input type="text" v-model.trim="message">
  3. <h2>--{{message}}--</h2>
  4. </div>
  5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript" charset="utf-8"></script>
  6. <script type="text/javascript">
  7. const app = new Vue({
  8. el: '#app',
  9. data: {
  10. message: ''
  11. }
  12. })
  13. </script>