dsl*_*101 3 custom-component vue.js
我有一个应用程序,我正在为其创建一个自定义组件,该组件将输出表格的单行。它包含一个用户可调整的数字字段,因此在该自定义组件中,我使用了 quasar 框架中的另一个自定义组件 ( q-numeric)。我正在努力了解如何通过 2 个组件在顶层绑定变量 - 也许它不能直接完成,但我希望避免在中间组件中添加大量额外代码。到目前为止,从上到下看起来是这样的:
在 App.vue 模板中,我有这样的行:
<config-item v-model="numParticipants">Number of Participants</config-item>
Run Code Online (Sandbox Code Playgroud)
ConfigItem.vue,看起来像这样:
<template>
<tr>
<td class="text-right"><slot></slot></td>
<td class="text-right">
<q-numeric
v-model="value"
:min="min"
:max="max"
:step="step"
@input="$emit('input', value)"
></q-numeric>
</td>
</tr>
</template>
<script>
export default {
props: {
label: String,
value: Number,
min: {
type: Number,
default: 1
},
max: {
type: Number,
default: 1000
},
step: {
type: Number,
default: 1
}
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
但这当然行不通,因为我现在将属性 绑定value到q-numeric,这会改变它。真的,我不想将顶级变量绑定numParticipants到q-numeric- 是否可以在我的config-item组件中实现某种“传递” ?或者我的组件是否需要拥有它自己的数据元素,它从传入的属性中初始化,并更新以响应q-numeric? 我知道我可以做到,但我希望有一个更清洁的解决方案......
更新:您可以v-model通过根据道具(道具必须命名为“值”)进行可写计算来将-ability 向下传播。该get函数显然返回了 prop 值;该set函数执行$emit.
计算出的规范是完全固定的,所以我将其提取为常量。
const vModelComputed = {
get() {
return this.value;
},
set(newValue) {
this.$emit('input', newValue);
}
};
new Vue({
el: '#app',
data: {
numParticipants: 1
},
components: {
middleComponent: {
props: ['value'],
template: '<div>Value: {{value}} <q-numeric v-model="localValue"></q-numeric></div>',
computed: {
localValue: vModelComputed
},
components: {
qNumeric: {
props: ['value'],
template: '<div><input v-model="localValue" type="number"> inner value: {{value}}</div>',
computed: {
localValue: vModelComputed
}
}
}
}
}
});Run Code Online (Sandbox Code Playgroud)
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>
<div id="app">
Participants: {{numParticipants}}
<middle-component v-model="numParticipants"></middle-component>
</div>Run Code Online (Sandbox Code Playgroud)