心莫急,马上来咯🫵
Sep 11, 2024
宏是在编译时执行的代码,而不是运行时执行的代码。
vue
中的宏到底是什么?
vue3
的宏是一种特殊的代码,在编译时会将这些特殊的代码转换为浏览器能够直接运行的指定代码,根据宏的功能不同,转换后的代码也不同。
为什么这些宏不需要手动从vue
中import
?
因为在编译时已经将这些宏替换为指定的浏览器能够直接运行的代码,在运行时已经不存在这些宏相关的代码,自然不需要从vue
中import
。
为什么只能在setup
顶层中使用这些宏?
因为在编译时只会a去处理setup
顶层的宏,其他地方的宏会原封不动的输出回来。在运行时由于我们没有在任何地方定义这些宏,当代码执行到宏的时候当然就会报错。
vue<template> <div> <Child name="xiaoman"></Child> </div> </template> <script lang='ts' setup> import Child from './views/child.vue' </script> <style></style>
子组件使用defineProps
接受值
vue<template> <div> {{ name }} </div> </template> <script lang='ts' setup> defineProps({ name: String }) </script>
vue<template> <div> {{ name }} </div> </template> <script lang='ts' setup> defineProps<{ name:string }>() </script>
Vue3.3
新增 defineProps 可以接受泛型vue<Child :name="['xiaoman']"></Child> //-------------子组件----------------- <template> <div> {{ name }} </div> </template> <script generic="T" lang='ts' setup> defineProps<{ name:T[] }>() </script>
vueconst { msg = 'hello' } = defineProps(['msg'])
vue<template> <div> <button @click="send">派发事件</button> </div> </template> <script lang='ts' setup> const emit = defineEmits<{ 'send':[name:string] }>() const send = () => { // 通过派发事件,将数据传递给父组件 emit('send', '我是子组件的数据') } </script>
vuedefineExpose({ name:"张三" })
父组件传递插槽内容:
vue<template> <div> <Child :data="list"> <template #default="{item}"> <div>{{ item.name }}</div> </template> </Child> </div> </template> <script lang='ts' setup> import Child from './views/child.vue' const list = [ { name: "张三" }, { name: "李四" }, { name: "王五" } ] </script> <style></style>
**子组件声明插槽类型:**只做声明不做实现 同时约束slot类型
vue<template> <div> <ul> <li v-for="(item,index) in data"> <slot :index="index" :item="item"></slot> </li> </ul> </div> </template> <script generic="T" lang='ts' setup> defineProps<{ data: T[] }>() defineSlots<{ default(props:{item:T,index:number}):void }>() </script>
主要是用来定义 Options API 的选项
常用的就是定义name 在seutp 语法糖模式发现name不好定义了需要在开启一个script自定义name现在有了defineOptions就可以随意定义name了
vuedefineOptions({ name:"Child", inheritAttrs:false, })
vue//父组件 <OperateDialog v-model:show="addDialog" :title="dialogTitle" :currentFormData="currentFormData" @updateList="getUserList" ></OperateDialog> // 子组件 const dialogShow = defineModel('show', { required: true })
https://blog.vuejs.org/posts/vue-3-3
@apply
和 !important
scss@apply text-primary #{!important};
scss:deep(.qu-menu-item-selected) { color: red; }
.......