首页 > 其他分享 >【Vue3.x】全局组件、局部组件和递归组件

【Vue3.x】全局组件、局部组件和递归组件

时间:2022-10-06 00:33:26浏览次数:60  
标签:name 递归 Tree Vue3 组件 import children

全局组件

没啥讲的,和vue2一样,常规是src下components文件夹下新建全局组件,然后去入口文件main.ts里注册全局组件。然后就能在全局使用了

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

const app = createApp(App)

// 引入全局组件(GlobalComponent为具体组件名,请替换)
import GlobalComponent from "./components/GlobalComponent"
// 注册全局组件(component 第一个参数组件名称 第二个参数组件实例)
app.component("GlobalComponent",GlobalComponent);


app.use(store).use(router).mount('#app')

局部组件

就是最常规的手动引入路径后,在使用局部组件。每在一个不同的组件想使用,都必须手动引入。

递归组件

递归树结构组件,并设置递归边界,否则会引起内存泄漏。

递归组件的使用场景

  1. 任何存在树组件的地方:展示文件的层级
  2. 左侧导航栏:根据路由层级生成的导航菜单(导航是由后端传来的)
  3. 多级表格(嵌套的表格)

以下是一个左侧动态导航的菜单案例,Menu为祖先组件,Tree为树结构子组件,TreeItem为递归Tree组件时别名(就是Tree组件本身)

<template>
    <div>
        左侧导航菜单
        <Tree @on-click="getItem" :data="data"></Tree>
    </div>
</template>
<script setup lang='ts'>
import Tree from "../../components/Tree/index.vue";
import { reactive } from 'vue';

// 通过接口约束树结构
interface TreeList {
    name: string,
    icon?: string,
    children?: TreeList[] | []      // 子集为联合类型,可能是同样的树结构,也可能是空数组。甚至children是可选的。
}

// 递归的数据结构,我们并不知道他具体的层级,并通过props传给子组件Tree
const data = reactive<TreeList[]>([
    {
        name: 'no.1',
        children: [
            {
                name: "no.1-1",
                children: [
                    { name: 'no.1-1-1' }
                ]
            }
        ]

    },
    {
        name: 'no.2',
        children: [
            {
                name: 'no.2-1'
            }
        ]
    },
    {
        name: 'no.3'
    },
    {
        name: 'no.4',
        children: []
    }

])

const getItem = (item: TreeList) => {
    console.log(item, '父组件拿取到了item');
}
</script>

Tree树结构子组件

<template>
    <!-- 给一个margin区分层级 -->
    <div style="margin-left:10px">
        <!-- 
            这里绑定的两个clickItem需要理解一下,比较绕
            父级div定义了clickItem事件,但是不允许冒泡,因为我们想知道点击的子级的具体哪一个,如果不加stop将无法区分子级
            由于父级div取消了clickItem事件冒泡,子级TreeChild必须另外绑定监听事件
         -->
        <div @click.stop="clickItem(item)" v-for="(item,index) in data" :key="index">
            {{item.name}}
            <TreeChild @on-click="clickItem" :data="item.children" v-if="item?.children?.length"></TreeChild>
        </div>
    </div>
</template>
<script setup lang='ts'>
// 递归引入自身并取
import TreeChild from "./index.vue";

// 通过接口约束树结构(并递归子集),递归边界是子集没有children了
interface TreeList {
    name: string,
    icon?: string,
    children?: TreeList[] | []      // 子集为联合类型,可能是同样的树结构,也可能是空数组。甚至children是可选的,没有children就是递归边界
}

// 通过接口并使用泛型约束-父组件传来的props  data树形结构
interface Props<T>  {
    data?: T[] | []
};

// 接受父组件传来的props  data树形结构,并使用泛型约束props
defineProps<Props<TreeList>>()

// 子→父通信,告知父组件Menu当前点击的是具体哪一个菜单
const emit = defineEmits(['on-click'])
const clickItem = (item: TreeList) => {
    emit('on-click', item)
}
</script>

标签:name,递归,Tree,Vue3,组件,import,children
From: https://www.cnblogs.com/wanglei1900/p/16756872.html

相关文章

  • Vue 组件代码优化: 公共配置抽离成 Mixin 混合( 附超详细使用教程 )
    前言有过开发经验的同学都知道,为使代码层次结构清晰分明,对于一些通用或常用的方法,都会将其抽象成公共方法或配置供使用者调用。例如:在做Python自动化测试过程中,经常需要连......
  • (函数)用递归实现求阶乘函数fact(n)的功能,即求1*2*……*n,运行后输出结果如下
    样例输入5 样例输出12 样例输入6 样例输出720 参考答案deffact(n):result=1foriinrange(1,n+1):result*=ireturnresultn=i......
  • vue3组合式API
     选项API生命周期选项和组合式API之间的映射beforeCreate ->use setup()created ->use setup()beforeMount -> onBeforeMountmounted -> onMo......
  • vue3 ref()和reactive()的
    vue3中对响应式数据的声明官方给出了ref()和reactive()这两种方式,今天我们来聊聊两种定义定义数据方式有什么不同如上代码,我们使用变量声明的方式,ref的方式,reactive......
  • Vue3.x 组合式api的生命周期钩子
    Vue3组合式api的生命周期beforeCreatecreated,setup语法糖模式(组合式api)是没有这两个生命周期的,用setup去代替onBeforeMount获取不到DOM,onMounted可以获取DOMon......
  • Jmeter组件:直连数据库
    1、是什么?jmeter可以直接与数据库进行交互2、怎么用?2.1、在测试计划中添加数据库jar包2.2、添加组件:ConfigElement--JDBCConnectionConfiguration2.3、配置数据库连接信......
  • quick-vue3-admin
    quick-vue3-admin是一款免费开源快速搭建中后台系统框架。本框架基于vite2+element-plus等最新主流技术并封装了通用的组件方便开发者提高工作效率。后期也会通过版本升......
  • 原始递归函数及模拟运行的优化
    看到网上一个题目,证明x开y次方是原始递归函数(primitiverecursivefunction)。这个问题并不难,只要把x开y次方实现出来即可。于是,正好把《递归论》相关内容补一补。【......
  • 【微信小程序】button和image组件的基本使用
    ......
  • Jmeter组件:参数化之函数
    1、是什么函数是程序中最基本的封装单元,封装了一些常用的功能,比如计数器2、怎么用打开jmeter中的Tools-FunctionHelperDialog选择要使用的函数,给函数传递参数,用Jmeter生成......