v-model绑定属性到自定义组件

133 阅读1分钟

v-model绑定属性到自定义组件

在Vue中,通过:v-model绑定一个属性到自定义组件上,实际上是利用了Vue的v-model语法糖,它本质上是实现了组件内部的value prop 和 input 事件的一个组合。当你在父组件中这样使用自定义组件时:

<SelectOfficeListModal :is-under="1" v-model="plan.useOffice" 
:config="useOfficeConfig"/>

这意味着你希望在SelectOfficeListModal组件内部能够:

  • 接收外部的值:通过value prop(Vue 3中推荐使用modelValue作为prop名称,但在Vue 2中通常直接使用value)接收来自plan.useOffice的值。
  • 更新外部的值:当组件内部的值发生变化时,应该触发一个名为input的事件,并将新值作为事件参数传递出去,以便父组件可以接收到并更新其绑定的plan.useOffice。

为了使你的SelectOfficeListModal组件能够正确响应v-model,你需要在组件内部做以下处理:

组件内部示例(Vue 2)

// SelectOfficeListModal.vue
export default {
  props: ['value', 'isUnder', 'config'], // Vue 2中使用'value'作为默认的v-model绑定属性
  methods: {
    handleChange(newValue) {
      this.$emit('input', newValue); // 当值变化时,触发input事件,传递新值
    },
  },
  // ...
}

组件内部示例(Vue 3)

Vue 3中推荐使用modelValue作为默认的v-model绑定属性,并使用update:modelValue来触发更新

// SelectOfficeListModal.vue
export default {
  props: {
    modelValue: {
      type: [String, Number], // 根据实际类型定义
      required: true,
    },
    isUnder: {
      type: Number,
      default: 0,
    },
    config: Object,
  },
  emits: ['update:modelValue'], // 声明会触发的自定义事件
  methods: {
    handleChange(newValue) {
      this.$emit('update:modelValue', newValue); // 触发更新事件
    },
  },
  // ...
}

确保在你的组件内部处理好这些逻辑,这样父组件就可以通过v-model无缝地与你的自定义组件进行双向数据绑定。