亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue實現的樹形結構加多選框示例

2019-11-19 12:10:40
字體:
來源:轉載
供稿:網友

本文實例講述了vue實現的樹形結構加多選框。分享給大家供大家參考,具體如下:

前面說了如何用遞歸組件來寫vue樹形結構,寫了樹形結構還要在前面加多選框,然后往數組里push選項,并在左邊顯示出來,然后左邊進行拖拽排序,拖拽排序上一篇文章我已經介紹過了,在這我就不介紹了,如何用阿里巴巴矢量圖標庫我也有相關文章,也不介紹了,本節主要介紹vue樹形結構加多選框,并實現一定的邏輯,比如全選,單選,全選和單選之間的聯動

先看下目錄結構

下面我直接貼下代碼

首先是pages文件夾中tree.vue頁面中引用組件

下面是tree.vue的代碼

<template>  <div class = "loginModuel">    <Tree :menus = "menus" :depth = "depth" @selectItem = "selectItem" :actId = "actId" @checkItem = "checkItem"></Tree>  </div></template><script src = "./index.js"></script><style lang = "scss" scoped src = "./index.scss"></style>

然后是tree.vue引入的index.js的代碼

import Tree from '../../components/tree/tree';import axios from 'axios';export default{  data(){    return{      msg:"這是登錄頁面",      depth:0,      menus:[],      actId:"",    }  },  components:{    Tree  },  methods:{    //用ajax獲取數據    getData(){      return axios.get('/static/json/data.json');    },    // 調用ajax函數    async getTree(){      var last = await this.getData();      if(last.data.code == 1){        this.menus = last.data.data;        //在每一項中添加selectArr和show        this.addShow(this.menus);      }    },    //遞歸函數在每一項中添加selectArr和show    addShow(arr){      for(var i = 0; i < arr.length;i++){        this.$set(arr[i],"show",true);        this.$set(arr[i],"selectArr",[]);        if(arr[i].userList && arr[i].userList.length > 0){          this.addShow(arr[i].userList)        }      }    },    //點擊箭頭使樹展開收縮    selectItem(data){      if(data.userList && data.userList.length > 0){        //如果此項下有userList且length大于0,則切換展開與折疊狀態        data.show = !data.show;      }else{        //如果此項下沒有userList或length等于0,則將選中的id賦值給actId        this.actId = data.id;      }    },    //進行多選勾選    checkItem(data){      if(data.selectArr.length > 0){        //如果這一項的selectArr有值,說明是被勾選狀態,要把selectArr清空,清空勾選        data.selectArr = [];        //如果此選項清空勾選后,如果下面有userList的話,那么也同時要清空        if(data.userList && data.userList.length > 0){          this.clearChild(data.userList);        }        //如果此選項清空勾選后,要把所有的父元素,也全部清空勾選,因為它不勾選了,所有父元素的狀態不可能還處于勾選狀態,不管它勾選不勾選,我們都要清除一遍,以防萬一        this.clearFather(this.menus,data);      }else{//如果這一項的selectArr為[],說明是未被勾選狀態,在selectArr里加id值,添加勾選        data.selectArr.push(data.id);        //如果此選項清空勾選后,如果下面有userList的話,那么也同時勾選下面所有的孩子        if(data.userList && data.userList.length > 0){          this.addChild(data.userList);        }        //如果此選項勾選后,要判斷所有的上級元素是不是應該全部打勾        this.selectFather(this.menus,data);      }    },    //定義函數清空所有孩子的勾選    clearChild(arr){      for(var i = 0; i < arr.length;i++){        arr[i].selectArr = [];        if(arr[i].userList && arr[i].userList.length > 0){          this.clearChild(arr[i].userList);        }      }    },    //定義函數添加所有孩子的勾選    addChild(arr){      for(var i = 0; i < arr.length;i++){        arr[i].selectArr.push(arr[i].id);        if(arr[i].userList && arr[i].userList.length > 0){          this.addChild(arr[i].userList);        }      }    },    //定義函數一層一層的往上尋找父元素的userList    clearFather(father,data){      for(var i = 0; i < father.length;i++){        if(father[i].id == data.id){          //找到data所在的userList為father,然后再通過這個userList找到擁有這個userList的父元素          this.clearRealFather(this.menus,father);        }else if(father[i].userList && father[i].userList.length > 0){          this.clearFather(father[i].userList,data);        }      }    },    //定義函數根據找到的上層父元素的userList來尋找父元素,并將他們清除勾選    clearRealFather(menus,arr){      for(var i = 0; i < menus.length;i++){        if(menus[i].userList == arr){          //找到這個擁有userList的父元素后,將此selectArr清空          menus[i].selectArr = [];          //找到這個擁有userList的父元素后,再調用clearFather,再進行向上尋找父元素,知道沒有父元素為止          this.clearFather(this.menus,menus[i]);        }else if(menus[i].userList && menus[i].userList.length > 0){          this.clearRealFather(menus[i].userList,arr);        }      }    },    //定義函數一層一層的往上尋找父元素的userList    selectFather(father,data){      for(var i = 0; i < father.length;i++){        if(father[i].id == data.id){          var arr = [];          for(var j = 0; j < father.length;j++){            if(father[j].selectArr.length > 0){              arr.push(father[i]);            }          }          //判斷此數組中是不是所有的selectArr都有值,如果有值,就執行selectRealFather,將上層父元素也勾選          if(arr.length == father.length){            this.selectRealFather(this.menus,father);          }        }else if(father[i].userList && father[i].userList.length > 0){          this.selectFather(father[i].userList,data);        }      }    },    //定義函數根據找到的上層父元素的userList來尋找父元素,并將他們清除勾選    selectRealFather(menus,arr){      for(var i = 0; i < menus.length;i++){        if(menus[i].userList == arr){          //找到這個擁有userList的父元素后,給selectArr賦值,使其勾選          menus[i].selectArr.push(menus[i].id);          //找到這個擁有userList的父元素后,再調用clearFather,再進行向上尋找父元素,知道沒有父元素為止          this.clearFather(this.menus,menus[i]);        }else if(menus[i].userList && menus[i].userList.length > 0){          this.selectRealFather(menus[i].userList,arr);        }      }    }  },  mounted(){    this.getTree();  }}

然后是樹形組件components文件夾中tree.vue的代碼

1.tree.vue

<template>  <ul class = "treeMoudel">    <li v-for = "(item,index) in menus" :key = "index">      <!-- 遍歷menus,如果傳過來的depth等于0,就添加topNode的class,如果不等于0,就添加noTopNode的class -->      <div :class = "{'itemTree':true,'topNode':depth == 0,'noTopNode':depth != 0,'active':actId == item.id}">        <!-- 判斷如果含有name字段就顯示name字段 -->        <span :style = "transform" v-if = "item.name" :class = "{'topSpan':depth == 0,'noTopSpan':depth != 0}">          <!-- 如果item有孩子且item.show為false,那么圖標為折疊圖標 -->          <i class = "el-icon-caret-right" v-if = "item.userList && item.userList.length > 0 && !item.show" @click = "selectItem(item)"></i>          <!-- 如果item有孩子且item.show為true,那么圖標為展開圖標 -->          <i class = "el-icon-caret-bottom" v-if = "item.userList && item.userList.length > 0 && item.show" @click = "selectItem(item)"></i>          <i class = "selectBox" @click = "checkItem(item)">            <!-- 如果item的selectArr.length是大于0的,也就是里面有值的話就是勾選狀態,否則就是不勾選狀態 -->            <i :class = "{'checkName iconfont':true, 'gouxuan5':item.selectArr.length > 0}" ></i>          </i>          {{item.name}}        </span>        <!-- 判斷如果含有username字段就顯示username字段 -->        <span :style = "transform" v-if = "item.username" :class = "{'topSpan':depth == 0,'noTopSpan':depth != 0}">          <!-- 如果item有孩子且item.show為false,那么圖標為折疊圖標 -->          <i class = "el-icon-caret-right" v-if = "item.userList && item.userList.length > 0 && !item.show" @click = "selectItem(item)"></i>          <!-- 如果item有孩子且item.show為true,那么圖標為展開圖標 -->          <i class = "el-icon-caret-bottom" v-if = "item.userList && item.userList.length > 0 && item.show" @click = "selectItem(item)"></i>          <i class = "selectBox" @click = "checkItem(item)">            <!-- 如果item的selectArr.length是大于0的,也就是里面有值的話就是勾選狀態,否則就是不勾選狀態 -->            <i :class = "{'checkUsername iconfont':true, 'gouxuan5':item.selectArr.length > 0}"></i>          </i>          {{item.username}}        </span>      </div>      <el-collapse-transition>        <!-- 遞歸組件就是自己調用自己,這里是在自己的組件內再次調用自己,但是務必要和pages中的tree頁面中使用的一模一樣才可以,否則樹不會生效 -->        <Tree v-if = "item.userList && item.userList.length > 0 && item.show" :menus = "item.userList" :depth = "depth+4" @selectItem = "selectItem" :actId = "actId" @checkItem = "checkItem"></Tree>      </el-collapse-transition>    </li>  </ul></template><script src = "./index.js"></script><style src = "./index.scss" lang = "scss" scoped></style>

2.tree.vue中引入的index.js

export default{  name:"Tree",  props:["menus","depth","actId"],  data(){    return{      msg:"這是二級菜單樹",    }  },  methods:{    // 將selectItem方法暴露出去    selectItem(item){      this.$emit("selectItem",item);    },    // 將checkItem方法暴露出去    checkItem(item){      this.$emit("checkItem",item);    }  },  computed:{    //通過傳過來的depth計算下級目錄的偏移量,這里我用的transform    transform(){      return 'transform:translateX(' + this.depth*10 + 'px)';    }  }}

3.tree.vue中引入的index.scss

.treeMoudel{  li{    .itemTree{      width: 100%;      padding-left:30px;      position: relative;      &:hover{        background:#2B9EEE;        color:#fff;      }      .selectBox{        display: inline-block;        width: 16px;        height:16px;        border:1px solid #ccc;        border-radius: 3px;        position: relative;        background: #fff;        top:2px;        .checkName{          position: absolute;          top:-16px;          left:0px;          color:#333;        }        .checkUsername{          position: absolute;          top:-12px;          left:0px;          color:#333;        }      }      span{        display: inline-block;        position: absolute;        font-size:14px;      }      .topSpan{        font-size:16px;      }      .noTopSpan{        font-size:14px;      }    }    .topNode{      height:55px;      line-height: 55px;      font-size:16px;      cursor: pointer;    }    .active{      background:#2B9EEE;      color:#fff;    }    .noTopNode{      height:45px;      line-height:45px;      &:hover{        background:#2B9EEE;        cursor: pointer;        color:#fff;      }    }  }}

看一下模擬數據的data.json長什么樣子吧

{  "code":1,  "data":[    {      "id":"1.2",      "name":"技術部",      "userList":[        {          "id":"788d",          "username":"html",          "role":"主管"        },        {          "id":"sda",          "username":"vue",          "role":"普通"        }      ]    },    {      "id":"1.3",      "name":"策劃部",      "userList":[        {          "id":"dsf",          "username":"jack",          "role":"主管"        },        {          "id":"asdf",          "username":"rose",          "role":"普通"        }      ]    }  ]}

至此,一個樹形組件加多選框就做好了

下面看下效果圖

ok,自此這一功能就實現啦,代碼講解我就不寫了,注釋里寫的清清楚楚的,看注釋就好啦!

希望本文所述對大家vue.js程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区久久久| 欧美激情三级免费| 久久久久久这里只有精品| 日韩成人激情视频| 国产精品男女猛烈高潮激情| 亚洲自拍另类欧美丝袜| 欧美成人免费小视频| 亚洲免费一级电影| 亚洲免费av电影| 色噜噜狠狠狠综合曰曰曰| 久久好看免费视频| 久久久影视精品| 日韩一区av在线| 综合久久五月天| 久久人体大胆视频| 久久中文字幕一区| 成人福利在线观看| 91免费看视频.| 久操成人在线视频| 国产精品久久精品| 欧美福利视频网站| 欧美精品日韩www.p站| 在线国产精品播放| 欧美劲爆第一页| 日韩精品视频在线观看网址| 91亚洲精品视频| 久久综合久中文字幕青草| 91亚洲精华国产精华| 亚洲福利视频久久| 日韩精品在线播放| 亚洲免费福利视频| 欧美激情免费观看| 久操成人在线视频| 一本色道久久综合狠狠躁篇的优点| 8050国产精品久久久久久| 亚洲国产私拍精品国模在线观看| 亚洲视频精品在线| 亚洲精品丝袜日韩| 亚洲国产精品成人va在线观看| 亚洲国产又黄又爽女人高潮的| 亚洲精品videossex少妇| 国产精品久久久久久久午夜| 免费91麻豆精品国产自产在线观看| 久久精品这里热有精品| 国内精品久久久久久久久| 欧美在线精品免播放器视频| 日韩精品极品在线观看播放免费视频| 欧美日韩xxx| 8x海外华人永久免费日韩内陆视频| 国产精品久久久久福利| 91老司机精品视频| 中文字幕亚洲天堂| 欧美激情中文字幕乱码免费| 插插插亚洲综合网| 91在线免费观看网站| 精品国产乱码久久久久久天美| 正在播放亚洲1区| 92福利视频午夜1000合集在线观看| 精品国产鲁一鲁一区二区张丽| 国产精品毛片a∨一区二区三区|国| 亚洲三级黄色在线观看| 91精品国产91久久久久久| 国产精品丝袜一区二区三区| 成人激情在线播放| 欧美亚洲国产视频| 久久久精品在线| 日本国产欧美一区二区三区| 欧美日韩激情小视频| 国产一区二区视频在线观看| 91久久精品一区| 精品一区二区三区四区在线| 精品视频在线播放免| 亚洲美女av黄| 成人av.网址在线网站| 国产a级全部精品| 日韩激情片免费| 91精品国产电影| 清纯唯美日韩制服另类| 国产欧美一区二区三区久久人妖| 精品国产户外野外| 日韩在线视频国产| 亚洲区一区二区| 亚洲国产精品悠悠久久琪琪| 欧美中文在线免费| 国产欧美在线看| 美日韩精品视频免费看| 一区二区福利视频| 久久精品91久久香蕉加勒比| 久久好看免费视频| 亚洲人成在线播放| 久久久精品2019中文字幕神马| 欧美成人在线免费视频| 亚洲欧美一区二区三区四区| 亚洲xxx自由成熟| 久久色在线播放| 3344国产精品免费看| 色中色综合影院手机版在线观看| 久久久亚洲国产| 精品久久中文字幕| 欧美午夜无遮挡| 国产精品久久久久久久久| 久久99精品久久久久久琪琪| 亚洲精品自拍偷拍| 国产精品美女主播在线观看纯欲| 亚洲精品丝袜日韩| 亚洲va久久久噜噜噜久久天堂| 欧美亚洲另类视频| 欧美日韩国产精品一区| 日韩欧美中文免费| 久久精品视频在线播放| 欧美性jizz18性欧美| 成人精品久久一区二区三区| 精品久久久久久亚洲国产300| 久99久在线视频| 伊人伊成久久人综合网站| 欧美黑人狂野猛交老妇| 日韩精品在线免费观看| 在线a欧美视频| 欧洲亚洲在线视频| 精品国产一区二区三区在线观看| 精品视频在线观看日韩| 亚州国产精品久久久| 久久久精品一区| 国产视频观看一区| 在线播放精品一区二区三区| 欧美综合激情网| 日韩美女主播视频| 91精品久久久久久久久中文字幕| 欧美激情精品久久久久久变态| 国产欧美日韩免费| 一本色道久久综合亚洲精品小说| 国产精品久久久久久久久男| 91精品国产色综合久久不卡98口| 国产亚洲精品日韩| 不卡在线观看电视剧完整版| 亚洲激情国产精品| 国产一区深夜福利| 久久久女人电视剧免费播放下载| 亚洲aa中文字幕| 成人欧美一区二区三区在线湿哒哒| 国产成人精品视频在线观看| 欧美一区二区色| 国产在线观看精品一区二区三区| 欧美人与性动交a欧美精品| 久久久在线免费观看| 日韩av大片在线| 琪琪亚洲精品午夜在线| 一区二区三区视频观看| 久久偷看各类女兵18女厕嘘嘘| 亚洲欧美日韩天堂| 日韩免费黄色av| 国产在线久久久| 26uuu另类亚洲欧美日本一| 亚洲成人激情图| 国产精品久久久久久久久久免费| 国产美女精品免费电影| 亚洲区中文字幕| 欧美日韩午夜视频在线观看| 一个人看的www欧美| 午夜精品久久久99热福利| 精品亚洲国产成av人片传媒| 欧美专区在线观看| 一区二区在线视频| 国产精品久久久久av免费|