vue2 自定义组件如何使用v-model

一、v-model要解决的问题

在使用自定义组件时,我们有时候需要使用 v-model双向绑定

二、默认使用

vue中,v-model 的值相当于默认传递了一个名为 value 的 prop 和一个名为 input 的方法(注意,这个valueprop是需要在自定义组件内声明的),如下:

<template>
  <div>
    <p><a @click="click()">add</a></p>
    <p>CTnum: {
   
   { num }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  props: {
      
      
    value: {
      
      
      type: Number,
      default: 0,
    },
  },
  data() {
      
      
    return {
      
      
      num: this.value,
    };
  },
  mounted() {
      
      },
  methods: {
      
      
    click() {
      
      
      this.num++;
      this.$emit("input", this.num);
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT v-model="num"></CT>
    <p>BTnum: {
   
   { num }}</p>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      
      num: 0,
    };
  },
  mounted() {
      
      },
  methods: {
      
      },
};
</script>

三、自定义使用

默认使用时,事件名inputprop名value是固定的,如果需要修改,就需要在子组件使用 model 选项。如下:

<template>
  <div>
    <p><a @click="click()">add</a></p>
    <p>CTnum: {
   
   { num }}</p>
  </div>
</template>

<script>
export default {
      
      
  name: "CT",
  model: {
      
      
    prop: 'modelvalue',
    event: 'change'
  },
  props: {
      
      
    modelvalue: {
      
      
      type: Number,
      default: 0,
    },
  },
  data() {
      
      
    return {
      
      
      num: this.modelvalue,
    };
  },
  mounted() {
      
      },
  methods: {
      
      
    click() {
      
      
      this.num++;
      this.$emit("change", this.num);
    },
  },
};
</script>
<template>
  <div>
    <p>BT</p>
    <CT v-model="num"></CT>
    <p>BTnum: {
   
   { num }}</p>
  </div>
</template>

<script>
import CT from "./CT.vue";

export default {
      
      
  name: "BT",
  components: {
      
       CT },
  data() {
      
      
    return {
      
      
      num: 0,
    };
  },
  mounted() {
      
      },
  methods: {
      
      },
};
</script>

猜你喜欢

转载自blog.csdn.net/letianxf/article/details/128429039