Vue2、Vue3 双向绑定封装组件例子:本文将讲述如何使用 Vue2 和 Vue3 的双向绑定功能,来创建封装组件,并且提供了一个实际的示例。

image-20230227161052962

Vue2

以下是一个简单的双向绑定组件示例,使用 Vue 的 v-model 指令来实现数据的双向绑定:

<template>
  <div>
    <label for="input">输入</label>
    <input type="text" id="input" :value="value" @input="$emit('input', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      required: true,
    },
  },
};
</script>

在这个示例中,组件接受一个名为 value 的 prop,用于传递输入框的值。在模板中,使用 :value 绑定输入框的值到 value prop 上,实现初始值的渲染。同时,使用 @input 监听输入框的输入事件,并通过 $emit 方法触发名为 input 的自定义事件,传递输入框的新值作为参数。这样,父组件就可以通过 v-model 指令将数据双向绑定到这个组件上。

假设父组件中有一个名为 text 的 data 属性,可以像这样使用这个组件:

<template>
  <div>
    <my-input v-model="text" />
    <p>输入的文本是{{ text }}</p>
  </div>
</template>

<script>
import MyInput from "./MyInput.vue";

export default {
  components: {
    MyInput,
  },
  data() {
    return {
      text: "",
    };
  },
};
</script>

Vue3

在这个示例中,通过 v-model 指令将父组件的 text 数据属性双向绑定到 MyInput 组件的 value prop 上,实现了输入框值的同步更新。同时,通过模板插值将 text 数据属性渲染到页面上,实时显示输入框中的文本。

<template>
  <div>
    <label for="input">输入</label>
    <input type="text" id="input" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
  </div>
</template>

<script>
import { defineComponent } from "vue";

export default defineComponent({
  props: {
    modelValue: {
      type: String,
      required: true,
    },
  },
});
</script>

在这个示例中,组件使用了新的 defineComponent API 来定义组件。组件接受一个名为 modelValue 的 prop,用于传递输入框的值。在模板中,使用 :value 绑定输入框的值到 modelValue prop 上,实现初始值的渲染。同时,使用 @input 监听输入框的输入事件,并通过 $emit 方法触发名为 update:modelValue 的自定义事件,传递输入框的新值作为参数。这样,父组件就可以通过 v-model 指令将数据双向绑定到这个组件上。

假设父组件中有一个名为 text 的 data 属性,可以像这样使用这个组件:

<template>
  <div>
    <MyInput v-model="text" />
    <p>输入的文本是{{ text }}</p>
  </div>
</template>

<script>
import MyInput from "./MyInput.vue";

export default {
  components: {
    MyInput,
  },
  data() {
    return {
      text: "",
    };
  },
};
</script>

在这个示例中,通过 v-model 指令将父组件的 text 数据属性双向绑定到 MyInput 组件的 modelValue prop 上,实现了输入框值的同步更新。同时,通过模板插值将 text 数据属性渲染到页面上,实时显示输入框中的文本。