自定义组件双向数据绑定,父v-model,子value用.$emit('input', newVal)

父组件

<template>
  <div>
    <p>我是父级组件</p>
    <p>父级组件内容:{{ text }}</p>
    <p><button @click="onChange">改变内容</button></p>
    <hr>
    <child v-model="text"></child>
  </div>
</template>
<script>
import Child from './child'
export default {
  components: {
    Child
  },
  data() {
    return {
      text: '我是父级组件的内容'
    }
  },
  methods: {
    onChange() {
      this.text = '我是由父级组件触发改变了内容'
    }
  }
}
</script>
<style scoped>
</style>

子组件

<template>
  <div>
    <p>我是子组件</p>
    <p>子组件内容:{{ myValue }}</p>
    <p><button @click="onChange">改变内容</button></p>
  </div>
</template>
<script>
export default {
  props: {
    //此处一定要用value
    value: {
      type: String
    }
  },
  data() {
    return {
      myValue: this.value
    }
  },
  methods: {
    onChange() {
      this.myValue = '我是由子组件触发改变了内容'
    }
  },
  watch: {
    //监听prop传的value,如果父级有变化了,将子组件的myValue也跟着变,达到父变子变的效果
    value(newVal) {
      this.myValue = newVal
    },
    //监听myValue,如果子组件中的内容变化了,通知父级组件,将新的值告诉父级组件,我更新了,父级组件接受到值后页就跟着变了
    myValue(newVal) {
      this.$emit('input', newVal)
    }
  }
}
</script>
<style scoped>
</style>

 

posted @ 2021-05-28 15:32  ThisCall  阅读(546)  评论(0编辑  收藏  举报