最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

uni-app無限級樹形組件簡單實現(xiàn)代碼

 更新時間:2025年01月13日 11:02:50   作者:洗發(fā)水很好用  
文章介紹了如何在uni-app中簡單封裝一個無限級樹形組件,該組件可以無線嵌套,展開和收縮,并獲取子節(jié)點數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

       因為項目一些數(shù)據(jù)需要樹形展示,但是官網(wǎng)組件沒有?,F(xiàn)在簡單封裝一個組件在app中使用,可以無線嵌套,展開,收縮,獲取子節(jié)點數(shù)據(jù)等。

簡單效果

組件TreeData

<template>
  <view class="tree">
    <template v-for="(node, index) in treeData">
      <view>
        <span @click="toggleNode($event, node)">
          <uni-icons
            v-if="node.children && node.children.length > 0"
            :type="node.expanded ? 'arrowdown' : 'arrowright'"
            size="14"
          ></uni-icons>
          {{ node.label }}
        </span>
        <span
          @click.stop="deleteNode($event, node)"
          class="action-button delete-button"
          >刪除</span
        >
        <span
          @click.stop="editNode($event, node)"
          class="action-button edit-button"
          >編輯</span
        >
        <view v-if="node.expanded" class="children">
          <Tree
            :treeData="node.children"
            @edit-node="(childNode) => $emit('edit-node', childNode)"
            @delete-node="(childNode) => $emit('delete-node', childNode)"
          />
        </view>
      </view>
    </template>
  </view>
</template>
<script>
export default {
  name: "Tree",
  props: {
    treeData: {
      type: Array,
      default: () => [],
    },
    expandAll: {
      type: Boolean,
      default: true,
    },
  },
  data() {
    return {
      init: false,
    };
  },
  watch: {
    treeData: {
      immediate: true,
      handler(newData) {
        if (!this.init) {
          this.initializeTreeData(newData, this.expandAll);
          this.init = true;
        }
      },
    },
  },
  methods: {
    initializeTreeData(nodes, expanded) {
      nodes.forEach((node) => {
        this.$set(node, "expanded", expanded); // 使用 $set 確保響應(yīng)式
        if (node.children && node.children.length > 0) {
          this.initializeTreeData(node.children, expanded); // 遞歸處理子節(jié)點
        }
      });
    },
    toggleNode(event, node) {
      event.stopPropagation(); // 阻止事件冒泡
      node.expanded = !node.expanded; // 切換節(jié)點展開狀態(tài)
    },
    editNode(event, node) {
      event.stopPropagation();
      this.$emit("edit-node", node); // 觸發(fā)父組件的 edit-node 事件,并傳遞當(dāng)前節(jié)點
    },
    deleteNode(event, node) {
      event.stopPropagation();
      this.$emit("delete-node", node); // 觸發(fā)父組件的 delete-node 事件,并傳遞當(dāng)前節(jié)點
    },
  },
};
</script>
  <style scoped>
.tree {
  padding-left: 15px;
}
.children {
  padding-left: 15px;
}
.tree-node {
  display: flex;
  align-items: center;
}
.action-button {
  cursor: pointer;
  margin-left: 10px;
  color: #409eff;
}
.edit-button {
  float: right;
}
.delete-button {
  float: right;
}
</style>

在頁面中使用...

<template>
  <view class="page">
    <Tree
      :treeData="treeData"
      :expandAll="expandAll"
      @edit-node="handleEditNode"
      @delete-node="handleDeleteNode"
    />
  </view>
</template>
<script>
import Tree from "@/components/TreeData";
export default {
  components: {
    Tree,
  },
  data() {
    return {
      treeData: [
        {
          label: "根節(jié)點 1",
          children: [
            {
              label: "子節(jié)點 1-1",
              children: [
                {
                  label: "子節(jié)點 1-1-1",
                  children: [],
                },
                {
                  label: "子節(jié)點 1-1-2",
                  children: [],
                },
              ],
            },
            {
              label: "子節(jié)點 1-2",
              children: [],
            },
          ],
        },
        {
          label: "根節(jié)點 2",
          children: [
            {
              label: "子節(jié)點 2-1",
              children: [],
            },
          ],
        },
      ],
      expandAll: true, // 控制是否全部展開
    };
  },
  methods: {
    handleEditNode(node) {
      console.log("編輯節(jié)點", node);
      // 處理編輯節(jié)點的邏輯
    },
    handleDeleteNode(node) {
      console.log("刪除節(jié)點", node);
      // 處理刪除節(jié)點的邏輯
    },
  },
};
</script>
<style scoped>
page {
  background-color: #f5f6f8;
}
.page {
  padding: 20px;
}
</style>

到此這篇關(guān)于uni-app無限級樹形組件簡單實現(xiàn)的文章就介紹到這了,更多相關(guān)uni-app無限級樹形組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從入門到精通詳解Vue如何實現(xiàn)防止重復(fù)提交

    從入門到精通詳解Vue如何實現(xiàn)防止重復(fù)提交

    作為經(jīng)歷過大型項目洗禮的前端工程師,小編深知重復(fù)提交問題絕非簡單的按鈕禁用就能解決,今天,就將帶大家構(gòu)建一套生產(chǎn)級的重復(fù)提交防御體系,涵蓋從基礎(chǔ)到架構(gòu)的全套方案
    2025-06-06
  • 基于vue的video播放器的實現(xiàn)示例

    基于vue的video播放器的實現(xiàn)示例

    這篇文章主要介紹了基于vue的video播放器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue如何遍歷data所有變量并賦值

    vue如何遍歷data所有變量并賦值

    這篇文章主要介紹了vue如何遍歷data所有變量并賦值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3.0?router路由跳轉(zhuǎn)傳參問題(router.push)

    vue3.0?router路由跳轉(zhuǎn)傳參問題(router.push)

    這篇文章主要介紹了vue3.0?router路由跳轉(zhuǎn)傳參問題(router.push),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Vue實現(xiàn)動態(tài)路由的示例詳解

    Vue實現(xiàn)動態(tài)路由的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)動態(tài)路由的相關(guān)知識,主要涉及到兩個方面:一是路由的動態(tài)添加,二是基于路由的參數(shù)變化來動態(tài)渲染組件,下面就跟隨小編一起深入學(xué)習(xí)一下動態(tài)路由的實現(xiàn)吧
    2024-02-02
  • vue項目開發(fā)中setTimeout等定時器的管理問題

    vue項目開發(fā)中setTimeout等定時器的管理問題

    這篇文章主要介紹了vue項目開發(fā)中setTimeout等定時器的管理問題,需要的朋友可以參考下
    2018-09-09
  • vue自定義彈框效果(確認(rèn)框、提示框)

    vue自定義彈框效果(確認(rèn)框、提示框)

    這篇文章主要為大家詳細(xì)介紹了vue自定義彈框,實現(xiàn)確認(rèn)框、提示框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Vue?vant使用ImagePreview實現(xiàn)預(yù)覽圖片

    Vue?vant使用ImagePreview實現(xiàn)預(yù)覽圖片

    這篇文章主要介紹了Vue?vant使用ImagePreview實現(xiàn)預(yù)覽圖片,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue項目中mock.js的使用及基本用法

    vue項目中mock.js的使用及基本用法

    mockjs是用來模擬產(chǎn)生一些虛擬的數(shù)據(jù),可以讓前端在后端接口還沒有開發(fā)出來時獨立開發(fā)。這篇文章主要介紹了vue項目中mock.js的使用,需要的朋友可以參考下
    2019-05-05
  • Vue計算屬性與監(jiān)視屬性詳細(xì)分析使用

    Vue計算屬性與監(jiān)視屬性詳細(xì)分析使用

    computed是vue的配置選項,它的值是一個對象,其中可定義多個計算屬性,每個計算屬性就是一個函數(shù),下面這篇文章主要給大家介紹了關(guān)于vue中計算屬性computed的詳細(xì)講解,需要的朋友可以參考下
    2022-11-11

最新評論

凤山市| 怀来县| 资中县| 昌都县| 莱芜市| 德清县| 沁阳市| 汤原县| 五华县| 收藏| 开封市| 叙永县| 冷水江市| 襄汾县| 武定县| 元江| 乌兰察布市| 安达市| 昂仁县| 新民市| 大邑县| 石林| 乡城县| 榆社县| 广水市| 定西市| 石景山区| 固原市| 南丰县| 方城县| 报价| 上蔡县| 红河县| 多伦县| 呼玛县| 普兰店市| 邛崃市| 莱西市| 高唐县| 涡阳县| 柯坪县|