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>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM