在 VueJS 中是否可以将一些东西与 v-model 绑定然后反弹给另一个孩子?

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)

但这当然行不通,因为我现在将属性 绑定valueq-numeric,这会改变它。真的,我不想将顶级变量绑定numParticipantsq-numeric- 是否可以在我的config-item组件中实现某种“传递” ?或者我的组件是否需要拥有它自己的数据元素,它从传入的属性中初始化,并更新以响应q-numeric? 我知道我可以做到,但我希望有一个更清洁的解决方案......

Roy*_*y J 5

更新:您可以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)