一個(gè)異步加載的tree組件初始狀態(tài)是這樣:
此時(shí)的treeData是:
treeData: [
{
title: 'Expand to load', key: '0', children: [
{ title: 'child', key: '0-0', isLeaf: false }
]
}
]
點(diǎn)擊+號(hào),模擬異步請(qǐng)求數(shù)據(jù),擴(kuò)展成這樣:
此時(shí)的狀態(tài)是:
treeData: [
{
title: 'Expand to load', key: '0', children: [
{ title: 'child', key: '0-0', isLeaf: false ,children:[
{ title: 'Child Node', key: "0-0-0" },
{ title: 'Child Node', key: "0-0-1" }
]}
]
}
]
然后,此時(shí)點(diǎn)擊按鈕,希望返回初始狀態(tài):
treeData: [
{
title: 'Expand to load', key: '0', children: [
{ title: 'child', key: '0-0', isLeaf: false }
]
}
]
但是實(shí)際結(jié)果是:
問(wèn)題是:
感覺(jué)是Tree組件并沒(méi)有重新渲染,而是在原來(lái)的基礎(chǔ)上update state。求助怎么解決?
主要代碼:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import { Tree } from 'antd';
const TreeNode = Tree.TreeNode;
class Demo extends React.Component {
state = {
treeData: [
{
title: 'Expand to load', key: '0', children: [
{ title: 'child', key: '0-0', isLeaf: false }
]
}
],
}
onLoadData = (treeNode) => {
return new Promise((resolve) => {
if (treeNode.props.children) {
resolve();
return;
}
setTimeout(() => {
console.log(treeNode);
treeNode.props.dataRef.children = [
{ title: 'Child Node', key: `${treeNode.props.eventKey}-0` },
{ title: 'Child Node', key: `${treeNode.props.eventKey}-1` },
];
this.setState({
treeData: [...this.state.treeData],
});
resolve();
}, 1000);
});
}
btnClick = () => {
this.setState({
treeData: [
{
title: 'Expand to load', key: '0', children: [
{ title: 'child', key: '0-0', isLeaf: false }
]
}
],
});
}
renderTreeNodes = (data) => {
return data.map((item) => {
if (item.children) {
return (
<TreeNode title={item.title} key={item.key} dataRef={item}>
{this.renderTreeNodes(item.children)}
</TreeNode>
);
}
return <TreeNode {...item} dataRef={item} />;
});
}
render() {
return (
<div>
<Tree loadData={this.onLoadData} showLine>
{this.renderTreeNodes(this.state.treeData)}
</Tree>
<button onClick={this.btnClick}>更新treedata</button>
</div>
);
}
}
ReactDOM.render(<Demo />, document.getElementById('root'));
如果需要的話,可以到這邊直接下載demo:https://github.com/wyzgo/antd_test.git
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。