Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录


前言

今天写个小例子,实战DefineModel的使用方法细节


一、实战DefineModel

上文官方说的挺清楚,实战验证一下,新建DefineModel.vue(这是儿子):

javascript 复制代码
<template>
    <div>
        <div>parent bound v-model is: {{ model }}</div>
        <v-btn @click="update" color="light-green">点我更新儿子</v-btn>
    </div>
</template>

<script setup lang="ts" name="">
const model:any = defineModel()

function update() {
  model.value++
}
</script>

<style lang='scss' scoped>
</style>

再更改一下之前的about.vue测试(这是父亲):

javascript 复制代码
<template>
            <div>
                <h3>About</h3>
                <h3>姓名:{{userStore.name}}</h3>
                <h3>简介:{{profile}}</h3>
                <h3>年龄:{{age}}</h3>

                <DefineModel v-model="age" />
                <v-btn @click="update" color="red" class="mt-3">点我更新父亲</v-btn>
            </div>  
    
</template>

<script setup lang='ts' name="About">
function update(){
    age.value++
}
const age = ref(1);
import DefineModel from './study/defineModel.vue';
import { ref } from 'vue';


</script>

<style lang='less' scoped>
</style>

运行:

点击父和子组件的按钮更新值age都会变化:


二、思考原理

为什么

const model = defineModel()

就绑定到了父的v-model了呢,因为defineModel 是一个便利宏。编译器将其展开为以下内容:

一个名为 modelValue 的 prop,本地 ref 的值与其同步;

一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发。

在 3.4 版本之前,你一般会按照如下的方式来实现上述相同的子组件:

javascript 复制代码
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>

<template>
  <input
    :value="props.modelValue"
    @input="emit('update:modelValue', $event.target.value)"
  />
</template>

这也是刚刚断点时候这个属性的解释:

但是注意我们子组件属性的名字是随意的,例如:

const childage:any = defineModel()

那么:

javascript 复制代码
<template>
    <div>
        <h3>parent bound v-model is: {{ childage }}</h3>
        <v-btn @click="update" color="light-green">点我更新儿子</v-btn>
    </div>
</template>

<script setup lang="ts" name="">
const childage:any = defineModel()

function update() {
    childage.value++
}
</script>

<style lang='scss' scoped>
</style>

运行:

是不影响功能的。我开始对这里理解有点误解,备忘。

如果不想用默认的modelValue,也可以传递一个有意义的名字:

父:

javascript 复制代码
<DefineModel v-model:childage="age" />

儿砸:

javascript 复制代码
const childage:any = defineModel('childage')

总结

这样一来,通过 defineModel,子组件无需显式声明 props 和 emits,就能实现与父组件之间的自动双向绑定。

草长莺飞二月天,拂堤杨柳醉春烟 儿童散学归来早,忙趁东风放纸鸢

相关推荐
夏鹏今天学习了吗3 小时前
【性能优化】前端高性能优化策略
前端·性能优化
weixin_427771616 小时前
css font-size 的妙用
前端·css
凤凰战士芭比Q7 小时前
web中间件——Nginx
前端·nginx·中间件
好望角雾眠7 小时前
第四阶段C#通讯开发-5:TCP
网络·笔记·网络协议·tcp/ip·c#
三品吉他手会点灯7 小时前
stm32f103学习笔记-16-RCC(第2节)-讲解系统时钟配置函数SetSysClockTo72()
笔记·stm32·单片机·嵌入式硬件·学习
一 乐8 小时前
点餐|智能点餐系统|基于java+ Springboot的动端的点餐系统小程序(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·小程序·论文
视图猿人8 小时前
RxJS基本使用及在next.js中使用的例子
开发语言·javascript
仙人掌_lz8 小时前
Kimi Linear 论文阅读笔记:第一次“线性注意力”全面胜过全注意力
论文阅读·笔记
wdfk_prog8 小时前
[Linux]学习笔记系列 -- [kernel]cpu
linux·笔记·学习
bitbitDown8 小时前
从零打造一个 Vite 脚手架工具:比你想象的简单多了
前端·javascript·面试