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

Vue 3 组件高级语法

Vue 3 在组件开发方面引入了许多高级语法和新特性,这些让组件更加灵活、可组合、类型安全,并且更适合大型项目的架构需求。下面是 Vue 3 组件相关的高级语法 总结👇


🔹 1. <script setup> 中的 definePropsdefineEmits

✅ 定义 props 和 emits

<script setup>
const props = defineProps({
  title: String,
  count: {
    type: Number,
    default: 0
  }
})

const emit = defineEmits(['increment'])
</script>

✅ 支持类型推导(TypeScript)

<script setup lang="ts">
interface Props {
  title: string
  count?: number
}
const props = defineProps<Props>()

const emit = defineEmits<{
  (e: 'increment', value: number): void
}>()
</script>

🔹 2. defineExpose(组件对外暴露方法)

<script setup>
const sayHello = () => {
  console.log('Hello from child!')
}

defineExpose({
  sayHello
})
</script>

父组件中用 ref 拿到子组件实例后可调用:

<template>
  <Child ref="childRef" />
  <button @click="callChild">Call Child</button>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'

const childRef = ref()

function callChild() {
  childRef.value.sayHello()
}
</script>

🔹 3. v-model 多值绑定(多个 prop)

<!-- 父组件 -->
<Child v-model:title="title" v-model:count="count" />

<!-- 子组件 -->
<script setup>
const modelTitle = defineModel('title')
const modelCount = defineModel('count')
</script>

🔹 4. 动态组件 <component :is="...">

<template>
  <component :is="currentComponent" />
</template>

<script setup>
import CompA from './CompA.vue'
import CompB from './CompB.vue'

const currentComponent = ref(CompA)
</script>

🔹 5. 异步组件(defineAsyncComponent

import { defineAsyncComponent } from 'vue'

const AsyncComp = defineAsyncComponent(() =>
  import('./HeavyComponent.vue')
)

支持 Suspense 组件包裹:

<Suspense>
  <template #default>
    <AsyncComp />
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>

🔹 6. 插槽的高级用法

具名插槽 / 插槽作用域

<!-- 父组件 -->
<Child>
  <template #header>
    <h1>Header</h1>
  </template>

  <template #default="{ message }">
    <p>{{ message }}</p>
  </template>
</Child>

<!-- 子组件 -->
<template>
  <slot name="header" />
  <slot :message="'Hello from Child!'" />
</template>

🔹 7. provide / inject 跨层级组件通信

// 父组件
<script setup>
import { provide } from 'vue'

provide('theme', 'dark')
</script>

// 子组件
<script setup>
import { inject } from 'vue'

const theme = inject('theme') // 'dark'
</script>

🔹 8. 生命周期钩子(组合式 API)

import { onMounted, onUnmounted, onUpdated } from 'vue'

onMounted(() => {
  console.log('Component mounted!')
})

🔹 9. v-bind="$attrs" & inheritAttrs: false

<script setup>
defineOptions({
  inheritAttrs: false // 不自动传递到根节点
})
</script>

<template>
  <input v-bind="$attrs" />
</template>

✨ 你还可以了解:

  • v-memo:控制模板缓存、优化性能
  • v-is 动态组件指令(<div v-is="MyComp" />
  • 全局注册组件的最佳实践(通过插件)
  • 响应式组件状态封装:使用 useXxx composable 模式
  • <script setup name="MyComp"> 配合调试工具展示组件名

相关文章:

  • Redis通用命令+部分策略模型
  • Mybatis基于注解开发
  • Ubuntu22.04 UEFI系统配置Apache Tomcat/8.5.87为开机自动启动
  • LangChain4J开源开发框架简介
  • 为什么有了Redis还需要本地缓存?
  • leetcode 2711. 对角线上不同值的数量差 中等
  • Redis原理:为什么要rehash
  • 详细分析HttpClient的基本知识(附Demo实战思路)
  • SEV内存加密位linux内核设置过程
  • C++锁: 读锁,递归锁,超时锁
  • 2025系统分析师---软件工程:深度剖析常见软件开发方法
  • Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务
  • WordPress WooCommerce 本地文件包含漏洞(CVE-2025-1661)
  • 网络编程基础知识——从基础到实操
  • 常见框架漏洞(一)----Thinkphp(TP)
  • Android之卡片式滑动
  • 零基础上手Python数据分析 (9):DataFrame 数据读取与写入 - 让数据自由穿梭
  • 基于Java的班级事务管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • HarmonyOS-ArkUI Grip组件
  • Charles汉化步骤 charles中文版怎么用
  • 百科网站程序/百度官方营销推广平台加载中
  • 网站域名虚拟主机/上海优化外包公司排名
  • 网站信息抽查评估/青岛推广优化
  • 怎么做网站快照/合肥网站优化软件
  • 校园网网站建设/网页制作html代码