日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

element-ui 可复选树型表格

發布時間:2024/8/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 element-ui 可复选树型表格 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果

思路

  • 自定義模板
  • 當點擊某個行復選框時,其所有后代復選框都要同步狀態,且其直系父輩狀態需要根據所點擊復選框的狀態來修正
  • 點擊全選復選框時,批量同步所有行內復選框狀態

代碼

非封裝組件,按需自行改寫
確保引入element-ui 的情況下直接新增如下代碼的vue組件即可,部分數據檢索和批處理存在優化空間。

<template><div><aside>樹型表格復選框</aside><el-tableref="table":data="rows"row-key="id"borderdefault-expand-all><!--自定義復選框-start--><el-table-column label="全選" width="160" align="center"><template slot="header" slot-scope="scope"><el-checkbox :indeterminate="isIndeterminate" v-model="isFullChecked" @change="checkAllChange"/></template><template slot-scope="{row}"><el-checkbox :indeterminate="row.isIndeterminate" :value="row.checked" @change="checkRowChange(row)"/></template></el-table-column><!--自定義復選框-end--><el-table-column label="子節點部分選取" prop="isIndeterminate" width="160" align="center"><template slot-scope="{row}">{{row.isIndeterminate?'true':'false'}}</template></el-table-column><el-table-column label="是否選中" prop="checked" width="160" align="center"><template slot-scope="{row}">{{row.checked?'true':'false'}}</template></el-table-column><el-table-column type="index" label="序號" width="60" align="center"></el-table-column><el-table-column prop="id" label="ID" align="center" width="160"></el-table-column><el-table-column prop="parentId" label="PARENT_ID" align="center" width="160"></el-table-column></el-table><br><!--如果涉及分頁,新的數據會直接覆蓋掉原有的,只需要額外的操作將全選復選框重置即可--><el-button @click="getResource">刷新數據</el-button></div> </template><script> export default {name: "tree-table-checkbox",data() {return {rows: [],isFullChecked: false,isIndeterminate: false,}},created() {this.getResource()},watch: {// 直接監聽rows數據是否變化,重置全選框rows() {this.isFullChecked = falsethis.isIndeterminate = false}},methods: {/** 同步更新子節點復選框* isIndeterminate = false checked = false 表現為空 全部子節點取消勾選* isIndeterminate = false checked = true 表現為選中 全部子節點勾選* isIndeterminate = true 表現為半選(操作其子節點的結果),因此子節點要改為選中 不修改子節點狀態 點擊為全選中* */deepSetChildren(data) {const { isIndeterminate, checked } = dataconst recursionSetChecked = (arr, checked) => {if (arr && arr.length > 0) {arr.forEach(d => {d.checked = checkedd.isIndeterminate = falserecursionSetChecked(d.children, checked)})}}recursionSetChecked(data.children, isIndeterminate ? true : checked)},/***根據checked自定義加載*1)判斷當前checked。* checked ==true 當前節點 變為false 下級所有級別節點變為false* checked == false 當前節點 變為true 下級所有級別節點變為true*2)雙向遞歸刷新所有節點checked*/checkRowChange(data) {const vm = this;const { rows } = vm/** tbody中的復選框不使用v-model,否則會出現 checked=true 需要點兩次才會變成false的情況* 可參考 https://blog.csdn.net/weixin_41597344/article/details/103196688* 因此這里再事件監聽中手動取反*/data.checked = !data.checked//鼠標勾選/取消勾選 需要同步子節點狀態和操作的行一致vm.deepSetChildren(data)/** 遞歸修正* 再整個數據樹中,操作節點的下層子分支狀態由操作節點確定,而其父輩節點需要根據操作節點的情況進行判斷。* 這里沒有單獨找出操作節點的分支,直接處理了整棵樹* @returns {*}*/const recursion = (node) => {if (node.children && node.children.length > 0) {// 向下遞歸node.children.forEach(d => recursion(d))// 獲取子節點的情況(有多少勾選的,有多少半選的)const sumChecked = node.children.filter(d => d.checked).lengthnode.isIndeterminate = sumChecked > 0 && sumChecked < node.children.lengthif (node.children.some(d => d.isIndeterminate)) {node.isIndeterminate = true}node.checked = sumChecked !== 0} else {// 沒有子節點的由自身確定狀態node.isIndeterminate = false}return node}rows.forEach(d => {recursion(d)})//因為全選按鈕不在整個數據樹中,需要單獨判斷數據樹一層的情況//如果全部勾選則 【全選框】 勾選if (rows.every(d => d.checked)) {vm.isFullChecked = true}//如果全部勾選則 【全選框】 取消勾選if (rows.every(d => !d.checked)) {vm.isFullChecked = false}//如果是存在半選或存在未選且有已選或半選 則 【全選框】半選vm.isIndeterminate = rows.some(d => d.isIndeterminate) ? true : rows.some(d => !d.checked) && rows.some(d => d.checked)},/*** 初始化時設定isFullChecked = false,每次點擊取反* if isFullChecked == true*設置所有節點checked = true* if isFullChecked == false* 設置所有節點checked = false*/checkAllChange() {const vm = thisconst { rows } = vmconst recursionSetChecked = (item, checked) => {item.checked = checkeditem.isIndeterminate = falseif (item.children && item.children.length > 0) {item.children.forEach(d => recursionSetChecked(d, checked))}}this.isIndeterminate = falserows.forEach(d => recursionSetChecked(d, vm.isFullChecked))},//獲取列表基礎數據getResource() {const vm = this//測試用數據只有一個根節點 "0" 方便構建測試用數據樹const data = [{ id: '1', parentId: '0' },{ id: '2', parentId: '0' },{ id: '2-0', parentId: '2' },{ id: '1-0', parentId: '1' },{ id: '1-1', parentId: '1' },{ id: '1-1-0', parentId: '1-1' },{ id: '1-1-0-0', parentId: '1-1-0' },{ id: '1-1-0-1', parentId: '1-1-0' },{ id: '1-2', parentId: '1' },{ id: '1-2-0', parentId: '1-2' },{ id: '1-2-1', parentId: '1-2' },]//1) 簡單處理數據用于自定義渲染; checked: indeterminate:data.forEach(d => {d.checked = false //是否選中d.isIndeterminate = false//是否是半選狀態})vm.rows = vm.makeTree(data, 'id', 'parentId', '0')},/*** 構建樹,與復選邏輯無關* @param data* @param idMark* @param pIdMark* @param rootId* @returns {*}*/makeTree(data, idMark, pIdMark, rootId) {//轉化為字典,id為鍵值,并添加根節點對象let nodeDict = {};(nodeDict[rootId] = { children: [] })[idMark] = rootId;data.forEach(n => {(nodeDict[n[idMark]] = n).children = [];});data.forEach(function (d) {let parentNode = nodeDict[d[pIdMark]];if (parentNode) {parentNode.children.push(d);}});return nodeDict[rootId].children;}} } </script><style scoped></style>

總結

以上是生活随笔為你收集整理的element-ui 可复选树型表格的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人精品一区二区三区在线 | 久久久久久黄色片 | 男人猛吃奶女人爽视频 | 丁香六月色| 亚洲精品久久久久中文字幕二区 | 999国产精品视频 | 1级片在线观看 | 日韩一区二区三区高清 | 中文字幕最新 | 欧美一级二级三级视频 | 天天干天天操天天操 | 色屁屁影院www国产高清麻豆 | 欧美日韩三级在线 | 亚洲欧美日本在线观看 | 成人午夜免费毛片 | xxxx69国产 | 波多野结衣视频在线观看 | 日韩精品在线一区二区三区 | 日本久久片 | av免| 97碰碰视频 | 伊人影院在线播放 | 日本黄网免费 | 人妖videosex高潮另类 | 天天撸天天操 | 18成人免费观看网站下载 | 亚洲大胆视频 | 国产成人久久精品77777综合 | 亚洲精品久久久蜜桃网尤妮丝 | 欧美性综合 | 91麻豆精品国产91久久久无需广告 | 亚洲666 | 夜夜嗨av一区二区三区免费区 | 日韩视频在线观看一区 | 国产高清自拍视频 | 亚洲国产精品毛片av不卡在线 | 91精品国产高清一区二区三蜜臀 | 亚洲无码精品免费 | h在线观看视频 | 精品无码久久久久久久久成人 | 少妇专区 | 在线观看成人一区 | 国产欧美亚洲一区二区 | 中文久久精品 | 交专区videossex另类 | 国产v亚洲 | 欧美精品免费视频 | 日韩av一区二区在线播放 | 看毛片看毛片 | av免费播放 | 国产精品成人久久电影 | 中文字幕在线色 | 在线天堂一区 | 欧洲精品一区二区三区久久 | 瑟瑟av| 色多多污 | 日韩一区免费视频 | 亚洲国内自拍 | 一级久久久久久久 | 椎名由奈av一区二区三区 | 天天爽夜夜爽人人爽 | 亚洲AV成人无码电影在线观看 | 精品熟女一区二区三区 | 日本少妇18p | 在线视频污 | 在线观看国产网站 | 久久婷色| 精品无码av在线 | 欧美第一精品 | 日美av | 成人在线网 | 黄瓜视频在线播放 | 99久久人妻无码精品系列 | 一区二区导航 | www久久99| 午夜av电影在线观看 | 色哟哟无码精品一区二区三区 | 欧美黑人巨大xxx极品 | 精品人妻一区二区三区久久夜夜嗨 | www精品一区二区三区 | www.久久久久.com | 国产精品88久久久久久妇女 | 一级片久久久 | 婷婷色av | 伊人精品久久 | 国产精品国产三级国产aⅴ下载 | 在线看片你懂 | 天天干天天操天天射 | www.污在线观看 | 极品人妻一区二区 | 国产成人久久久 | 超碰caopor| 亚洲综合日韩精品欧美综合区 | 夜夜骑夜夜操 | 日韩一区二区三区在线观看 | 成人免费入口 | 男插女av| 毛片在线视频观看 | 日本在线有码 |