父子之间共享的v模型值

时间:2019-03-15 15:42:37

标签: javascript vue.js vuejs2 vue-component

我有一个与父组件共享v-model的组件。代码如下:

Vue.component('greeting', {
  template: '<input type="text" :name="name" v-on:input="updateSearch($event.target.value)"> ' ,
  props: ['name'],
  methods: {
    updateSearch: function(value) {
      this.$emit('input', value);
    }
  }
});


const app = new Vue({
  el: '#app',
  data: {
    name: ''
  }
});
<script src="https://unpkg.com/vue@2.6.9/dist/vue.js"></script>
<div id="app">
  
  Child: <greeting v-model="name"></greeting>
  <br><br><br>
  Main: <input type="text" v-model="name" placeholder="" />

</div>

如果用户在两个输入框中都输入了文本,我想更新两个输入框。任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:1)

通常在子组件内部更改道具是一种不好的做法。在这种情况下,您可以创建两个不同的变量,并在其中一些变量(通过事件和道具)更改其值时更新另一个变量。

因此,greeting组件会发出一些事件,您将在主要组件内部捕获该事件并更新主要组件的name

另一方面,主要组件会将一个道具传递给greeting,考虑到main内部的变化,该道具将是反应性的,并将在问候语数据中更新变量name

如果您遇到更多类似情况,请考虑使用vuex

答案 1 :(得分:1)

如果您将诸如对象之类的引用作为prop传递,则可以在父级和子级上绑定该对象的属性

Vue.component('greeting', {
  template: '<input type="text" v-model="name.value" />' ,
  props: ['name']
});


const app = new Vue({
  el: '#app',
  data: {
    name: { value: '' }
  }
});
<script src="https://unpkg.com/vue@2.6.9/dist/vue.js"></script>
<div id="app">
  
  Child: <greeting v-bind:name="name"></greeting>
  <br><br><br>
  Main: <input type="text" v-model="name.value" placeholder="" />

</div>

答案 2 :(得分:0)

我认为,您正在寻找的是Vue.js 2.3.0+中的.sync modifier for events

您可以在我的文章here中找到相同的示例实现。