vue3 - 11.全局组件,局部组件,递归组件

本文探讨Vue3中的组件使用,包括如何注册和使用全局组件、在特定模块中定义和调用局部组件,以及如何实现递归组件以渲染树形结构数据。通过实例代码展示了在main.ts中创建全局组件,在box.vue和index.vue中定义和应用局部组件,以及tree.vue子组件的递归渲染方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局组件:

com.vue

<template>
    <div>
        我是com全局组件
    </div>
</template>
<script setup lang='ts'>
    import { ref } from 'vue'
</script>

main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'

import com from './components/com.vue'

const app = createApp(App)

app.component('Com',com) // 第一个参数是自定义组件名称,第二个参数是你当前的组件名称

app.use(createPinia())
app.use(router)

app.mount('#app')

局部组件:

box.vue

<template>
    <div>
        我是局部组件
    </div>
</template>
<script setup lang='ts'>
    import { ref } from 'vue'
</script>
<style scoped>
</style>

index.vue

<template>
  <div>
    <box />
  </div>
</template>
<script setup lang='ts'>
  import box from '../components/box.vue'
</script>
<style scoped>
</style>

递归组件:

比如我们实现一个tree数的渲染

index.vue 父页面:

<template>
  <div>
    <Tree :data="data" @on-click="handleTreeItem" />
  </div>
</template>
<script setup lang='ts'>
  import { reactive, ref } from 'vue'
  import Tree from '../components/tree/tree.vue'
  type TreeList = {
    name: string,
    icon?: string,
    children?: TreeList[] | []
  }
  const data = reactive<TreeList[]>([
    {
      name: "no.1",
      children: [
        {
          name: "no.1-1",
          children: [
            {
              name: "no.1-1-1"
            }, {
              name: "no.1-1-2"
            }, {
              name: "no.1-1-3"
            }
          ]
        }, {
          name: "no.1-2",
          children: [
            {
              name: "no.1-2-1"
            }, {
              name: "no.1-2-2"
            }
          ]
        }
      ]
    },{
      name: "no.2",
      children: [
        {
          name: "no.2-1",
          children: [
            {
              name: "no.2-1-1"
            }
          ]
        }, {
          name: "no.2-2",
          children: [
            {
              name: "no.2-2-1"
            }
          ]
        }
      ]
    }
  ])
  const handleTreeItem = (data:TreeList) => {
    console.log(data)
  }
</script>

tree.vue 子组件:

<template>
    <div style="margin-left:20px;">
        <div v-for="(item,index) in data" @click.stop="handleTree(item)">
            {{item.name}}
            <treeItem v-if="item?.children?.length" :data="item.children" @on-click="handleTree" />
        </div>
    </div>
</template>
<script setup lang='ts'>
    import { ref } from 'vue'
    type TreeList = {
        name: string,
        icon?: string,
        children?: TreeList[] | []
    }
    type Props = {
        data?: TreeList[]
    }
    defineProps<Props>()

    const emits = defineEmits(['on-click'])

    const handleTree = (item:TreeList) => {
        // console.log(item)
        emits('on-click',item)
    }

</script>
<script lang="ts">
    export default {
        name:"treeItem"
    }
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值