一、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>
Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐