Bootstrap

vue3.4+ defineModel 非常省心省力的一个方法

defineModel 声明一个双向绑定 prop,通过父组件的 v-model 来使用 VUE3文档地址

1. 简化双向绑定写法

  • 父组件
<template>
  <div class="about">
    <button @click="updateData">父组件 修改</button>
    父组件展示 'age': {{ age }}

    <defineModelChild v-model:age="age" />
  </div>
</template>

<script setup lang="ts">
import defineModelChild from '../components/defineModel-child.vue'
import { ref } from 'vue'
const age = ref(10)

function updateData() {
  age.value++
}
</script>
  • 子组件
<script setup lang="ts">
const age = defineModel('age', { type: Number, default: 0 })
function childUpdateData() {
  age.value += 10
}
</script>

<template>
  <div class="greetings">'age' : {{ age }}</div>
  <button @click="childUpdateData">子组件修改数据</button>
</template>

备注:

<defineModelChild v-model:age="age" v-model:name="name" ... /> 可以写多了

2. 自定义修饰符

  • 父组件
 <defineModelChild v-model:age.doubleNumber="age" />

这里的 doubleNumber(翻倍) 就是 自定义修饰符

  • 子组件
<script setup lang="ts">
const [age, ageModifier] = defineModel('age', {
  type: Number,
  default: 0,
  // get(val: number) {
  // 读取出来的数据,可以通过doubleNumber 来 翻倍
  //   console.info('3', val)
  //   return val
  // },
  set(val: number) {
    console.info(1233, val)
    if (ageModifier.doubleNumber) {
      return val * 2
    }
    return val
  },
})
console.info(123123, ageModifier)

function childUpdateData() {
  age.value += 10
}
</script>

<template>
  <div class="greetings">子组件 显示 'age' : {{ age }}</div>
  <button @click="childUpdateData">子组件修改数据</button>
</template>

childUpdateData执行会调用 set 然后 触发 doubleNumber 的判断

;