2

使用在v-model组件内的视图和数据模型之间创建双向绑定。并且视图交互可以向父组件发出事件。

但是,有可能让子组件中的数据模型更改向父组件发出事件吗?

因为只要用户是单击复选框的人,父母和孩子的事情都很好(数据模型更新并发出事件)。但是,如果我拉起 Vue 开发工具并切换子组件数据中的复选框,则来自 的双向绑定v-model将在 CHILD 组件内进行适当的更新,但没有任何东西可以转移到父组件(我怀疑是因为不发出事件)。

如何确保父组件“知道”子组件中的数据更改?我认为这必须以某种方式实现......如果不是从子组件发出,也许有某种方法可以让父组件“监视”子组件的数据?

感谢您的任何帮助或指导!在此期间,我将继续阅读并寻找答案!

子组件

<template>
  <div class="list-item" v-on:click="doSomething">
    <input type="checkbox" v-model="checked">
    <label v-bind:class="{ checked: checked }">{{ name }}</label>
  </div>
  ...
</template>

<script>
  ...
  data: function() {
    return {
      checked: false,
    }
  },
  methods: {
    doSomething() {
      ...
      this.$emit('doSomething', this)
    }
  }
</script>

父组件

<template>
  <ChildComponent v-on:doSomething="getItDone"></ChildComponent>
  ...
</template>

<script>
  ...
  methods: {
    getItDone(target) {
      ...
    }
  }
</script>  

更新:在玩了更多@IVO GELOV 的解决方案之后,我现在遇到的问题是,当涉及多个子组件时,由于父级的 myBooleanVar 的一个奇异值驱动整个事情,选中一个框child component 导致检查所有子组件。

因此,在视图和数据操作都将其移交给父级方面绝对是进步,但我仍在试图弄清楚如何“隔离”这种情况,以便只有一个被执行的子组件被拖入聚会...

4

2 回答 2

1

您可以将数据保留在父级中,将其作为道具提供给子级,让子级观看道具并更新其内部状态,最后在子级内部状态发生更改时向父级发出事件。

父母

<template>
  <ChildComponent v-model="myBooleanVar" />
  ...
</template>

<script>
  data()
  {
    return {
      myBooleanVar: false,
    }
  },
  watch:
  {
    myBooleanVar(newValue, oldValue)
    {
      if (newValue !== oldValue) this.getItDone(newValue);
    }
  },
  methods: 
  {
    getItDone(value) 
    {
      ...
    }
  }
</script>  

孩子

<template>
  <div class="list-item">
    <input type="checkbox" v-model="checked">
    <label :class="{ checked: checked }">{{ name }}</label>
  </div>
  ...
</template>

<script>
  props:
  {
    value:
    {
      type: Boolean,
      default: false
    }
  }
  data() 
  {
    return {
      checked: this.value,
    }
  },
  watch:
  {
    value(newVal, oldVal)
    {
      // this check is mandatory to prevent endless cycle
      if(newVal !== oldVal) this.checked = newVal;
    },
    checked(newVal, oldVal)
    {
      // this check is mandatory to prevent endless cycle
      if(newVal !== oldVal) this.$emit('input', newVal);
    }
  },
</script>
于 2020-09-20T06:54:16.423 回答
1

也许您可以使用直接将复选框属性绑定到父属性v-bind="$attrs"

看看这个答案:https ://stackoverflow.com/a/56226236/10514369

于 2020-09-20T06:54:37.223 回答