递归组件

第一种方式,直接自己调用自己

Tree.vue

<template>
<div class="tree">
<div v-for="(item, index) in data" :key="item.name">
每一层 {{ item.name }}
<Tree v-if="item?.children?.length" :data='item.children' />
</div>
</div>
</template> <script setup lang="ts">
//递归的第一种方式 直接引入自己
import Tree from './Tree.vue'
import { TreeList } from '../ts/type'
type Props = {
data?: TreeList[]
}
defineProps<Props>();
</script> <style scoped>
.tree {
margin-left: 20px;
border-left: 2px #01847f dashed;
}
</style>

App.vue 里模拟树形数据,使用递归组件

<template>
<div>
<Tree :data='data'/>
</div>
</template> <script setup lang="ts">
import Tree from './components/Tree.vue'
import { reactive } from 'vue'
import {TreeList } from './ts/type'
const data = reactive<TreeList[]>([
{
name: 'no.1',
children: [
{
name: 'no.1-1',
children: [
{
name: 'no.1-1-1',
children:[]
}
]
},
],
}, {
name:'no.2'
}, {
name: 'no.3',
children: [{
name:'no.3-1'
}]
} ])
</script> <style scoped></style>

type.ts 属性数据的结构

export type TreeList = {
name: string //名称
icon?: string //图标可有可无
children?: TreeList[] | [] //子节点 可有可无 还可能传空数组
}

第二种方式,export 一个name出去

第二种方式 就是像vue2 一样 export一个name出去

但是setup 语法糖下没办法使用 export

我们只需要再定义一个script标签就可以了

<template>
<div class="tree">
<div v-for="(item, index) in data" :key="item.name">
每一层 {{ item.name }}
<Tree v-if="item?.children?.length" :data='item.children' />
</div>
</div>
</template> <script setup lang="ts">
import { TreeList } from '../ts/type'
type Props = {
data?: TreeList[]
}
defineProps<Props>();
</script>
<!--
第二种方式 就是像vue2 一样 export一个name出去
但是setup 语法糖下没办法使用 export
我们只需要再定义一个script标签就可以了
-->
<script lang="ts">
export default {
name:'Tree'
}
</script> <style scoped>
.tree {
margin-left: 20px;
border-left: 2px #01847f dashed;
}
</style>

效果图

我们还可以给树形递归的组件添加参数传递事件

要注意在树形组件的里层也得添加自定义事件

并且这个自定义事件传的函数很有讲究

Tree.vue

<template>
<div class="tree">
<div @click.stop="clickTreeItem(item)" v-for="(item, index) in data" :key="item.name">
每一层 {{ item.name }}
<Tree @get-tree-item="clickTreeItem" v-if="item?.children?.length" :data='item.children' />
<!-- Tree 组件不添加这个自定义事件的话 那么就只有最外层的根节点会向外传递数据 -->
<!-- 注意此处派发的函数clickTreeItem没有传item参数了如果传了就相当于给树形组件(递归组件)的上级派发信息 没办法从外部拿到子节点所传递的数据了 -->
<!-- @get-tree-item="clickTreeItem(item)" 写成这种形式的话 递归组件会依次向上层传递事件 -->
<!-- 不传item的执行结果如下 -->
<!--子组件派发的item Proxy {name: 'no.1-1-1', children: Array(0)}
子组件派发的item Proxy {name: 'no.1-1-1', children: Array(0)}
子组件派发的item Proxy {name: 'no.1-1-1', children: Array(0)}
父组件得到的item Proxy {name: 'no.1-1-1', children: Array(0)} -->
<!-- 传item的执行的结果如下 -->
<!-- 子组件派发的item Proxy {name: 'no.1-1-1', children: Array(0)}
子组件派发的item Proxy {name: 'no.1-1', children: Array(1)}
子组件派发的item Proxy {name: 'no.1', children: Array(1)}
父组件得到的item Proxy {name: 'no.1', children: Array(1)} -->
</div>
</div>
</template> <script setup lang="ts">
import { TreeList } from '../ts/type'
type Props = {
data?: TreeList[]
}
defineProps<Props>(); const emit = defineEmits(['getTreeItem'])
const clickTreeItem=(item:TreeList)=>{
console.log('子组件派发的item', item)
emit('getTreeItem',item)
}
</script>
<!--
第二种方式 就是像vue2 一样 export一个name出去
但是setup 语法糖下没办法使用 export
我们只需要再定义一个script标签就可以了
-->
<script lang="ts">
export default {
name:'Tree'
}
</script> <style scoped>
.tree {
margin-left: 20px;
border-left: 2px #01847f dashed;
}
</style>

App.vue

<template>
<div>
<Tree :data='data' @get-tree-item="getTreeItem"/>
</div>
</template> <script setup lang="ts">
import Tree from './components/Tree.vue'
import { reactive } from 'vue'
import {TreeList } from './ts/type'
const data = reactive<TreeList[]>([
{
name: 'no.1',
children: [
{
name: 'no.1-1',
children: [
{
name: 'no.1-1-1',
children:[]
}
]
},
],
}, {
name:'no.2'
}, {
name: 'no.3',
children: [{
name:'no.3-1'
}]
} ]) const getTreeItem = (item:TreeList) => {
console.log('父组件得到的item',item)
}
</script> <style scoped></style>

vue3 递归组件 树形组件的更多相关文章

  1. vue2 递归组件--树形

    递归组件,官方给的教程太简便了,根本看不出到底怎么用.于是自己查网摸索了一下,这儿只把核心思想写出来. 效果如下图,点击后打开二级菜单,再点击后打开三级. //js //引子//思想:当v-if='f ...

  2. JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

    前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第 ...

  3. LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

    LayUi框架中树形组件tree官方还在持续完善中,目前最新版本为v2.5.5 官方树形组件目前还不支持懒加载方式,之前我修改一版是通过reload重载实例方法填充子节点数据方式,因为递归页面元素时存 ...

  4. 转:vue+element实现树形组件

    项目中需要用到树形组件,在网上发现一个用vue+element实现的树形组件,现在记录下: demo地址:https://github.com/wilsonIs/vue-treeSelect

  5. element-ui tree树形组件自定义实现可展开选择表格

    最近做项目遇到一个需求,表格里可以展开,可以选择,大概效果如下图: 一开始是在table组件里找方法,使用了表格的合并方法,效果是实现了,但是表格的多选每次触发时,都会执行好几次,而且没法实现一部分的 ...

  6. element中的树形组件,如何获取父级菜单的id

    一般多选的树形组件,使用getCheckedNodes()方法只能获取到本级的菜单id,只有在子菜单全部选中的情况下才会选中上级.但我们想要不全选中子级的情况下也要获取它的上级,甚至上上级等,怎么办呢 ...

  7. iview实战 : 树形组件自定义

    Tree树形组件是 iview 中相对复杂的一个组件. 自定义节点内容 使用强大的 Render 函数可以自定义节点显示内容和交互,比如添加图标,按钮等. ——官方文档 但官方的 example 只有 ...

  8. vue3 + vite实现异步组件和路由懒加载

    在 Vue2 中,异步组件和路由懒加载处理使用 import 就可以很轻松实现.但是在Vue 3.x 中异步组件的使用与 Vue 2.x 完全不同了.本文就详细讲讲vue3中异步组件和路由懒加载的实现 ...

  9. Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

    前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...

  10. 08 - Vue3 UI Framework - Input 组件

    接下来再做一个常用的组件 - input 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 input 组件有两种类型,即 input 和 textarea 类型 当类型为 ...

随机推荐

  1. C++面向对象编程之复合、委托和继承

    1.复合,表示has a template <typename T> calss A{ protected: B<T> c; } 这里表示 A 里面有一个 B,A 可以调用 B ...

  2. 聊聊Linux中CPU上下文切换

    目录 什么是CPU上下文 CPU上下文切换 上一任务的CPU上下文保存在哪? 进程上下文切换 内核空间和用户空间 top命令查看CPU资源 系统调用 进程上下文切换 和 系统调用的区别? 进程切换的常 ...

  3. emqx启用JWT令牌认证(包含hmac-based和public-key)

    emqx连接启用jwt令牌认证 jwt令牌 概述 JWT 即 JSON Web Tokens 是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519). 组成 令牌的形式 xxx ...

  4. 搭建MyBatis

    一.引入依赖 <dependencies> <!-- Mybatis核心 --> <dependency> <groupId>org.mybatis&l ...

  5. reportportal 集成 robotframework 自动化执行及结果可视化

    前言: 最近领导想了个需求,想把目前组内在linux平台上执行的自动化脚本搞成可视化,如果是web站点相关日志可视化倒是简单了,ELK就是不错的选择,大部分可视化项目这种的,可以做的开起来很炫. 我们 ...

  6. Vue 实现小小记事本

    1.实现效果 用户输入后按回车,输入的内容自动保存,下方会显示记录的条数,鼠标移动到文字所在div上,会显示删除按钮,点击按钮,相应记录会被删除,下方的记录条数会相应变化,点击clear,所有记录会被 ...

  7. shardingsphere-jdbc 水平分表学习记录

    放在自己博客里搬过来一份~ 前司使用的是自己魔改的TDDL,在家时间比较多就尝试学一些业内比较常用的中间件. 这里记录一下学习中遇到的一些问题. 环境 设置的比较简单(太懒了就测试了几个表), 两个分 ...

  8. android_studio 使用

    android studio安装 目前使用: android studio 4.1.3 Zip免安装版:android-studio-ide-201.7199119-windows413.zip an ...

  9. WebSocket心跳检测和重连机制

    1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两证情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...

  10. 不一样的纯H5C3动画爱心

    最近抖音很火的让你会计算机的朋友给你做个爱心突然火了,我也不出意外的收到了朋友的邀请,自己做肯定太麻烦了于是乎百度第一步,惊呆了!网上全都是一个爱心,变着法的火焰爱心,换汤不换药,那我们肯定是要整点不 ...