子组件的v模型和子组件内部的v模型Vue

时间:2018-09-09 23:16:50

标签: javascript vue.js vuejs2 vue-component

是否可以简化此代码?

该按钮还应该更改子项的localValue。

Vue.component('my-input', {
  template: `
    <div>
      <b>My Input:</b> <br>
      localValue: {{ localValue }} <br>
      <input v-model="localValue">
    </div>
  `,
  props: ['value'],
  data() {
    return { localValue: this.value }
  },
  watch: {
    value () {
      this.localValue = this.value
    },
    localValue () {
      this.$emit('input', this.localValue)
    }
  }
})

new Vue({
  el: '#app',
  data: () => ({
    parentValue: 'Inital value'
  }),
  methods: {
    change () {
      this.parentValue = 'Changed value'
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
<div id="app">
  <my-input v-model="parentValue"></my-input>

  <button @click="change">Change</button><br>

  parentValue: {{ parentValue }}
</div>

在需要的时候我总是遇到困难。

我将非常感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

如果您避免在自定义表单组件中使用v-model,那么您实际上只需要

<b>My Input:</b> <br>
localValue: {{ value }} <br>
<input :value="value" @input="$emit('input', $event.target.value)">

没有data,没有watch,就是这样。

请参见https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components


如果您真的希望某些东西代表您组件的局部值,则Vue文档更倾向于使用计算值而不是 watchers (参考:https://vuejs.org/v2/guide/computed.html#Watchers)。

这里的想法是创建一个computed value with getter and setter,以简化简化的单向数据流。

Vue.component('my-input', {
  template: `<div><b>My Input:</b> <br>localValue: {{ localValue }} <br><input v-model="localValue"></div>`,
  props: ['value'],
  computed: {
    localValue: {
      get () {
        return this.value
      },
      set (value) {
        this.$emit('input', value)
      }
    }
  }
})

new Vue({
  el: '#app',
  data: () => ({
    parentValue: 'Inital value'
  }),
  methods: {
    change () {
      this.parentValue = 'Changed value'
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
<div id="app">
  <my-input v-model="parentValue"></my-input>

  <button @click="change">Change</button><br>

  parentValue: {{ parentValue }}
</div>