官方文档

表单

双向绑定:data 中的属性值变了,input 里的值也变;input 里输入的值改变了,data 里对于的属性值也变
<form> 里面包含 <button>,则按回车键相当于点击了 button

  1. <template>
  2. <div id="app">
  3. <form>
  4. <div>
  5. <input type="text" v-model="message" />
  6. <br /><br />
  7. <button @click.prevent="message = 1">set message to 1</button>
  8. <p>Message is: {{ message }}</p>
  9. </div>
  10. </form>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. data() {
  16. return {
  17. message: "",
  18. };
  19. },
  20. };
  21. </script>
  22. <style lang="scss">
  23. </style>

v-model.png

修饰符

.lazy

v-model 默认在每次 input 事件触发后将输入框的值与数据进行同步, lazy 修饰符改为在 change 事件后进行同步:

  1. <!-- 在“change”时而非“input”时更新 -->
  2. <input v-model.lazy="msg">

.number

将用户输入的值转换为 number 类型,相当于 parseFloat

  1. <input v-model.number="age" type="number">

.trim

删除用户输入值首位的空白字符

  1. <input v-model.trim="msg">

v-model 双向绑定原理

v-model 实际上是 v-bind:value 和 v-on:input 的语法糖
data 属性值改变 -> input 内容改变:v-bind:value
input 内容改变 -> data 属性值改变:v-on:input

  1. <!-- 两者等价 -->
  2. <input type="text" v-model="message" />
  3. <input type="text" :value="message" @input="message = $event.target.value" />

手写 ,与 .sync 原理一样
MyInput.vue:

  1. <template>
  2. <div>
  3. <input :value="value" @input="onInput" />
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: "MyInput",
  9. props: {
  10. value: "",
  11. },
  12. methods: {
  13. onInput(e) {
  14. const event = e.target.value;
  15. this.$emit("input", event);
  16. },
  17. },
  18. };
  19. </script>
  20. <style></style>

使用:

  1. <MyInput type="text" v-model="message" />
  2. <MyInput :value="message" @input="message = $event" />

Ant Design of Vue

文档