2.數據
后臺傳過來的數據大概是這樣的
{
"data":[
{
"id":1,
"name":"一級節點",
"parentId":0,
"isValid":true,
"canAddChild":true,
"parent":null,
"children":[]
},{
"id":3,
"name":"二級節點",
"parentId":1,
"isValid":true,
"canAddChild":true,
"parent":null,
"children":[]
}
],
"status":1
}
3.數據格式
data里面每個元素的parentId指向是父級元素的id,parentId為0的是結構樹的頂級元素,但現在是個平面的數組不好處理,而我們要做的是樹狀的結構,所以首先要對數據進行格式化,將一個元素的所有子元素放到該元素的children屬性中去。那么,遞歸就來了。
createTree = data => {
let treeArr = [];
//獲取頂級父元素集合
let roots = data.filter(elemt => elemt.parentId === 0);
treeArr.push(...roots);
//從頂級元素開始,獲取每個元素的子元素放到該元素的children屬性中
const getChildren = (resultarr,data) => {
resultarr.forEach((elemt,index) => {
elemt.children = data.filter((item,index) => item.parentId === elemt.id);
//判斷當前元素是不是有子元素被添加,如果有,再在子元素這一層循環
if(elemt.children.length > 0){
getChildren(elemt.children,data);
}
});
}
getChildren(treeArr,data);
//最后更新一下數據
this.setState({
treeArr
})
}
4.組件格式
因為UI組件用的是antd,使用Tree和TreeNode做樹結構。因為數據已經是樹狀的了,而且深度我們不確定,想要按層級輸出UI控件,那么,遞歸又來了。
renderTree = jsonTree => jsonTree.map( value => {
//遍歷樹狀數組,如果發現他有children則先套上<TreeNode>,再對他children中的元素做相同的操縱,直到children為空的元素停止,說明他們已經是最深的那一層了。
if(value.children){
return(
<TreeNode title={
<span>
{value.name}
<Icon type="plus" onClick={this.showModal.bind(this,2,value.id)} />
<Icon type="edit" onClick={this.showModal.bind(this,1,value.id)} />
<Icon type="delete" onClick={this.showModal.bind(this,0,value.id)} />
</span>
} key={value.id}>
//對children中的每個元素進行遞歸
{this.renderTree(value.children)}
</TreeNode>
)
}
})
至此,就基本完成對數據的格式和對UI樹的格式啦,最后在樹控件中調用它,OK~
5.瘋狂輸出
render(){
return(
<Tree showLine={true}>
{this.renderTree(this.state.treeArr)}
</Tree>
)
}
運行,Bingo~
tips
因為目錄樹的每一項都是可編輯的,而原始的UI組件也沒有可用配置,后來查閱文檔竟然應該在TreeNode的title樹形中添加樹的自定義元素,可以,很強勢,官方文檔,看就完了,哈哈。
- 第一章 起步
- 第1節 創建react項目
- 第2節 hello world
- 第3節 數據綁定+事件處理
- 3.1 for循環事件處理中的傳參寫法、條件渲染
- 第4章 點擊切換文字
- 第5章 使用html寫react
- 第二章 運用
- 第1節 循環
- 第2節 實現一個簡單的TodoList
- 第2.1節 刪除
- 第3節 父子組件傳參
- 1. 父組件向子組件傳參
- 2. 子組件向父組件傳參
- 第4節 react-router實現一個簡單路由
- 第5節 生命周期
- 第6節 取數據
- 第 7節 獲取dom節點
- 第8節 雙向數據綁定
- 第三章 redux
- 第1節 介紹
- 第2節 安裝redux
- 第3節 使用
- 3.1 action
- 3.2 使用redux實現 todolist
- 第4節封裝redux中的action
- 第5節 redux-thunk中間件
- 5.1介紹
- 5.2使用
- 第四章 ant-design前端ui
- 第一節 安裝
- 第2節 使用
- 2.1 ant-design實現todoList增刪功能
- 第3節 使用整理
- 第五章 vue和react的比較
- 第六章 dva.js輕量級應用框架
- 第1節 介紹
- 第2節 安裝dva
- 第3節 頁面跳轉
- 1. 事件路由跳轉
- 2. 通過路由跳轉
- 第4節 組件之間通信
- 1. 父組件向子組件傳參
- 2. 子組件向父組件傳參
- 第5節 事件處理
- 第6節 發送請求
- 1. 通過路由判斷頁面渲染數據
- 2. 通過事件發送請求
- 第7節 運用
- 1. TodoList
- 1.添加數據
- 1.2輸入框敲回車觸發事件
- 2.刪除數據
- 3. 總結
- 第8節 配合antd使用
- 1. 引入antd
- 2.dva 使用antd注意事項
- 3. 知識點整理
- 第七章 dva后臺項目實戰
- 第1節 登錄加密
- 1.具體實現
- 第2節 知識點
- 第3節 樹結構
- 第八章 react新特性 hooks
- 第1節 hooks介紹
- 第2節 useState的使用
- 第3節 useEffect的使用
- 第4節 dva+antd+hooks企業后臺項目開發流程
- 第 5節 hooks 使用
- 運用
- 第6節 hook整理
- 第7節 react memo
- 第九章 react中使用Echarts
- 知識點
- react中使用mobx
- 知識點
- react中使用rem
- 遞歸實現目錄數
- react使用圖表
- react 同步更新策略
- antd tree默認展開無效
- ts中lint修復篇
- React-query方案
- 高階組件