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

相关文章

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大