我遇到了同样的问题。我搜索了几个小时以找到转发值和事件的解决方案。
我从阅读源代码开始研究,发现了一些有趣的东西。当你使用v-model 时,vue.js 会生成a piece of code at runtime。这些代码撤消事件以简化分配。
如果选择不是多个,则保存我的生活,但问题已停留。我想属性值的绑定也有类似的东西,但我没有找到。如果有人有,我有兴趣知道来源。
最后我找到了一个简单的解决方案。目的只是转发 select 的 v-model 交互(绑定值和输入事件)。我创建了一个组件:
- 使用 getter 和 setter 计算属性
model。
-
prop 值。
有了这些,我们利用了 setter 生成的代码片段,因为传递的值是经过提炼的值。 getter 不需要更复杂。
{
props: ["value"],
computed: {
model: {
get: () => {
// value is a prop of the component
return this.value;
},
set: (valueSelect) => {
this.$emit("input", valueSelect);
}
}
}
}
模板:
<template>
<select v-model="model">
<slot></slot>
</select>
</template>
我希望这会有所帮助。
对不起语法,但我在 Typescript 中编写组件,所以它真的很不同。我在这里用 typescript 和 sfc 语法写。
<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import { Prop, Watch } from "vue-property-decorator";
@Component
export default class SelectComponent extends Vue {
@Prop({
required: true
})
private value: any[] | any;
@Prop({
default: false
})
private multiple: boolean;
private get model() {
return this.value;
}
private set model(value) {
this.$emit("input", value);
}
}
</script>
<template>
<select v-model="model" :multiple="multiple">
<slot></slot>
</select>
</template>