2种方式实现vue自定义组件v-model

1. 使用value+input事件

默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event

<!-- parent -->
<template>
  <div class="parent">
    <p>我是父亲, 对儿子说: {{ sthGiveChild }}</p>
    <button @click="changeChild">xxxx</button>

    <child v-model="sthGiveChild"></child>
  </div>
</template>
<script>
import child from './child.vue'
export default {
  data() {
    return {
      sthGiveChild: '给你100块',
    }
  },
  components: {
    child,
  },
  methods: {
    changeChild() {
      this.changeChild = '给你1000块'
    },
  },
}
</script>
<!-- child -->
<template>
  <div class="child">
    <p>我是儿子,父亲对我说: {{ value }}</p>
    <a href="javascript:;" rel="external nofollow" @click="returnBackFn"
      >回应</a
    >
  </div>
</template>
<script>
export default {
  name: 'Child',
  props: {
    value: String,
  },
  methods: {
    returnBackFn() {
      this.$emit('input', '还你200块')
    },
  },
}
</script>

2. 使用model自定义事件和prop

这种方式和第一种效果一样,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

<!-- child -->
<template>
  <div class="child">
    <p>我是儿子,父亲对我说: {{ give }}</p>
    <a href="javascript:;" rel="external nofollow" @click="returnBackFn"
      >回应</a
    >
  </div>
</template>
<script>
export default {
  name: 'Child',
  props: {
    give: String,
  },
  model: {
    prop: 'give',
    event: 'returnBack',
  },
  methods: {
    returnBackFn() {
      this.$emit('returnBack', '还你200块')
    },
  },
}
</script>
posted @ 2021-02-25 16:09  paul_xiao  阅读(923)  评论(0编辑  收藏  举报