Vue3系列(八)Composition Api之组件注册、递归组件

764 阅读1分钟

组件注册方法

局部组件

在页面中注册局部组件,只需要直接导入即可

<template>
  <myComponent></myComponent>
</template>

<script setup>
import myComponent from './myComponent' // setup语法糖中,导入即可直接使用

</script>

<style lang="scss" scoped>

</style>

全局组件

需要在main.ts内全局注册,注册后的组件在页面中可以直接使用

import { createApp } from 'vue'
import App from './App.vue'

import myComponent from '@/components/myComponent' // 导入需要注册的全局组件

const app = createApp(App)
app.mount('#app')

app.component('myComponent', myComponent) // 这里可以重新定义组件名称

export default app

批量注册全局组件

可以参考 element-plus 中导入所有图标的做法

// main.ts

// 如果您正在使用CDN引入,请删除下面一行。
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}

递归组件

递归组件: 与写js函数递归是一样的,都是自己调用自己,通过一个条件来结束调用

案例:树状数据递归

// Tree.vue 
<template>
  <div class="tree" v-for="item in data">
    <input v-model="item.checked" type="checkbox"> <span>{{ item.name }}</span>

    <Tree v-if="item?.children.length" :data="item.children"></Tree>
  </div>
</template>

<script setup lang="ts">
interface Tree {
  name: string,
  checked: boolean,
  children: Tree[]
}

defineProps<{
  data?: Tree[]
}>()

</script>

<style scoped>

</style>

注意

  • 递归组件时,重新调用该组件可以通过文件名来调用

image.png

  • 或者通过设置name属性来给组件定义名称

因为setup语法糖模式无法给组件设置name属性,可以通过增加一个script通过export添加

<script>
export default {
  name: 'Tree' // 这里可以自定义组件名,递归组件时使用设置的值进行递归
}
</script>