简单实现一个v-model

82 阅读1分钟

v-model 默认情况下只会接受 value 属性和响应 input 事件。 因为 v-model 本身是基于 input 输入框定制的, value 是 input 内部定制的绑定值的属性, input 方法是输入框值改变触发的事件。

所以我们只需要记住两点:

1.绑定的值value

2.触发的input事件

1。局部变量观察者

<!-- BaseInput.vue -->
<template>
  <input type="text" v-model="model" />
</template>

<script>
  export default {
    props: {
      value: {
        type: String,
        default: ''
      }
    },
    data() {
      return {
        model: this.value
      }
    },
    watch: {
      model(currentValue) {
        this.$emit('input', currentValue)
      }
    }
  }
</script>

<!-- Utilização -->
<BaseInput v-model="text" />

2\。自定义方法

<!-- BaseInput.vue -->
<template>
  <input type="text" :value="value" @input="onInput" />
</template>

<script>
  export default {
    props: {
      value: {
        type: String,
        default: ''
      }
    },
    methods: {
      onInput(event) {
        this.$emit('input', event.target.value)
      }
    }
  }
</script>

<!-- Utilização -->
<BaseInput v-model="text" />

3\。计算属性“Anabolized”

<!-- BaseInput.vue -->
<template>
  <input type="text" v-model="model" />
</template>

<script>
  export default {
    props: {
      value: {
        type: String,
        default: ''
      }
    },
    computed: {
      model: {
        get() {
          return this.value
        },
        set(value) {
          this.$emit('input', value)
        }
      }
    }
  }
</script>

<!-- Utilização -->
<BaseInput v-model="text" />

4\。自定义道具和事件(VueJS 2)

<!-- BaseInput.vue -->
<template>
  <input type="text" :value="text"  @input="onInput" />
</template>

<script>
  export default {
    model: {
      prop: 'text',
      event: 'update'
    },
    props: {
      text: {
        type: String,
        default: ''
      }
    },
    methods: {
      onInput(event) {
        this.$emit('update', event.target.value)
      }
    }
  }
</script>

<!-- Usage -->
<BaseInput v-model="text" />

devpress.csdn.net/vue/62f8ff6…