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"> 配合调试工具展示组件名
<think>好的,我现在需要帮助用户了解Vue3组件语法和使用示例。首先,我得回忆一下Vue3组件系统,特别是组合式API和`<script setup>`语法糖。用户可能已经接触过一些基础,但需要更具体的示例和结构化的解释。 根据用户提供的引用内容,特别是引用[2]和[3],我需要涵盖组件注册(全局和局部)、组合式API的使用,以及像`provide/inject`这样的高级特性。此外,用户提到了使用示例,所以代码片段是必不可少的。需要注意代码格式是否正确,比如使用正确的标签和setup语法。 首先,我应该从组件的定义开始,区分全局和局部注册。然后展示一个基础组件的示例,比如HelloWorld组件,说明模板、脚本和样式的结构。接下来,可能需要介绍组合式API中的响应式数据和方法,比如使用`ref`和`reactive`。然后,父子组件通信的部分,包括props和自定义事件,这部分需要例子展示如何传递数据和触发事件。 另外,引用[3]中提到了使用`inject`,所以需要解释provide和Inject的用法,说明跨层级组件通信的方法。可能还需要提到生命周期钩子,但用户的问题主要是语法,所以可能简要带过。 然后,考虑到用户可能需要实际项目中的结构,可以给出一个项目结构示例,说明单文件组件的组织方式。最后,相关问题的生成应该围绕用户可能进一步询问的点,比如组件通信方式、组合式API的优势、与Vue2的区别等。 需要注意引用标记的正确使用,比如在提到组件注册时引用[2],在代码示例中使用引用[3]。确保所有代码块使用正确的语法,比如`<script setup>`和模板结构。同时,检查是否有遗漏的部分,比如样式部分的作用域scoped是否需要说明。 最后,确保回答结构清晰,分点说明,每个部分都有对应的示例代码,并自然融入引用标记。同时,生成的相关问题要针对用户可能深入的方向,帮助他们继续学习。</think>### Vue3组件语法与使用示例 Vue3组件采用单文件组件(SFC)结构,包含`<template>`、`<script>`和`<style>`三个核心部分。以下是具体语法说明和示例: --- #### 一、组件基础结构 ```vue <template> <div>{{ message }}</div> <button @click="handleClick">点击</button> </template> <script setup> import { ref } from &#39;vue&#39; const message = ref(&#39;Hello Vue3&#39;) const handleClick = () => { message.value = &#39;按钮已点击&#39; } </script> <style scoped> div { color: blue; } </style> ``` - **`<template>`**:定义组件模板,支持Vue指令(如`@click`) - **`<script setup>`**:组合式API语法糖,简化响应式数据和方法定义[^3] - **`<style scoped>`**:作用域CSS,样式仅对当前组件生效 --- #### 二、组件注册方式 1. **全局注册**(适用于高频组件) ```javascript // main.js import { createApp } from &#39;vue&#39; import GlobalComponent from &#39;./components/GlobalComponent.vue&#39; const app = createApp() app.component(&#39;GlobalComponent&#39;, GlobalComponent) ``` 2. **局部注册**(推荐常用方式) ```vue <script setup> import LocalComponent from &#39;./components/LocalComponent.vue&#39; </script> <template> <LocalComponent /> </template> ``` --- #### 三、组件通信 1. **Props 传值** ```vue <!-- 父组件 --> <ChildComponent :title="pageTitle" /> <!-- 子组件 --> <script setup> defineProps({ title: { type: String, default: &#39;默认标题&#39; } }) </script> ``` 2. **自定义事件** ```vue <!-- 子组件 --> <button @click="$emit(&#39;update&#39;, newValue)">提交</button> <!-- 父组件 --> <ChildComponent @update="handleUpdate" /> ``` --- #### 四、跨层级通信(provide/inject) ```vue <!-- 祖先组件 --> <script setup> import { provide } from &#39;vue&#39; provide(&#39;theme&#39;, &#39;dark&#39;) </script> <!-- 后代组件 --> <script setup> import { inject } from &#39;vue&#39; const theme = inject(&#39;theme&#39;, &#39;light&#39;) // 默认值&#39;light&#39; </script> ``` --- #### 五、组合式函数复用 ```javascript // useCounter.js import { ref } from &#39;vue&#39; export function useCounter(initialValue = 0) { const count = ref(initialValue) const increment = () => { count.value++ } return { count, increment } } ``` ```vue <script setup> import { useCounter } from &#39;./useCounter&#39; const { count, increment } = useCounter() </script> ``` --- #### 六、项目结构示例 ``` src/ ├── components/ │ ├── BaseButton.vue │ └── Icon/ ├── composables/ │ └── useFetch.js ├── views/ │ └── HomeView.vue └── main.js ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翱翔-蓝天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值