【问题标题】:v-model for child component and v-model inside child component Vue子组件的 v-model 和子组件 Vue 内的 v-model
【发布时间】:2019-02-14 09:22:49
【问题描述】:

有没有办法简化这段代码?

按钮也应该改变孩子的 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>

当我需要这样做时,我总是会遇到困难。

我将非常感谢您的帮助!

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    如果你避免在你的自定义表单组件中使用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>

    【讨论】:

    • 它是如此简单和优雅。非常感谢,我一直有这方面的困难,现在我知道该怎么做了!
    猜你喜欢
    • 2018-04-28
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2019-02-27
    • 2023-02-03
    • 2021-04-07
    • 2017-11-07
    相关资源
    最近更新 更多