vue3遞歸組件---樹形組件

第一種方式,直接自己調用自己

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>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux如何清空文件內容

在做系統運維工作時&#xff0c;有時會發現一個問題&#xff1a;某些存儲空間的使用率過高。換句話說就是空間快被堆滿了&#xff0c;需要釋放空間。大多數情況下&#xff0c;導致空間不足的罪魁禍首通常是一些log日志文件。對于某些特殊系統來說&#xff0c;日志文件還不能直接…

AGM離線下載器使用說明

AGM專用離線下載器示意圖&#xff1a; 供電方式&#xff1a; 通過 USB 接口給下載器供電&#xff0c;跳線 JP 斷開。如果客戶 PCB 的 JTAG 口不能提供 3.3V 電源&#xff0c;或僅需燒寫下載器&#xff0c;尚未連接用戶 PCB 時&#xff0c;采用此種方式供電。 或者&#xff1a…

Linux中的網絡時間服務器

本章主要介紹網絡時間的服務器 使用chrony配置時間服務器配置chrony客戶端服務器同步時間 1.1 時間同步的重要性 一些服務對時間要求非常嚴格&#xff0c;例如如圖所示的由三臺服務器搭建的ceph集群 這三臺服務器的時間必須保持一致&#xff0c;如果不一致&#xff0c;就會顯…

Django講課筆記01:初探Django框架

文章目錄 一、學習目標二、課程導入&#xff08;一&#xff09;課程簡介&#xff08;二&#xff09;課程目標&#xff08;三&#xff09;適用人群&#xff08;四&#xff09;教學方式&#xff08;五&#xff09;評估方式&#xff08;六&#xff09;參考教材 三、新課講授&#…

android項目實戰之編輯器集成

引言 項目需要用到編輯器&#xff0c;采用RichEditor&#xff0c;如下效果 實現 1. 引入庫2 implementation jp.wasabeef:richeditor-android:2.0.0 2. XML <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width&q…

LeetCode:2008. 出租車的最大盈利(dp C++)

目錄 2008. 出租車的最大盈利 題目描述&#xff1a; 實現代碼與解析&#xff1a; DP 二分&#xff08;兩種寫法&#xff09; 原理思路&#xff1a; 2008. 出租車的最大盈利 題目描述&#xff1a; 你駕駛出租車行駛在一條有 n 個地點的路上。這 n 個地點從近到遠編號為 1 …

如何使用 Wordpress?托管, 網站, 插件, 緩存

這是該系列教程的第一個教程&#xff0c;最終將在運行高性能 LEMP 堆棧的阿里云 ECS 實例上運行一個新的 WordPress 站點。 在本教程中&#xff0c;我們將創建一個運行 Ubuntu 16.04 的實例&#xff0c;然后通過創建超級用戶并禁用 root 登錄來保護服務器&#xff0c;最后配置…

持續集成交付CICD:使用Maven命令下載Nexus制品

目錄 一、實驗 1.Maven安裝 2.Nexus搭建公共組倉庫及Maven全局配置文件 3.使用Maven命令下載Nexus制品 一、實驗 1.Maven安裝 &#xff08;1&#xff09;CentOS環境安裝步驟 tar -xf apache-maven-3.8.6-bin.tar.gz #解壓 mv apache-maven-3.8.6 /usr/local/maven #移動…

如何進行更好的面試回復之緩存函數在項目中的性能優化?

緩存函數是一種提高函數性能的技術&#xff0c;在函數被調用時&#xff0c;會將計算結果緩存起來&#xff0c;以便在后續的調用中直接返回緩存的結果&#xff0c;從而減少了重復計算的時間。 緩存函數的實現通常包括兩個步驟&#xff1a; 判斷緩存是否存在&#xff1a;在函數被…

提取視頻光流成幀并寫入視頻中

修改一下配置文件就可以運行了 配置文件 config.py video_path xxxx/dataset/data/huaping/BXDQ05-花屏-1.mp4#要處理的視頻路徑 frame_path xxxx/dataset/frame#處理成幀之后保存的路徑 flow_path xxxx/dataset/flow#處理成光流之后保存的路徑 save_video_path xxxx/fe…

自動補全的 select antd react

自動補全的 select antd react 文檔&#xff1a;自動補全的 select antd react.note 鏈接&#xff1a;http://note.youdao.com/noteshare?idf5e4a93d2b9d6be8e459edd4eb86323b&sub19796E9BC04D4ABD9ACE325FDFF59B0E 添加鏈接描述 import React, { useState, useRef } from…

【1day】泛微e-office OA系統xml.php 文件 SORT_ID 參數 SQL 注入漏洞學習

注:該文章來自作者日常學習筆記,請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與作者無關。 目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現

理解傳統模式與互聯網時代 消費行為模型 AIDMA , AISAS , SICAS

1 AIDMA與AISAS 消費行為模型&#xff0c;以及所誕生的IT崗位 1.1 傳統市場營銷消費行為模型 AIDMA模型&#xff1a;Attention&#xff08;吸引&#xff09;&#xff0c;Interest &#xff08;興趣&#xff09;&#xff0c;Desire&#xff08;欲望&#xff09; &#xff0c;Me…

LeetCode 76. 最小覆蓋子串 滑動窗口框架

雙指針的特殊應用&#xff1a;滑動窗口 代碼 題目鏈接&#xff1a;https://leetcode.cn/problems/minimum-window-substring/description/ 不說廢話&#xff0c;直接貼代碼&#xff1a; static string minWindow(string s, string t) {// need記錄需要匹配的字符串t中每個字…

? Mac IDEA使用并運行項目

? IDEA導入項目并運行 Mac IDEA使用 (1) 倉庫導入 通過獲取giett倉庫包的url&#xff0c;在idea中導入項目 在gitee里獲取項目的ur打開idea&#xff0c;點擊 File->new->Project from Version Control (2) 創建數據庫ry并導入數據腳本 &#xff08;3&#xff09;修改配…

華為配置Smart Link主備備份示例

定義 Smart Link&#xff0c;又叫做備份鏈路。一個Smart Link由兩個接口組成&#xff0c;其中一個接口作為另一個的備份。Smart Link常用于雙上行組網&#xff0c;提供可靠高效的備份和快速的切換機制。 Monitor Link是一種接口聯動方案&#xff0c;它通過監控設備的上行接口…

npm私有源構建項目下載依賴報錯

Jenkins構建項目報錯&#xff0c;依賴找不到 Error: Couldnt find any versions for "babel/helper-module-imports" that matches "^7.22.15"at MessageError.ExtendableBuiltin (/data1/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util當中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加載這個log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

高性能和多級高可用,云原生數據庫 GaiaDB 架構設計解析

1 云原生數據庫和 GaiaDB 目前&#xff0c;云原生數據庫已經被各行各業大規模投入到實際生產中&#xff0c;最終的目標都是「單機 分布式一體化」。但在演進路線上&#xff0c;當前主要有兩個略有不同的路徑。 一種是各大公有云廠商選擇的優先保證上云兼容性的路線。它基于存…

考研真題數據結構

【2021年山西大學真題】將二叉樹中所有非終端結點的左右子樹交換位置&#xff0c;可以得到原二叉樹的 鏡像二叉樹&#xff0c;如圖。假設二叉樹的存儲形式為&#xff08;lchild&#xff0c;data&#xff0c;rchild&#xff09;&#xff0c;給出求鏡像二叉樹的算法: &#xff0…