前言:最近開發中用到element-tree組件,再次做個筆記記錄一哈,不喜勿噴!!!謝謝
1、在項目中我們需要用的層級有4級,超過以后就給個提示就行;每條數據上都有新增子級、刪除、修改
2、按照官網給的實例,每條數據后面都會跟上新增、刪除按鈕,自我定制:當鼠標移上去才顯示新增、刪除按鈕
官網給的實例:

自己修改后:

3、修改當前數據的名稱、並上傳到后台,在重新從后台獲取到數據顯示在頁面上
以上問題就是寫這個文檔的目的!話不多說了 直接上代碼!
首先是html代碼
<el-tree ref="SlotTree" :data="setTree" :props="defaultProps" default-expand-all highlight-current :expand-on-click-node="false" :node-key="NODE_KEY"> <div class="comp-tr-node" slot-scope="{ node, data }"> <!-- 編輯狀態 --> <template v-if="node.isEdit"> <el-input v-model="data.jgMc" autofocus size="small" :ref="'slotTreeInput'+data[NODE_KEY]" @blur.stop="handleInput(node, data)" @keyup.enter.native="handleInput(node, data)"></el-input> </template> <!-- 非編輯狀態 --> <template v-else> <!-- 名稱: 新增節點增加class(is-new) --> <span :class="[data[NODE_KEY] < NODE_ID_START ? 'is-new' : '', 'comp-tr-node--name']"> <span>{{ data.jgMc }}</span> </span> <!-- 按鈕 --> <span class="comp-tr-node--btns"> <!-- 新增 --> <el-button icon="el-icon-plus" size="mini" circle type="primary" @click="handleAdd(node, data)"></el-button> <!-- 編輯 --> <el-button icon="el-icon-edit" size="mini" circle type="info" @click="handleEdit(node, data)"></el-button> <!-- 刪除 --> <el-button icon="el-icon-delete" size="mini" circle type="danger" @click="handleDelete(node, data)"></el-button> </span> </template> </div> </el-tree>
接下來是css代碼(tree-box:是tree外層的div class名)
.tree-box >>> .el-tree-node {
line-height:45px;
}
.tree-box >>> .el-tree-node__content{
height:45px;
line-height:45px;
}
.comp-tr-top{
margin-left:10%;
}
.comp-tr-node{
height:45px;
}
.comp-tr-node >>> .is-new{
font-weight: bold;
}
.comp-tr-node >>> .comp-tr-node--name{
width:270px;
display: inline-block;
line-height: 45px;
}
.tree-box >>> .el-tree-node__expand-icon{
font-size:26px;
}
.comp-tr-node--btns{
opacity:0;
}
.el-tree-node__content:hover .comp-tr-node--btns{
opacity:1;
}
最后是js代碼
data(){
return{
backupsMode:false,
signTree:false,//判斷tree是新增還是修改
setTree: [],// tree數據
NODE_KEY: 'id',// id對應字段
MAX_LEVEL: 4,// 設定最大層級
NODE_ID_START: 0,// 新增節點id,逐次遞減
startId: null,
defaultProps: {// 默認設置
children: 'jg',
label: 'jgMc'
},
initParam: {// 新增參數
jgMc: '請填寫備件庫名',
pid: 0,
children: []
},
}
},
// 刪除節點
handleDelete(_node, _data){
console.log(_node, _data)
// 判斷是否存在子節點
if(_data.jg && _data.jg.length !== 0){
this.$message.error("此節點有子級,不可刪除!")
return false;
}else{
// 刪除操作
let DeletOprate = () => {
this.$refs.SlotTree.remove(_data)
//這個可以填寫刪除當前數據的接口
}
// 二次確認
let ConfirmFun = () => {
this.$confirm("是否刪除此節點?","提示",{
confirmButtonText: "確認",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
DeletOprate()
}).catch(() => {})
}
// 判斷是否新增:新增節點直接刪除,已存在的節點要二次確認
_data[this.NODE_KEY] < this.NODE_ID_START ? DeletOprate() : ConfirmFun()
}
},
// 修改節點
handleInput(_node, _data){
console.log(_node, _data)
if(_node.isEdit){
this.$set(_node, 'isEdit', false)
// 填寫修改節點的接口
}
},
// 編輯節點
handleEdit(_node, _data){
console.log(_node, _data)
if(!_node.isEdit){
this.$set(_node, 'isEdit', true)
}
// 輸入框聚焦
this.$nextTick(() => {
if(this.$refs['slotTreeInput'+_data[this.NODE_KEY]]){
this.$refs['slotTreeInput'+_data[this.NODE_KEY]].$refs.input.focus()
}
})
},
// 新增節點
handleAdd(_node, _data){
console.log(_node, _data)
// 判斷層級
if(_node.level >= this.MAX_LEVEL){
this.$message.warning("當前已達到"+ this.MAX_LEVEL + "級,無法新增!")
return false;
}
// 參數修改
let obj = JSON.parse(JSON.stringify(this.initParam));// copy參數
console.log(obj)
obj.pid = _data.jgId;// 父id
obj[this.NODE_KEY] = ++this.startId;// 節點id:逐次遞增id
// 判斷字段是否存在
if(!_data.jg){
this.$set(_data, 'jg', [])
}
// 新增數據
_data.jg.push(obj)
// 展開節點
// _node.expanded = true
if(!_node.expanded){
_node.expanded = true
}
},
// 添加頂部節點
handleAddTop(){
let obj = JSON.parse(JSON.stringify(this.initParam));// copy參數
obj[this.NODE_KEY] = ++this.startId;// 節點id:逐次遞增id
this.setTree.push(obj)
console.log(this.setTree)
},
