我正在使用material-table组件,该组件填充了来自Redux(对象数组)的动态数据,但是随后我在组件状态内对该数据进行了其他处理。要创建列下拉过滤器,每个列的选项数组lookup
中都有一个元素,该元素接收一个对象并根据其值创建下拉列表。
我正在从数据中提取一些项目,并将它们放入处于组件状态的元素中。这是一个对象,与lookup
接收的对象相同。事实是该组件显示一个空的下拉菜单,就像对象是空的一样,但不是。我将其登录到控制台,并且该对象充满了我需要的数据。
我最初以为是一个渲染问题,对象在开始时是空的,然后填充了数据,但是组件每次都渲染(是的,React是反应性的)。
这只是帮助我解决此问题所需的代码:
表格组件
import React, { Component } from "react";
import MaterialTable from "material-table";
class CustomTable extends Component {
state = {
column1: "",
column2: "",
column3: "",
column1FilterList: {}
columns: [
{
title: "Column1",
field: "column1",
editable: "onAdd",
filtering: true,
lookup: { ...this.column1FilterList }
},
{
title: "Column2",
field: "column2",
editable: "onAdd",
filtering: true,
},
{
title: "Column3",
field: "column3",
editable: "onAdd",
filtering: true
}
]
};
componentDidMount() {
this.props.fetchValues()
this.props.fetchApplications()
this.filterColumn1ExistingKeys()
}
filterColumn1ExistingKeys = () => {
return this.props.elements.map(element => {
return this.setState(prevState => ({
column1FilterList: {
...prevState.column1FilterList,
[element.name]: element.name
}
}))
})
}
render() {
return (
<div>
<MaterialTable
options={{
search: false,
actionsColumnIndex: 4,
filtering: true
}}
title="Search by"
columns={this.state.columns}
data={this.state.data}
/>
</div>
);
}
}
export default CustomTable;
答案 0 :(得分:2)
问题在于您如何保存该数据。您可以使用{ ...this.column1FilterList }
在构造函数中创建一个新对象。这将创建一个新的对象,该对象将用作查找对象,该对象将填充column1FilterList的初始数据(空)。稍后更新column1FilterList不会更改该查找对象,因为它已断开连接(新对象)。您还必须像这样更新列中的查找:
const filterColumn1ExistingKeys = () => {
const column1FilterList = this.state.column1FilterList;
this.props.elements.forEach(element => column1FilterList[element.name] = element.name)
this.setState({
column1FilterList,
columns: [{
title: "Column1",
field: "column1",
editable: "onAdd",
filtering: true,
lookup: { ...column1FilterList }
},
{
title: "Column2",
field: "column2",
editable: "onAdd",
filtering: true,
},
{
title: "Column3",
field: "column3",
editable: "onAdd",
filtering: true
}
]
})
}
希望这会有所帮助。让我知道,是否适合您。如果您有任何疑问,请告诉我。编码愉快。