双向绑定和v-model

v-model是一个实现双向绑定的指令,常用于<input>、<select>、<textarea>和组件。它实际上是v-bind和v-on的组合。本文详细介绍了v-model的使用,包括在组件上的应用,以及如何通过props接收value并派发input事件来实现父子组件间的双向数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v-model的简介

v-model是一个指令,限制在<input>、<select>、<textarea>、components中使用,实现数据-视图、视图-数据的双向绑定。

v-model的使用以及实例体现v-model的双向绑定

<template>
  <div class="hello">
    <input v-model="inputData" />
    <p>输入的内容为:{{ inputData }}</p>
    <button @click="changeInputData">点击</button>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      inputData: "",
    };
  },
  methods: {
    changeInputData() {
      this.inputData = this.inputData + "a";
    },
  },
};
</script>
<style scoped>
</style>

当在输入框中输入内容时,会引起下面内容(inputData)的变化;当点击按钮改变 inputData的变化时,输入框中的内容也会发生变化,这就是双向绑定。

v-model的原理

v-model指令其实是v-bind和v-on指令的结合。

可以用v-bind和v-on指令实现跟v-model一样的效果:

<template>
  <div class="hello">
    <div>
      <h3>使用v-model</h3>
      <input v-model="inputData" />
      <p>输入的内容为:{{ inputData }}</p>
      <button @click="changeInputData">点击</button>
    </div>

    <div>
      <h3>使用v-bind和v-on指令实现v-model的效果</h3>
      <input type="text" v-bind:value="inputData2" v-on:input="onChange" />
      <p>输入的内容为:{{ inputData2 }}</p>
      <button @click="changeInputData2">点击</button>
    </div>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      inputData: "",
      inputData2: "",
    };
  },
  methods: {
    changeInputData() {
      this.inputData = this.inputData + "a";
    },
    onChange(e) {
      this.inputData2 = e.target.value;
    },
    changeInputData2() {
      this.inputData2 = this.inputData2 + "a";
    },
  },
};
</script>
<style scoped>
</style>

在输入框中输入内容,下面的内容也会跟着发生变化,点击按钮修改inputData2的值,输入框的内容也会跟随改变,所以也实现了双向绑定。

v-model作用在组件上

v-model绑定在组件上就是当v-model绑定的变量发生改变时,能影响组件的状态或者行为(数据→视图);当组件内部的状态或行为发生改变时,能够影响v-model绑定的变量(视图→数据)

下面是一个示例:

父组件:

<template>
  <div>
    <InputComp v-model="data"></InputComp>
    <div>子组件中input的内容:{{ data }}</div>
    <button @click="changeData">按钮</button>
  </div>
</template>
<script>
import InputComp from "./InputComp.vue";
export default {
  name: "ModelDemo",
  components: {
    InputComp,
  },
  data() {
    return {
      data: "",
    };
  },
  methods: {
    changeData() {
      console.log("点击了按钮");
      this.data = `${this.data}a`;
    },
  },
};
</script>

子组件:

<template>
  <div>
    <input v-bind:value="value" v-on:input="dealInputEvent" />
  </div>
</template>

<script>
export default {
  name: "InputComp",
  props: ["value"],
  methods: {
    dealInputEvent(e) {
      // 子组件向父组件派发input事件,并将子组件中input的输入内容传递给父组件
      this.$emit("input", e.target.value);
    },
  },
};
</script>

有两点需要说明:

1、为什么子组件中的props接收了value值?2、为什么子组件中能向父组件派发input事件?代码中我们并没有显式定义value和input,为什么可以直接用呢?

要理解这两点内容,可以从上面v-model的原理寻找答案。v-model的原理是v-bind:value和v-on:input(或者v-on:change)的组合。所以上面的例子中在使用v-model时,其实就是向子组件传递了value和input,所以在子组件中可以使用。

这样,当在子组件的输入框中输入内容时 ,会引起父组件中data变量的变化;

当点击按钮修改父组件中data的值时,也会引起子组件中input输入内容的变化。所以组件通过v-model 实现了双向绑定。

总结:v-model作用在组件上,

1、首先需要子组件接收父组件传递的value参数,并绑定在某个元素上。

2、在某个条件下,子组件向父组件派发input事件,并携带最新的值

3、父组件自动监听input事件,并吧接收到的最新值同步给v-model绑定的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值