Protable 是在antd 的 table 上進行了一層封裝,antd -table中有的屬性它都支持. 當表格數據中有children字段,table會默認生成樹形可展開表格,有時候需要一開始就默認展開,文檔有一個屬性defaultExpandAllRows默認展開所有行,但是設置這個之后並沒有生效,原因是這個屬性只在初始的時候加載一次,一般數據是從后台請求的,當時數據還沒回來,數據回來時這個屬性已經不會再次更新了.
如果是使用antd 的table,可以在表格元素加一個判斷,數據存在在渲染
const Tree: React.FC = () => { const [treeData, setTreeData] = useState([]) const getData = () => { setTimeout(() => { setTreeData(data) }, 2000); } useEffect(() => { getData() }, []) return (<> {(treeData && treeData.length) ? <Table columns={columns} expandable={{defaultExpandAllRows: true}} dataSource={treeData} /> : '暫無數據'} </>) } export default Tree
但是在Protable中這個方法並不適用,使用expandable的另一個屬性defaultExpandedRowKeys可以達到這個效果,只是要多處理一次數據
const Tree: React.FC<{}> = () => {
const [treeData, setTreeData] = useState([])
const [defaultExpanded, setDefaultExpanded] = useState([])
const actionRef = useRef<ActionType>();
const getData = () => {
return new Promise((resolve, reject) => {
setTreeData(data)
const newExpandedKeys = []
const render = (treeDatas) => { // 獲取到所有可展開的父節點
treeDatas.map(item => {
if (item.children) {
newExpandedKeys.push(item.key)
render(item.children)
}
})
return newExpandedKeys } setDefaultExpanded(render(data))
resolve({
data: data})
})
}
useEffect(() => {
getData()
}, [])
return (<>
{(treeData && treeData.length) ? <ProTable<TableListItem>
headerTitle="查詢表格"
rowKey="key"
actionRef={actionRef}
expandable={{defaultExpandedRowKeys: defaultExpanded}}
columns={columns}
rowSelection={{}}
request={() => getData()}
/> : '暫無數據'
}
</>)
}
獲取到數據后,把有children的父節點提取出來放在一個數組里,賦值給defaultExpandedRowKeys默認展開的節點屬性,這樣就實現默認全部展開的效果了

