vue3第十九节(编译宏defineProps与defineEmits)用法注意事项

本文主要是介绍vue3第十九节(编译宏defineProps与defineEmits)用法注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作用

1、vue3中编译宏,是一种特殊的代码,在编译时候,可以根据不同的宏,编译成不同的代码
2、vue3中编译宏,只能用在setup顶层语法糖中,如果将编译宏写在setup的 非顶层语法里,则会将编译宏原样输出,从而导致找不到编译宏的定义,而报错
3、vue3 中的编译宏,不需要引入,直接使用即可;因为在编译阶段,defineComponent()会将其转化为对应的代码
比如:

<script setup >const props = defineProps({person: {type: Object,default: () => ({})}})</script>

编译之后代码为:

<script>import { props, defineComponent } from 'vue'……defineComponent({props: {person: {type: Object.default: () => ({})}}setup(props, { emit }) {}}……
</script>

defineProps()/defineEmits()

用于在 setup语法糖中 定义 props和emits
由于数据流是单项的,故defineProps()里面的属性是只读,不能直接在子组件中修改,若要进行二次修改,需要定义额外属性进行接收;
defineProps() 函数返回一个对象,是一个 proxy ,所有的特性和 reactive 基本相同,可以直接在模版上进行使用;

defineProps({person: {type: Object, // 类型default: () => ({}), // 默认值required: true, // 是否必填validator: (value) => {} //}
})

defineEmits() 函数返回一个函数,该函数可以触发父组件的事件与模板里面的 $emit 相同作用的函数来触发
defineEmits() 接收一个数组

如:js 中 defineEmits(['changeAge'])
ts 中 const emit = defineEmits<{(e: 'change', id: number): void(e: 'update', value: string): void
}>()
// 或者
const emit = defineEmits<{change: [id: number] // 具名元组语法update: [value: string]
}>()

例如父组件:

<template>
<div class="parents-container">This is a parents page.<hr><el-button type="primary" @click="changeName">父组件更改名字</el-button><hr><Child :person="person" @handleChangeAge="handleChangeAge"></Child>
</div>
</template>
<script setup>
import { ref, reactive, computed, watch, onMounted, onUnmounted } from 'vue'
import Child from './components/Children.vue'
const person = ref({name: '',job: 'dev'
})
const changeName = () => {person.value.name = `${person.value.name} + $`console.log('==person.value.age==', person.value.age)person.value.age = person.value.age ? (person.value.age + 1 ): 18
}
// 父组件监听子组件的 changeAge 事件
const handleChangeAge = (data) => {console.log('==handleChangeAge==', data)person.age = dataperson.name = `${person.name} + ${data}`
} 
</script>

子组件中:

<template>
<div class="children-container">This is a child page.<div>person.name:{{ person.name }}</div><el-button type="primary" @click="handleGetName">子组件获取name</el-button>
</div>
</template>
<script setup>
import { computed, watch, ref } from 'vue'
const props = defineProps({person: Object,default: () => ({}),reqiured: true, // 是否必须传,// validator: (val) => val > 10 // 自定义校验
})
// const newPropsRef = ref(props.person) 不要使用这种形式 会导致newPropsRef不会跟随props.person变化而变化// 如若子组件需要二次加工使用 person ,
// 1、使用computed()
const personCom = computed(() => {const { name, job,age } = props.personreturn {name,job,age}
})// 2、或者使用 toRefs() 给每个属性设置代理
// const personCom = toRefs(props.person)
const handleGetName = () => {// const { name } = props.person// console.log('=person.name==', props.person.name)// console.log('=person.name==',{ ...props.person})console.log('=newPropsRef===', personCom.value.age, personCom)
}
watch(() => personCom.value, (n, o) => {console.log('==Child watch==',n , o)handleGetName()
}, {immediate: true,deep: true
})
// 子组件触发父组件事件
const emits = defineEmits(['handleChangeAge'])
const handleChangeAge = () => {emits('handleChangeAge', 1)
}
</script>

更多组件传参方法请查看组件之间传参:

以上仅代表个人看法,若有错误欢迎批评指正

这篇关于vue3第十九节(编译宏defineProps与defineEmits)用法注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907703

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

MySQL 中的 LIMIT 语句及基本用法

《MySQL中的LIMIT语句及基本用法》LIMIT语句用于限制查询返回的行数,常用于分页查询或取部分数据,提高查询效率,:本文主要介绍MySQL中的LIMIT语句,需要的朋友可以参考下... 目录mysql 中的 LIMIT 语句1. LIMIT 语法2. LIMIT 基本用法(1) 获取前 N 行数据(

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript