当前位置: 首页 > news >正文

vue中使用defineModel简化defineProps和defineEmits的用法

目录

一、背景

二、前提

三、旧用法(vue 3.4之前)

四、defineModel新用法(3.4及以后)

五、总结


一、背景

        最新也是在学习vue,看到公司前端大佬写的代码,父组件调用子组件prop和emits时,发现有好多种写法,了解了一下发现是不同版本的写法差异,花了半天时间学习一下,特此记录一下。

二、前提

        使用defineModel、defineProps、defineEmits此类的宏函数,需要在vue3环境下配合组合式API中使用。其中宏函数是内置的函数,可以直接使用而无需引用。

三、旧用法(vue 3.4之前)

        此前我一直使用的如下的方法,将参数和暴露的方法通过props和emits传递给子组件,子组件修改值后,调用父组件的emits事件方法。最终在父组件里完成修改,也符合数据单项流通原则。

// Parent.vue
<template>
    <p style="text-align: center;">{{ title }}</p>
    <p style="text-align: center;">{{ content }}</p>
    <Child :title="title" @updateTitle="updateTitle"
           :content="content" @updateContent="updateContent"
    />
</template>


<script setup>
import { ref } from 'vue'
import Child from './components/text.vue';

const title = ref('我是标题')
const content = ref('我是内容')

// title被修改时,回调的函数
function updateTitle(newValue){
    title.value = newValue
}
// content被修改时回调
function updateContent(newValue){
    content.value= newValue
}

</script>
// Child.vue
<template>
    <div>
        <span>Title:</span>
        <el-input v-model="title" @input="changeTitle"></el-input>
        <span>Content:</span>
        <el-input v-model="content" @input="changeContent"></el-input>
    </div>
</template>


<script setup>
import { toRef, ref } from 'vue'


const props = defineProps(['title', 'content'])
const emits = defineEmits(['updateTitle', 'updateContent'])

const title = ref(props.title)
const content = ref(props.content)

// value是v-model绑定自动传递过来的
function changeTitle(value){
    emits('updateTitle', value)
}
function changeContent(value){
    emits('updateContent', value)
}
</script>

四、defineModel新用法(3.4及以后)

        新方法通过使用defineModel宏函数自动接收并处理来自调用方传入的props、emits参数和事件。

// Parent.vue
<template>
    <p style="text-align: center;">{{ title }}</p>
    <p style="text-align: center;">{{ content }}</p>
    <Child v-model:title="title"
           v-model:content="content"
    />
</template>


<script setup>
import { ref } from 'vue'
import Child from './components/text.vue';

const title = ref('我是标题')
const content = ref('我是内容')

</script>
// Child.vue
<template>
    <div>
        <span>Title:</span>
        <el-input v-model="titleModel"></el-input>
        <span>Content:</span>
        <el-input v-model="contentModel"></el-input>
    </div>
</template>


<script setup>
// // 如果只有一个参数时,可以不指定参数名
// const model = defineModel()

// 多个参数时,指定参数名。返回的是一个ref对象
const titleModel = defineModel('title')
const contentModel = defineModel('content')

</script>

五、总结

        可以看到使用defineModel前后可以省略很大一部分代码,v-model绑定的defineModel可以自动处理update:xxx方法的修改。

引用AI的回答:

        v-model:xxx="data" 等价于

                :xxx="data" 
                @update:xxx="data = $event"

        此方法提高了开发效率,并使代码看起来更简洁。但对我这种新手,刚开始会感觉看不懂,莫名其妙的感觉,慢慢了解前因后果后才会懂。

相关文章:

  • Node.js Express 处理静态资源
  • linux 抓图机器资源不足,排查和删除图片文件
  • Java | 基于 ThreadLocal 实现多客户端访问设备的 REST 请求下发
  • 量子计算:开启信息时代新纪元的钥匙
  • 阀门流量控制系统MATLAB仿真PID
  • 从 YOLO11 模型格式导出到TF.js 模型格式 ,环境爬坑,依赖关系已经贴出来了
  • Python中multiprocessing的使用详解
  • git push的时候出现无法访问的解决
  • MinGW下编译ffmpeg源码时生成compile_commands.json
  • 微信小程序报错:600001 ERR_CERT_AUTHORITY_INVALID 的问题排查及解决
  • 区块链技术在投票系统中的应用:安全、透明与去中心化
  • (!常识!)C++中的内存泄漏和野指针——如何产生?如何避免?解决方案?基本原理?面试常问重点内容?
  • Springbean(二)@Component及其派生注解自动注入(2)使用注意和加载问题
  • JSON是什么
  • 【Git “reset“ 命令详解】
  • 论文浅尝 | C-ICL:用于信息抽取的对比式上下文学习(EMNLP2024)
  • 淘宝获取商品sku详情API接口如何调用?
  • 转发和重定向
  • 每天认识一个设计模式-桥接模式:在抽象与实现的平行宇宙架起彩虹桥
  • GPT-4o图像生成功能:技术突破与隐忧并存
  • 玉渊谭天:美方多渠道主动接触中方希望谈关税
  • 增诉滥用职权罪,尹锡悦遭韩国检方追加起诉
  • 金科股份:去年营收约275亿元,今年确保所有项目“零烂尾”
  • 赛力斯拟赴港上市:去年扭亏为盈净利59亿元,三年内实现百万销量目标
  • 金融创新破局记:中小微企业转型背后的金融力量
  • 王一博赛车故障退赛冲上热搜,工作室回应:下次再战