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

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

css渐变色背景|<gradient示例详解

《css渐变色背景|<gradient示例详解》CSS渐变是一种从一种颜色平滑过渡到另一种颜色的效果,可以作为元素的背景,它包括线性渐变、径向渐变和锥形渐变,本文介绍css渐变色背景|<gradien... 使用渐变色作为背景可以直接将渐China编程变色用作元素的背景,可以看做是一种特殊的背景图片。(是作为背