" />

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

vue開發(fā)樹形結構組件(組件遞歸)

 更新時間:2022年09月01日 10:50:16   作者:駿骨銀蹄  
這篇文章主要為大家詳細介紹了vue開發(fā)樹形結構組件的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了vue開發(fā)樹形結構組件的具體代碼,供大家參考,具體內容如下

需求

一個頁面,要顯示商品分類,同時每個分類下面還擁有若干子類,子類也可以有子類。

要實現(xiàn)全選單選,子類被逐個全選父類也要標記選中。

第一反應就是樹形結構,和遞歸調用。曾經在做WPF時記得有現(xiàn)成的組件,也學著寫過對應的后臺。這次我要自己寫一個前端的組件了。

這只是我自己花了點時間寫的一個vue組件,尚可優(yōu)化及拓展。僅此與大家分享一下。

效果

實現(xiàn)

<template>
  <div id="TreeMenu">
    <div v-for="(node, index) in nodes" :class="{'TreeMenu-row-border-bottom': !depth}">
      <div class="TreeMenu-row">
        <img class="TreeMenu-row-selectimg" src="../assets/img/MembersPriceActivity/selected.png" @click="selectNode(0,node)" v-show="node.IsSelected"/>
        <img class="TreeMenu-row-selectimg" src="../assets/img/MembersPriceActivity/select.png" @click="selectNode(1,node)" v-show="!node.IsSelected"/>
        <div class="TreeMenu-row-firstdiv" :class="{'TreeMenu-row-border-bottom': node.ChildTypeList&&node.IsExpanded }"  @click="expandNode(!node.IsExpanded,node)">
          <label v-text="node.Name"></label>
          <img class="TreeMenu-row-arrowimg" src="../assets/img/MembersPriceActivity/top.png" v-if="node.ChildTypeList" v-show="!node.IsExpanded">
          <img class="TreeMenu-row-arrowimg" src="../assets/img/MembersPriceActivity/down.png" v-if="node.ChildTypeList" v-show="node.IsExpanded">
        </div>
        <TreeMenu :nodes="node.ChildTypeList" :fatherIndex="index" :depth="depth+1" v-on:selectFatherNode="selectFatherNode" v-if="node.ChildTypeList" v-show="!node.IsExpanded"></TreeMenu>
      </div>
    </div>
  </div>
</template>

js:

<script>
  export default{
    name: 'TreeMenu',
    data () {
      return {
        goodstype: {
          ID: '',
          ParentID: '',
          Name: '',
          Code: '',
          Level: 0,
          ImgUrl: null,
          ChildTypeList: []
        }
      }
    },
    props: {
      nodes: {
        type: Array,
        default: () => {
          return []
        }
      },
      fatherIndex: {
        type: Number,
        default: 0
      },
      depth: {
        type: Number,
        default: 0
      }
    },
    watch: {},
    created () {},
    mounted () {},
    destroyed () {},
    methods: {
      // 選中/取消 當前節(jié)點
      selectNode (choice, node) {
        node.IsSelected = choice
        this.selectChildrenNode(choice, node.ChildTypeList || [])
        this.$emit('selectFatherNode', choice, this.fatherIndex, this.nodes.every((node) => { return node.IsSelected === choice }))
      },
      // 子節(jié)點修改選中狀態(tài)
      selectChildrenNode (choice, nodes, self) {
        let _self = self || this
        nodes.forEach((node) => { node.IsSelected = choice; _self.selectChildrenNode(choice, node.ChildTypeList || [], _self) })
      },
      // 作為父級節(jié)點檢查是否需要修改選中狀態(tài)(僅用于子節(jié)點調用)
      selectFatherNode (choice, index, childrenState) {
        if (choice) {
          // 若其[Index]節(jié)點下子節(jié)點均為被選中狀態(tài),該[Index]節(jié)點就應該被選中
          if (childrenState) {
            this.nodes[index].IsSelected = choice
            this.$emit('selectFatherNode', choice, this.fatherIndex, this.nodes.every((node) => { return node.IsSelected === choice }))
          }
        } else {
          // 若其[Index]節(jié)點下子節(jié)點有未被選中狀態(tài)的,該[Index]節(jié)點就應該未選中
          this.nodes[index].IsSelected = choice
          this.$emit('selectFatherNode', choice, this.fatherIndex, false)
        }
      },
      // 展開/收起 當前節(jié)點
      expandNode (choice, node) {
        node.IsExpanded = choice
        if (!choice) {
          this.expandChildrenNode(choice, node.ChildTypeList)
        }
      },
      // 子節(jié)點收起
      expandChildrenNode (choice, nodes, self) {
        let _self = self || this
        nodes.forEach((node) => { node.IsExpanded = choice; _self.expandChildrenNode(choice, node.ChildTypeList || [], _self) })
      }
    }
  }
</script>

CSS:

<style lang="scss" scoped>
  #TreeMenu {
    .TreeMenu-row{
      margin-left: 30px;
      font-size: 15px;
      padding: 12px 0 0 0;
    }
    .TreeMenu-row-firstdiv{
      height: 32px;
      margin-left: 30px;
    }
    .TreeMenu-row-arrowimg{
      float: right;
      margin-right: 15px;
      width: 13px;
    }
    .TreeMenu-row-selectimg{
      float: left;
      width: 18px;
      vertical-align: text-bottom;
    }
    .TreeMenu-row-border-bottom{
      border-bottom: solid 1px #e6e6e6;
    }
    .TreeMenu-row-border-top{
      border-top: solid 1px #e6e6e6;
    }
  }
</style>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Vue-cli 移動端布局和動畫使用詳解

    Vue-cli 移動端布局和動畫使用詳解

    這篇文章主要介紹了Vue-cli和移動端布局和動畫使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue中導入excel文件的兩種方式及使用步驟

    Vue中導入excel文件的兩種方式及使用步驟

    這篇文章主要介紹了Vue中導入excel文件的兩種方式,大概有兩種導入文件的方法:form表單和el-upload,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • vue打包后修改配置后端IP地址、端口等信息兩種方法

    vue打包后修改配置后端IP地址、端口等信息兩種方法

    這篇文章主要給大家介紹了關于vue打包后修改配置后端IP地址、端口等信息的兩種方法,文中通過代碼示例以及圖文介紹的非常詳細,對大家學習或者使用vue打包具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • vue實現(xiàn)下拉框二級聯(lián)動效果的實例代碼

    vue實現(xiàn)下拉框二級聯(lián)動效果的實例代碼

    這篇文章主要介紹了vue實現(xiàn)下拉框二級聯(lián)動效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • vue中回調函數(shù)(callback)的用法舉例

    vue中回調函數(shù)(callback)的用法舉例

    這篇文章主要給大家介紹了關于vue中回調函數(shù)(callback)的用法舉例,所謂的回調函數(shù),就是由調用函數(shù)提供執(zhí)行代碼,被調用函數(shù)執(zhí)行完畢之后,再自動執(zhí)行的一個函數(shù),需要的朋友可以參考下
    2023-08-08
  • 用Vue.js在瀏覽器中實現(xiàn)裁剪圖像功能

    用Vue.js在瀏覽器中實現(xiàn)裁剪圖像功能

    在本教程中,我們將探討如何在瀏覽器中使用 JavaScript 庫來操作圖片,為服務器上的存儲做準備,并在 Web 程序中使用。我們將使用 Vue.js 而不是原生 JavaScript來完成此操作,需要的朋友可以參考下
    2019-06-06
  • vue組件傳值的實現(xiàn)方式小結【三種方式】

    vue組件傳值的實現(xiàn)方式小結【三種方式】

    這篇文章主要介紹了vue組件傳值的實現(xiàn)方式,結合實例形式總結分析了vue.js組建傳值的三種實現(xiàn)方式,包括父傳子、子傳父及非父子傳值,需要的朋友可以參考下
    2020-02-02
  • Vue?組件上的v-model雙向綁定原理解析

    Vue?組件上的v-model雙向綁定原理解析

    這篇文章主要介紹了Vue?組件上的v-model雙向綁定原理,從本文的學習可以知道組件上v-model指令的本質也是生成了value屬性和input事件,具體實例代碼跟隨小編一起看看吧
    2022-05-05
  • 解決vue elementUI 使用el-select 時 change事件的觸發(fā)問題

    解決vue elementUI 使用el-select 時 change事件的觸發(fā)問題

    這篇文章主要介紹了解決vue elementUI 使用el-select 時 change事件的觸發(fā)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue項目中使用jsonp抓取跨域數(shù)據(jù)的方法

    Vue項目中使用jsonp抓取跨域數(shù)據(jù)的方法

    這篇文章主要介紹了Vue項目中使用jsonp抓取跨域數(shù)據(jù)的方法,本文通過實例代碼講解的非常詳細,需要的朋友可以參考下
    2019-11-11

最新評論

安康市| 柏乡县| 瑞昌市| 贵溪市| 汤原县| 正宁县| 油尖旺区| 台东市| 洛川县| 苍溪县| 汉川市| 五原县| 响水县| 色达县| 博野县| 宁明县| 三原县| 绥化市| 平阳县| 上饶县| 三台县| 乌拉特前旗| 龙南县| 若尔盖县| 大悟县| 柘城县| 衡东县| 名山县| 平乡县| 吉林市| 祁门县| 封丘县| 会同县| 万源市| 凤翔县| 隆林| 华安县| 蓬莱市| 桐乡市| 富阳市| 阿城市|