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

首頁 > 編程 > JavaScript > 正文

vue+element UI實現樹形表格帶復選框的示例代碼

2019-11-19 11:46:13
字體:
來源:轉載
供稿:網友

一:在component文件夾下新建如下treeTable文件夾,里面有2個文件:

eval.js:將數據轉換成樹形數據

/** * @Author: jianglei * @Date: 2017-10-12 12:06:49 */"use strict";import Vue from "vue";export default function treeToArray( data, expandAll, parent = null, level = null) { let tmp = []; Array.from(data).forEach(function(record) { if (record._expanded === undefined) {  Vue.set(record, "_expanded", expandAll); } let _level = 1; if (level !== undefined && level !== null) {  _level = level + 1; } Vue.set(record, "_level", _level); // 如果有父元素 if (parent) {  Vue.set(record, "parent", parent); } tmp.push(record); if (record.child && record.child.length > 0) {  const child = treeToArray(record.child, expandAll, record, _level);  tmp = tmp.concat(child); } }); return tmp;}

index.vue:樹形表格組件

<template> <el-table ref="multipleTable" :data="formatData" :row-style="showRow" v-bind="$attrs"> <!-- @header-click="chooseall" --> <el-table-column :render-header="renderHeader" width="50" align="center">  <template slot-scope="scope">  <el-checkbox v-model="scope.row.checks" @change="toselect(scope.row)"></el-checkbox>  </template> </el-table-column> <el-table-column v-if="columns.length===0" width="150">  <template slot-scope="scope">  <span v-for="space in scope.row._level" :key="space" class="ms-tree-space"/>  <span v-if="iconShow(0,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">   <i v-if="!scope.row._expanded" class="el-icon-plus"/>   <i v-else class="el-icon-minus"/>  </span>  {{ scope.$index }}  </template> </el-table-column> <el-table-column v-for="(column, index) in columns" v-else :key="column.value" :label="column.text" :width="column.width">  <template slot-scope="scope">  <!-- Todo -->  <!-- eslint-disable-next-line vue/no-confusing-v-for-v-if -->  <span v-for="space in scope.row._level" v-if="index === 0" :key="space" class="ms-tree-space"/>  <span v-if="iconShow(index,scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">   <i v-if="!scope.row._expanded" class="el-icon-plus"/>   <i v-else class="el-icon-minus"/>  </span>  {{ scope.row[column.value] }}  </template> </el-table-column> <slot/> </el-table></template> <script>/** Auth: Lei.j1ang Created: 2018/1/19-13:59*/import treeToArray from "./eval";export default { name: "TreeTable", data() { return {  chooseson: true, //全選  key: true //單個點擊直到全部選中 }; }, props: { /* eslint-disable */ data: {  type: [Array, Object],  required: true }, columns: {  type: Array,  default: () => [] }, evalFunc: Function, evalArgs: Array, expandAll: {  type: Boolean,  default: false } }, computed: { // 格式化數據源 formatData: function() {  let tmp;  if (!Array.isArray(this.data)) {  tmp = [this.data];  } else {  tmp = this.data;  }  const func = this.evalFunc || treeToArray;  const args = this.evalArgs  ? [tmp, this.expandAll].concat(this.evalArgs)  : [tmp, this.expandAll];  return func.apply(null, args); } }, methods: { showRow: function(row) {  const show = row.row.parent  ? row.row.parent._expanded && row.row.parent._show  : true;  row.row._show = show;  return show  ? "animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;"  : "display:none;"; }, // 切換下級是否展開 toggleExpanded: function(trIndex) {  const record = this.formatData[trIndex];  record._expanded = !record._expanded; }, // 圖標顯示 iconShow(index, record) {  return index === 0 && record.child && record.child.length > 0; },  //設置表頭全選 renderHeader(h, data) {  return h("span", [  h("input", {   attrs: {   id: "chooseall",   type: "checkbox",   style:    "border: 1px solid #dcdfe6;border-radius: 2px;box-sizing: border-box;width: 14px;height: 14px;background-color: #fff;"   }  })  ]); }, //功能函數:選中部分子集 setchildtobeselect(arr, key) {  arr.forEach((v, i) => {  v.checks = key;  // v._expanded = key;//選中后展開子項  if (v.child) {   this.setchildtobeselect(v.child, v.checks);  }  }); }, //是否所有的都被選中 isallchecked(arr) {  arr.forEach((v, i) => {  if (!v.checks) {   this.key = false;  }  if (v.child) {   this.isallchecked(v.child);  }  }); }, //設置父級為 未選中狀態(父級的父級沒改變-有bug) setparentfalse(arr, id, level) {  arr.forEach((v, i) => {  if (v._level == level - 1 && v.child) {   v.child.forEach((val, ind) => {   if (val.id == id) {    v.checks = false;    return false; //終止此次循環,減少循環次數   }   });  }  if (v.child) {   this.setparentfalse(v.child, id, level);  }  }); }, //設置父級為 選中狀態 setparenttrue(arr, id, level) {  arr.forEach((v, i) => {  if (v._level == level - 1 && v.child) {   let key = true;   let sameidkey = false;   v.child.forEach((val, ind) => {   if (val.id == id) {    //確保當前點擊的在該父級內    sameidkey = true;   }   if (!val.checks) {    key = false;   }   });   if (key && sameidkey) {   v.checks = true;   }  }  if (v.child) {   this.setparentfalse(v.child, id, level);  }  }); }, //某個復選框被點擊時 toselect(row) {  console.log(row);  // row._expanded = row.checks;//選中后是否展開  //1、若有子集先讓子選中  if (row.child) {  this.setchildtobeselect(row.child, row.checks);  }  //2、然后判斷是否全選中  this.key = true; //重置為true,防止上次已經是false的狀態  this.isallchecked(this.formatData);  //3、設置多選框的狀態  if (!row.checks) {  this.setparentfalse(this.formatData, row.id, row._level); //設置父級選中的狀態為false  document.getElementById("chooseall").checked = false; //設置全選框的狀態  } else {  this.setparenttrue(this.formatData, row.id, row._level); //設置父級選中的狀態為true  }  if (this.key) {  document.getElementById("chooseall").checked = true; //設置全選框的狀態  } } }, mounted() { this.$nextTick(() => {  var that = this;  const all = document.getElementById("chooseall");  all.onchange = function(e) {  console.log(all.checked);  if (all.checked == true) {   that.setchildtobeselect(that.formatData, true);  } else {   that.setchildtobeselect(that.formatData, false);  }  }; }); }};</script><style rel="stylesheet/css">@keyframes treeTableShow { from { opacity: 0; } to { opacity: 1; }}@-webkit-keyframes treeTableShow { from { opacity: 0; } to { opacity: 1; }}</style> <style scoped>.ms-tree-space { position: relative; top: 1px; display: inline-block; font-style: normal; font-weight: 400; line-height: 1; width: 18px; height: 14px;}.ms-tree-space::before { content: "";}.processContainer { width: 100%; height: 100%;}table td { line-height: 26px;}.tree-ctrl { position: relative; cursor: pointer; color: #2196f3; margin-left: -18px;}</style>

二:在需要的地方引入該組件:

例如:在component文件夾下新建a.vue:

<tree-table :data="data" :columns="columns" border/>
import treeTable from "./TreeTable";components: { treeTable },data() { return {  columns: [  {   text: "事件",   value: "event",   width: 200  },  {   text: "ID",   value: "id"  }  ],  data: [  {   id: 0,   event: "事件1",   timeLine: 50,   comment: "無"  },  {   id: 1,   event: "事件1",   timeLine: 100,   comment: "無",   children: [   {    id: 2,    event: "事件2",    timeLine: 10,    comment: "無"   },   {    id: 3,    event: "事件3",    timeLine: 90,    comment: "無",    children: [    {     id: 4,     event: "事件4",     timeLine: 5,     comment: "無"    },    {     id: 5,     event: "事件5",     timeLine: 10,     comment: "無"    },    {     id: 6,     event: "事件6",     timeLine: 75,     comment: "無",     children: [     {      id: 7,      event: "事件7",      timeLine: 50,      comment: "無",      children: [      {       id: 71,       event: "事件71",       timeLine: 25,       comment: "xx"      },      {       id: 72,       event: "事件72",       timeLine: 5,       comment: "xx"      },      {       id: 73,       event: "事件73",       timeLine: 20,       comment: "xx"      }      ]     },     {      id: 8,      event: "事件8",      timeLine: 25,      comment: "無"     }     ]    }    ]   }   ]  }  ] }; },

最終效果:

這樣就大工告成了,想要了解更多,可以關注 vue-element-admin,一個很不錯的后臺管理模版

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内揄拍国内精品少妇国语| 97视频国产在线| 久久久久久久久91| 国产精品丝袜久久久久久高清| 最新国产成人av网站网址麻豆| 日韩免费观看在线观看| 国产精品久久久av久久久| 欧美性极品少妇精品网站| 深夜精品寂寞黄网站在线观看| 992tv在线成人免费观看| 另类天堂视频在线观看| 欧美精品少妇videofree| 亚洲国产第一页| 欧美高清视频在线| 色噜噜狠狠狠综合曰曰曰88av| 久久久久久国产精品美女| 国产精品一香蕉国产线看观看| 亚洲xxxx做受欧美| 亚洲综合最新在线| 欧美一区二区三区图| 成人乱色短篇合集| 亚洲aⅴ男人的天堂在线观看| 日韩免费av片在线观看| 欧美国产日韩一区| 自拍偷拍亚洲欧美| 欧美性xxxx极品hd欧美风情| 97碰在线观看| 亚洲欧洲美洲在线综合| 一区二区三区www| 日日狠狠久久偷偷四色综合免费| 国产aⅴ夜夜欢一区二区三区| 亚洲精品理论电影| 国模视频一区二区三区| 久久99精品国产99久久6尤物| 精品国产户外野外| 另类专区欧美制服同性| 欧美一级淫片播放口| 久久6免费高清热精品| 懂色aⅴ精品一区二区三区蜜月| 欧美国产日韩一区二区| 国产欧美一区二区三区在线看| 国产精品v片在线观看不卡| 日本电影亚洲天堂| 国产精品美女主播在线观看纯欲| 国产精品爽爽爽爽爽爽在线观看| 亚洲美腿欧美激情另类| 日韩综合中文字幕| 日本欧美爱爱爱| 欧亚精品在线观看| 91久久综合亚洲鲁鲁五月天| 日韩免费高清在线观看| 亚洲成年人影院在线| 欧美寡妇偷汉性猛交| 欧美日韩国产中文精品字幕自在自线| 91精品国产高清久久久久久| 91av免费观看91av精品在线| 日韩国产欧美精品一区二区三区| 欧美日韩在线观看视频小说| 亚洲国产精彩中文乱码av在线播放| 亚洲成色999久久网站| 美女福利精品视频| 久久韩剧网电视剧| 欧美精品在线观看91| 在线视频欧美日韩精品| 国产精品免费一区二区三区都可以| 欧美另类在线播放| 亚洲国产精品99| 日本在线精品视频| 久久99国产精品久久久久久久久| 久久精品在线视频| 国产在线久久久| 91精品久久久久久久久久久| 九九久久久久99精品| 国产中文字幕亚洲| 91av视频在线| 国产性猛交xxxx免费看久久| 欧美日韩国产二区| 久久久之久亚州精品露出| 97视频在线观看视频免费视频| 精品欧美aⅴ在线网站| 亚洲国产一区自拍| 都市激情亚洲色图| 国产成人综合亚洲| 成人免费网视频| 欧美国产极速在线| 成人h猎奇视频网站| 亚洲精品色婷婷福利天堂| 日韩欧美在线免费| 国产精品成人免费电影| 亚洲天堂av网| 日本中文字幕久久看| 2019中文字幕在线观看| 欧美乱大交xxxxx另类电影| 国产一区二区三区在线| 亚洲伊人成综合成人网| 国产精品精品久久久久久| 一区二区三区视频在线| 久久在线视频在线| 亚洲女人天堂网| 欧美成人一二三| 亚洲精品日产aⅴ| 日本在线观看天堂男亚洲| 国产中文字幕日韩| 日本一区二三区好的精华液| 国产欧美在线观看| 日韩中文理论片| 麻豆国产精品va在线观看不卡| 国产精品一区二区女厕厕| 亚洲视频一区二区三区| 中文字幕亚洲欧美日韩2019| 欧美一区二区大胆人体摄影专业网站| 91精品国产综合久久久久久蜜臀| 亚洲国语精品自产拍在线观看| 一区二区亚洲精品国产| 国产成人中文字幕| 欧美激情影音先锋| 久久久久久噜噜噜久久久精品| 亚洲成人精品久久| 一区二区三区四区视频| 在线视频免费一区二区| 日本aⅴ大伊香蕉精品视频| 77777亚洲午夜久久多人| 精品一区二区三区三区| 亚洲一区二区国产| 亚洲男人的天堂网站| 欧美一区二区三区免费视| 精品久久久久久久久国产字幕| 久久久久久高潮国产精品视| 亚洲免费伊人电影在线观看av| 国产不卡视频在线| 久久精品国产99国产精品澳门| 国产又爽又黄的激情精品视频| 亚洲午夜色婷婷在线| 国产精品露脸av在线| 国产69久久精品成人| 国产一区二区三区日韩欧美| 在线成人免费网站| 亚洲国产第一页| www.欧美精品一二三区| 丝袜亚洲另类欧美重口| 日韩欧美在线网址| 宅男66日本亚洲欧美视频| 成人免费观看a| 高清欧美一区二区三区| 久久久久久久久久久成人| 韩国欧美亚洲国产| 日韩资源在线观看| 91精品国产沙发| 爽爽爽爽爽爽爽成人免费观看| 成人国产在线视频| 日韩精品中文字幕在线观看| 精品久久久久久久久中文字幕| 日韩日本欧美亚洲| 亚洲欧美一区二区精品久久久| 久久影视电视剧免费网站清宫辞电视| 日韩av色在线| 国产精品视频在线观看| 中文字幕日韩免费视频| 久久精品色欧美aⅴ一区二区| 国产精品一区二区三区久久久| 亚洲欧美另类中文字幕| 日韩女优在线播放| 成人深夜直播免费观看| 久久99青青精品免费观看|