组件的声明、创建、渲染

在Vue 3中,有多种方法来声明、创建和渲染组件。以下是全面的总结:

  1. 组件声明方法:
typescript 复制代码
// 选项式API
export default defineComponent({
  props: {},
  setup() {}
})

// 组合式API
export default {
  setup() {}
}

// <script setup>语法糖
<script setup>
// 直接编写逻辑
</script>

// 传统的类组件
export default class MyComponent extends Vue {}
  1. 组件创建方法:
typescript 复制代码
// 普通组件
const MyComponent = defineComponent({})

// 函数式组件
const FunctionalComponent: FunctionalComponent = (props, ctx) => {
  return h('div', props.text)
}

// 动态组件
const componentsMap = {
  ComponentA,
  ComponentB
}
  1. 组件渲染方式:
vue 复制代码
<!-- 模板渲染 -->
<template>
  <MyComponent />
  <component :is="dynamicComponent" />
</template>

<!-- 动态渲染 -->
<script setup>
import { h, resolveComponent } from 'vue'

// 渲染方式1:h()函数
const VNode = h(MyComponent, { props })

// 渲染方式2:渲染函数
render() {
  return h('div', [
    h(MyComponent),
    h(resolveComponent('el-button'))
  ])
}

// 渲染方式3:动态组件
const currentComponent = shallowRef(ComponentA)
</script>

<!-- 异步组件 -->
<script setup>
import { defineAsyncComponent } from 'vue'

const AsyncComponent = defineAsyncComponent(() => 
  import('./components/MyComponent.vue')
)
</script>

<!-- 内置组件渲染 -->
<component :is="tabs[currentTab]" />
  1. 高级组件创建:
typescript 复制代码
// 高阶组件
function withLoading(Component) {
  return {
    setup() {
      const loading = ref(true)
      return () => h(Component, { loading })
    }
  }
}

// 泛型组件
interface Props<T> {
  data: T[]
}
function GenericComponent<T>(props: Props<T>) {
  return h('div', props.data)
}
  1. 渲染控制:
vue 复制代码
<!-- 条件渲染 -->
<template>
  <MyComponent v-if="condition" />
  <MyComponent v-else />
  
  <!-- 列表渲染 -->
  <MyComponent 
    v-for="item in list" 
    :key="item.id" 
    :data="item" 
  />
</template>
  1. 插槽渲染:
vue 复制代码
<!-- 默认插槽 -->
<MyComponent v-slot="{ data }">
  {{ data }}
</MyComponent>

<!-- 具名插槽 -->
<MyComponent>
  <template #header>Header</template>
  <template #default>Content</template>
</MyComponent>
  1. 动态组件技巧:
vue 复制代码
<script setup>
import { ref, shallowRef } from 'vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'

// 动态切换组件
const current = shallowRef(ComponentA)
</script>

<template>
  <component :is="current" />
  <button @click="current = ComponentB">切换</button>
</template>
  1. 异步组件:
typescript 复制代码
// 基本异步
const AsyncComponent = defineAsyncComponent(() => 
  import('./MyComponent.vue')
)

// 带加载和错误状态
const AsyncComponent = defineAsyncComponent({
  loader: () => import('./MyComponent.vue'),
  loadingComponent: LoadingComponent,
  errorComponent: ErrorComponent,
  delay: 200,
  timeout: 3000
})

这些方法涵盖了Vue 3中组件声明、创建和渲染的主要技术和模式。根据具体场景选择最适合的方式。

关键建议:

  • 推荐使用<script setup>语法
  • 优先使用组合式API
  • 根据实际需求选择合适的组件创建方式
  • 注意性能和代码可读性
相关推荐
哆啦A梦15881 小时前
[前台小程序] 01 项目初始化
前端·vue.js·uni-app
一只小风华~4 小时前
Vue:条件渲染 (Conditional Rendering)
前端·javascript·vue.js·typescript·前端框架
灰海5 小时前
vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)
前端·javascript·vue.js·heatmap·heatmapjs
码上暴富7 小时前
vue2迁移到vite[保姆级教程]
前端·javascript·vue.js
老华带你飞7 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·vue.js·spring boot·考研·小程序·毕设·考研论坛平台小程序
YAY_tyy8 小时前
基于 Vue3 + VueOffice 的多格式文档预览组件实现(支持 PDF/Word/Excel/PPT)
前端·javascript·vue.js·pdf·word·excel
m0_7484613911 小时前
Spring Boot + Vue 项目中使用 Redis 分布式锁案例
vue.js·spring boot·redis
珍珠奶茶爱好者11 小时前
vue二次封装ant-design-vue的table,识别columns中的自定义插槽
前端·javascript·vue.js
Slice_cy11 小时前
深入剖析 Vue 响应式系统:从零实现一个精简版
vue.js
羊羊小栈12 小时前
基于「YOLO目标检测 + 多模态AI分析」的PCB缺陷检测分析系统(vue+flask+数据集+模型训练)
vue.js·人工智能·yolo·目标检测·flask·毕业设计·大作业