v-model for child component and v-model inside child component Vue

前端 未结 1 1066
滥情空心
滥情空心 2021-02-06 11:07

Is there a way to simplify this code?

The button should also change the localValue of the child.

相关标签:
1条回答
  • 2021-02-06 11:44

    If you avoid using v-model inside your custom form component, you really only need

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

    No data, no watch, that's it.

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


    If you really want something representing a value local to your component, the Vue docs favour using computed values over watchers (ref: https://vuejs.org/v2/guide/computed.html#Watchers).

    The idea here is to create a computed value with getter and setter to facilitate a simplified one-way data flow.

    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>

    0 讨论(0)
提交回复
热议问题