v-model有什么用

可以在表单<input><textarea><select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。

尽管如此,但v-model实际上是个语法糖,即v-bingv-on:input 的语法糖。等价写法如下:

  1. <template>
  2. <div id="app">
  3. <input type="text"
  4. :value="user.name"
  5. @input="user.name = $event.target.value">
  6. </div>
  7. </template>

其中,:value="user.name" @input="user.name = $event.target.value"> 可以简写成 v-model='user.name'

input组件事例

如:

MyInput.vue

  1. <template>
  2. <div class="wrapper">
  3. <input type="text"
  4. :value="value" @input="onInput">
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'MyInput',
  10. props: {
  11. value: {
  12. type: String,
  13. }
  14. },
  15. methods: {
  16. onInput(e){
  17. const value = e.target.value;
  18. this.$emit('input', value)
  19. }
  20. }
  21. }
  22. </script>
  23. <style>
  24. .wrapper {
  25. border: 1px solid red;
  26. display: inline-block;
  27. }
  28. </style>

使用MyInput.vue组件

  1. <template>
  2. <div id="app">
  3. <form>
  4. 用户名:{{user.name}},
  5. 密码:{{user.password}}
  6. <label>
  7. <span>用户名</span>
  8. <MyInput v-model="user.name"/>
  9. <MyInput :value="user.name" @input="user.name = $event"/>
  10. </label>
  11. <label>
  12. <span>密码</span>
  13. <input type="password" v-model='user.password'>
  14. </label>
  15. </form>
  16. </div>
  17. </template>
  18. <script>
  19. import MyInput from "@/MyInput";
  20. export default {
  21. components: {
  22. MyInput
  23. },
  24. name: 'App',
  25. data(){
  26. return {
  27. user: {
  28. name: '',
  29. password: ''
  30. }
  31. }
  32. }
  33. }
  34. </script>

表单用法

表单总共有:

  • input
  • textarea
  • checkbox
  • radio
  • select
  • from

input输入框(双向绑定)

如:

  1. <template>
  2. <div id="app">
  3. <input v-model="message">
  4. <p>Message is: {{message}}</p>
  5. <p>
  6. <button @click="message = 'ddb'">
  7. set message to ddb
  8. </button>
  9. </p>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. data(){
  16. return {
  17. message: 'hi'
  18. }
  19. }
  20. }
  21. </script>

说明:message先是显示hi,点击按钮后将‘ddb’赋值给message,修改页面上input内的内容,组件中的message属性值跟着变化,修改组件中的message属性值,页面上的内容跟着变化,这就是一个简单的双向绑定。

textarea多行文本

将input标签改为textarea,用法和input一样

checkbox复选框

单个复选框绑定到布尔值

点击后x值为false

  1. <template>
  2. <div id="app">
  3. <label>
  4. <input type="checkbox" v-model="x" />
  5. <span> x: {{ x }}</span>
  6. </label>
  7. <label>
  8. <input type="checkbox" v-model="y" />
  9. <span> y: {{ y }}</span>
  10. </label>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: "App",
  16. data() {
  17. return {
  18. x: "true",
  19. y: "false",
  20. };
  21. },
  22. };
  23. </script>

多个复选框绑定同一个数组

value的值会增加到数组x中

  1. <template>
  2. <div id="app">
  3. <div>爱好:{{x}}</div>
  4. <label>
  5. <input type="checkbox" v-model="x" value="抽烟"/>
  6. <span>抽烟</span>
  7. </label>
  8. <label>
  9. <input type="checkbox" v-model="x" value="喝酒"/>
  10. <span>喝酒</span>
  11. </label>
  12. <label>
  13. <input type="checkbox" v-model="x" value="烫头"/>
  14. <span>烫头</span>
  15. </label>
  16. </div>
  17. </template>
  18. <script>
  19. export default {
  20. name: "App",
  21. data() {
  22. return {
  23. x: []
  24. };
  25. },
  26. };
  27. </script>

radio单选按钮

input的type属性radio,x的值为空,最好加上name属性,表示3个是一组的

  1. <template>
  2. <div id="app">
  3. <div>我想做:{{x}}</div>
  4. <label>
  5. <input type="radio" name="aihc" v-model="x" value="抽烟"/>
  6. <span>抽烟</span>
  7. </label>
  8. <label>
  9. <input type="radio" name="aihc" v-model="x" value="喝酒"/>
  10. <span>喝酒</span>
  11. </label>
  12. <label>
  13. <input type="radio" name="aihc" v-model="x" value="烫头"/>
  14. <span>烫头</span>
  15. </label>
  16. </div>
  17. </template>
  18. <script>
  19. export default {
  20. name: "App",
  21. data() {
  22. return {
  23. x: ''
  24. };
  25. },
  26. };
  27. </script>

select选择框

  1. <template>
  2. <div id="app">
  3. <select v-model="x">
  4. <option disabled value="">请选择</option>
  5. <option>A</option>
  6. <option>B</option>
  7. <option>C</option>
  8. </select>
  9. <span>Selected: {{x}}</span>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: "App",
  15. data() {
  16. return {
  17. x: "",
  18. };
  19. },
  20. };
  21. </script>

from提交元素

  1. <template>
  2. <div id="app">
  3. <form v-on:submit.prevent="onSubmit">
  4. <label>
  5. <span>用户名</span>
  6. <input type="text" v-model="user.name" />
  7. </label>
  8. <label>
  9. <span>密码</span>
  10. <input type="text" v-model="user.password" />
  11. </label>
  12. <button>登录</button>
  13. </form>
  14. </div>
  15. </template>
  16. <script>
  17. export default {
  18. name: "App",
  19. data() {
  20. return {
  21. user: {
  22. name: "",
  23. password: "",
  24. },
  25. };
  26. },
  27. methods: {
  28. onSubmit() {
  29. const {
  30. user: { name, password },
  31. } = this;
  32. console.log(name, password);
  33. },
  34. },
  35. };
  36. </script>

说明:用户名和密码的输入框输入的内容存到data.user 对象中,监听form标签的submit事件,点击登录按钮会触发form标签的submit事件,submit默认刷新事件被阻止了,执行onSubmit函数,打印出用户名和密码。

修饰符

v-model的修饰符有:

  • .lazy
  • .number
  • .trim

.lazy

v-model监听input事件,当页面上的输入框中的内容修改的时候,内存中对应的数据也马上修改了,.lazy 可以让内存中对应的数据在移出input输入框的时候才修改,就变成了监听change事件。

说明:

  • input事件,键盘鼠标任何输入设备都会触发事件。
  • change事件,只在input失去焦点时触发。

.number

只会取到input内容的数字部分

.trim

去除首尾的空白字符