日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue使用el-tree 懶加載進行增刪改查功能的實現

瀏覽:25日期:2023-12-11 13:02:53

關于vue的樹形展示 使用到項目:以樹的形式異步展現效果圖先放:

Vue使用el-tree 懶加載進行增刪改查功能的實現

找到element-ui的官方文檔,el-tree。(地址:https://element.eleme.cn/#/zh-CN/component/tree )

項目需求:以懶加載的形式展示,目錄根據需求需要有新增 編輯 刪除 操作以及操作后的刷新樹結構

那我們現在開始吧

一、

Vue使用el-tree 懶加載進行增刪改查功能的實現

懶加載:Tree的懶加載,用一個屬性控制:lazy。使用lazy,就要使用load來加載數據進行渲染樹原理:初始化觸發load函數先加載初始數據,通過點擊某個節點,觸發load函數,來加載這個節點下的子節點。優點:適合數據量比較大的時候,對部分節點刷新也比較友好

二、

Vue使用el-tree 懶加載進行增刪改查功能的實現

自定義節點:節點后添加操作按鈕

Vue使用el-tree 懶加載進行增刪改查功能的實現Vue使用el-tree 懶加載進行增刪改查功能的實現

簡單例子官網上就有示例

**

主要講講更新節點

**當對節點進行編輯、刪除時,需要更新樹,只需更新節點,不必更新全部的樹即可。原理:更新節點,其實更新的是該節點的子節點,不包括本節點。刪除該節點的子節點,重新請求數據獲取本節點的子節點數據進行重新渲染。

// refreshNode:要刷新的節點;newNodeData:新的子節點數據refreshNode.splice(0, refreshNode.length);refreshNode.doCreateChildren(newNodeData);

理解一下:1>.方法node-click調用函數menuNodeClick,記錄點擊的節點信息,對節點操作前,必然先點擊選中某個節點。此函數監聽點擊節點事件,只要點擊了節點,就觸發:

menuNodeClick(data, node, treeNode) { this.selectNodeData = data this.selectNode = node}

2>.節點操作后刷新節點即可,通過不同場景可以選擇刷新本節點(node)還是刷新本節點的父節點(node.parent):

/*** 刷新節點數據* @node [node/Object]: 刷新的節點node,刷新node以下的所有節點* @type [String]: node的類型,’node’表示node是樹的節點信息Node;’data’表示node是樹節點信息中的data數據*/refreshTreeNode(node, type) { let refreshNode; // 拿到要更新節點的子節點 if(type === ’node’) {refreshNode = node.childNodes }else if(type === ’data’) {let getNode = this.$refs.tree.getNode(node)refreshNode = getNode.childNodes } // 刪除原有的子節點 refreshNode.splice(0, refreshNode.length); //重新請求數據,更新節點 this.requestTreeNode(node)}

3.選擇框checkBox:

如果懶加載中,有選擇框,需要將有選擇框的數據加載出來,然后通過屬性default-checked-keys來勾選,通過default-expanded-keys設置展開的節點。

4.單選:如果在懶加載中,有單選項,則設置選中即可:

// 設置當前節點選中this.$refs.tree.setCurrentKey( this.selectNodeData[this.nodeKey])

不管是單選還是多選,在第一次加載時,后臺要給的,不只是選中信息,還需要選中節點所在分支的所有節點信息,賦值給default-expanded-keys以便可使節點所在分支從上到選擇項都展開。但往往,后臺可能給的,只是選中值的信息,這就要前端自己封裝數據,獲取需要展開的分支信息。根據數據格式不同,用不同的方法1)樹形單層數據格式:

[ {...}, {...}, {...}]

這種格式的數據,【點擊一層,加載一層】、【點擊一層,加載該點擊層的多層子節點】兩種情況都可以滿足。第一種不需要進行數據處理;第二種情況,需要在每條數據中注入一個字段,用來關聯父子節點,然后將數據封裝處理成el-tree所需要的格式,用一個遞歸函數整合數據(假設關聯字段為parentId,nodeKey為id,樹的子節點字段為children,需要加載id為’N’的多層子節點)(注:遞歸函數會影響性能,謹慎使用)

2).多層數據(假設子節點的屬性名是children)

[ {...,children: [ {...,children: [ {...,children: [...], }, {...,children: [...], }] }, {...,children: [ {...,children: [...], }] }] } ]

這種格式的數據,單層、多層都可以滿足,不需要做處理。選中值整合并展開選中值所在的樹:多層數據可由后臺給出選中節點所在的整個分支的值,賦給default-expanded-keys進行展開。也可以自己做篩選,寫一個遞歸函數,將多層數據循環,找到選中值的節點的分支來設置展開(假設nodeKey為id,樹的子節點字段為children,需要展開id為’N’的節點所在的整個分支)

懶加載示例:HTML控件:

<el-tree :data='treeData' :props='defaultProps' :load='loadNodeTree' @node-click='handleNodeClick' lazy :expand-on-click-node='false' :default-expanded-keys='[’1’]' node-key='id' :highlight-current='true' > <span slot-scope='{ node, data }'> <span class='treeLeft'>{{ node.label }}</span> <span class='treeRight'><i v-if='node.level === 1' @click='() => appendNode(node, data)' ></i><!--增加分組--><!-- 根節點不需要刪除和重命名 --><i v-if='data.id !== 0' @click='() => deleteNode(node, data)' ></i><!--刪除分組--><i v-if='data.id !== 0' @click='() => editNode(node, data)' ></i><!--重命名分組--> </span> </span> </el-tree>

vue:data里面定義變量

// 樹形菜單 treeData: [], // 樹節點 defaultProps: { // 修改el-tree默認data數組參數children: ’children’,label: ’name’,id: ’id’,parentId: ’parentId’,isLeaf: ’leaf’ // 指定節點是否為葉子節點,僅在指定了 lazy 屬性的情況下生效 },

methods:加載樹形菜單部分

// 加載 樹數據 loadNodeTree(node, resolve) { const that = this if (node.level === 0) {that.loadtreeData(node, resolve) } else if (node.level === 1) {that.getChildByList(node, resolve) } }, // 獲取loadtreeData 就是父節點數據,getChildByList就是異步獲取子節點數據 loadtreeData(nodeData, resolve) { const dataType = {pageIndex: 1,pageSize: 100000 } getAlltype(dataType).then(res => { const rootChildren = [] if (res.code === 200) { const data = res.data.list data.map(item => { rootChildren.push({name: item.typeName,parentId: ’’,id: item.id,leaf: false,children: [] }) }) //如果resolve有內容就是懶加載走查詢 否則走的是修改 if (resolve) { resolve(rootChildren) } else { nodeData.childNodes = [] nodeData.doCreateChildren(rootChildren) } } else { resolve([]) }}) }, // 獲取子節點請求 getChildByList(nodeData, resolve) { var _parentID = nodeData.data.id const typeSpec = {typeId: _parentID,pageIndex: 1,pageSize: 100000 } getAlltypeSpec(typeSpec).then(res => {const rootChildren = []if (res.code === 200) { const data = res.data.list data.map(item => { rootChildren.push({ name: item.description, parentId: item.typeId, id: item.id, leaf: true, children: [] }) }) if (resolve) { resolve(rootChildren) } else { nodeData.childNodes = [] nodeData.doCreateChildren(rootChildren) }} else { return false} }).catch(err => {console.log(err) }) }, // 節點點擊事件 handleNodeClick(data, node) { this.addnode = node this.adddata = data if (node.level === 1) {this.queryForm.typeId = node.data.idthis.queryForm.typeSpecId = ’’ } else if (node.level === 2) {this.queryForm.typeId = node.data.parentIdthis.queryForm.typeSpecId = node.data.id } this.query() },

節點操作:增加節點 修改節點 刪除節點 (操作自己節點要傳父節點信息才能找到自己當前節點,操作子節點就傳當前節點 結論:父節點操作子節點)

// 樹節點增加 類型規格 appendNode(node, data) { this.addTypesSpec = {typeName: node.data.name,typeId: node.data.id } this.createTypesSpecDialog = true }, // 樹類型修改 editNode(node, data) { const typeId = node.data.parentId // 一級 類型 if (node.level === 1) {this.editTypesDialog = truethis.editTypes = { id: node.data.id, typeName: node.data.name} } else {this.editTypesSpecDialog = truethis.getSelectTypes()// this.editTypesSpec = Object.assign({}, node.data)this.editTypesSpec = { typeId: typeId, id: node.data.id, description: node.data.name} } }, // 樹類型刪除 deleteNode(node, data) { // 一級 類型 if (node.level === 1) {this.$msgbox.confirm(’此操作將刪除資產類型數據, 是否繼續?’, ’刪除提示’, { confirmButtonText: ’確定’, cancelButtonText: ’取消’, type: ’warning’}).then(() => { typeDel(node.data.id).then( resp => { this.$message(’刪除成功’) this.query() this.loadNodeTree(node.parent) }, err => { console.log(’err’, err) } )}).catch(() => { this.$message.error(’已取消’)}) } else {this.$msgbox.confirm(’此操作將刪除資產類型規格數據, 是否繼續?’, ’刪除提示’, { confirmButtonText: ’確定’, cancelButtonText: ’取消’, type: ’warning’}).then(() => { typeSpecDel(node.data.id).then( resp => { this.loadNodeTree(node.parent) this.$message(’刪除成功’) this.query() }, err => { console.log(’err’, err) } )}).catch(() => { this.$message.error(’已取消’)}) } },

節點觸發之后顯示彈框 走正常的彈框增加修改刪除操作,只不過在提交后臺請求返回操作成功之后需要再一次加載樹形結構 所以在這里再一次調用加載樹形方法,傳的node 當觸發點擊樹形的時候可以保存一下,我的是handleNodeClick這個方法 不管點擊修改 增加還是刪除都保存下點擊的node

this.$message(’編輯成功’) this.loadNodeTree(this.addnode.parent)

1.設置展開和收縮

if (!node.expanded) { node.expand();}else { node.collapse();}

2.獲取父節點

node.parent

看得懂的就看吧 代碼可以優化 但是最近沒啥時間 看不懂的能清楚這個邏輯也行啊 下次見

到此這篇關于Vue使用el-tree 懶加載進行增刪改查的文章就介紹到這了,更多相關Vue el-tree 懶加載內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
高清av一区| 天堂va欧美ⅴa亚洲va一国产| 国产亚洲在线| 国产乱子精品一区二区在线观看| 日韩av免费| 国产欧美日韩亚洲一区二区三区| 久久久国产亚洲精品| 欧美精品影院| 国产日产高清欧美一区二区三区 | 伊人久久亚洲美女图片| 国产日韩欧美高清免费| 日韩影院二区| av资源亚洲| 国产精品麻豆久久| a天堂资源在线| 久久黄色影视| 国产免费成人| 视频一区二区三区中文字幕| 亚洲婷婷在线| 蜜臀a∨国产成人精品| 欧美成人久久| www.com.cn成人| 伊人久久av| 激情六月综合| 婷婷综合成人| av综合电影网站| 午夜日韩av| 亚洲影视一区| 精品一区二区三区亚洲| 午夜欧美巨大性欧美巨大| 欧美aa一级| 丝袜美腿一区二区三区| 日韩美女国产精品| 欧美日韩精品免费观看视完整| 久久精品亚洲欧美日韩精品中文字幕| 日本少妇一区二区| 精品免费视频| 欧美91精品| 欧美激情网址| 久久伦理在线| 国产无遮挡裸体免费久久| www.com.cn成人| 亚洲精品女人| 蜜桃视频欧美| 久久中文欧美| 福利在线一区| 午夜亚洲福利| 91精品一区二区三区综合在线爱| 日本不卡视频在线观看| 国产一区二区三区四区二区| 精品九九久久| 亚洲精品动态| 伊人久久亚洲美女图片| 日韩欧美网址| 色狠狠一区二区三区| 国产精品porn| 日韩在线a电影| 999久久久精品国产| 日本一区二区免费高清| 国产精品丝袜在线播放| 91亚洲国产| 国产精品一级| 日韩高清二区| 日韩欧美高清一区二区三区| 激情综合网址| 欧美日韩精品一区二区三区视频 | 国产日韩中文在线中文字幕| 91日韩免费| 国产精品成人a在线观看| 97se亚洲| 亚洲精品美女91| 亚洲日产av中文字幕| 国产精品日本欧美一区二区三区| 国产专区一区| 国产91一区| а√天堂8资源在线| av高清不卡| 91精品亚洲| 91久久国产| 九一精品国产| 免费观看不卡av| 欧美一区=区| 亚洲人www| 久久狠狠亚洲综合| 国产精品亚洲四区在线观看| 国产精品网站在线看| 国产精东传媒成人av电影| 首页国产精品| 亚洲国产日韩欧美在线| 香蕉久久精品| 中文精品电影| 欧美日韩xxxx| 日韩精品dvd| 亚洲欧美日韩国产| 激情中国色综合| 99视频一区| 国产精品玖玖玖在线资源| 精品捆绑调教一区二区三区| 爽爽淫人综合网网站| 精品国产亚洲一区二区三区在线 | 99久久亚洲精品蜜臀| 亚洲成人三区| 欧美激情福利| 丝瓜av网站精品一区二区| 国产精品videossex久久发布| 麻豆91精品视频| 亚洲伊人影院| 日本不卡免费高清视频在线| 欧美午夜网站| 国产综合欧美| 麻豆一区二区三| 久色成人在线| 欧美成人基地 | 日韩av电影一区| 日韩电影在线视频| 四虎成人精品一区二区免费网站| 国产精品99一区二区三区| 涩涩涩久久久成人精品| av高清一区| 日韩欧美久久| 国产亚洲亚洲| 偷拍欧美精品| 亚洲成人免费| 亚洲高清激情| 不卡一区2区| 免费高潮视频95在线观看网站| 国产精品天天看天天狠| 欧美另类综合| 欧美在线资源| 久久香蕉国产| 视频一区免费在线观看| 午夜一区在线| 亚洲一区二区三区四区五区午夜| 欧美+亚洲+精品+三区| 国精品一区二区| 日韩视频不卡| 奶水喷射视频一区| 美女精品在线| 中文字幕成人| 亚洲91网站| 国产精品最新自拍| 美日韩一区二区三区| 中文字幕av一区二区三区四区| 香蕉久久夜色精品国产| 黄色成人91| 亚洲精选av| 久久精品伊人| 性欧美xxxx免费岛国不卡电影| 日韩欧美看国产| 日韩精品水蜜桃| 亚洲欧美日韩国产一区| 91亚洲精品在看在线观看高清| 欧美日韩夜夜| 欧美日韩水蜜桃| 亚洲乱亚洲高清| 免费一区二区三区在线视频| 日韩在线中文| 免费在线观看精品| 国产精品亚洲产品| 天堂√8在线中文| 欧美成人国产| 国产日韩欧美一区在线| 91日韩在线| 婷婷视频一区二区三区| 91精品国产乱码久久久久久久| 中文欧美日韩| 欧美专区一区| 亚州av乱码久久精品蜜桃| 日韩av在线免费观看不卡| av免费不卡国产观看| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美激情一区| 日韩电影免费网址| 免费欧美在线视频| 欧美日韩免费看片| 国产精品最新| 亚洲欧美网站在线观看| 伊人影院久久| 国产欧美69| 蜜臀久久久久久久| 日韩综合精品| 丁香婷婷久久| 麻豆久久久久久| 91麻豆精品激情在线观看最新| 鲁鲁在线中文| 欧美激情福利| 欧美日韩一区二区三区四区在线观看 | 日韩中文字幕在线一区| 亚洲91视频| 在线手机中文字幕| 久久av电影| 久久的色偷偷| 国产精品成人自拍| 国产精品亚洲片在线播放| 青青草91久久久久久久久| 亚洲综合不卡| 一区二区日韩免费看| 99久久激情| 欧美亚洲在线日韩| 欧美日韩一区二区综合|