【问题标题】:Dynamic lookup from React's state in material-table从材料表中的 React 状态动态查找
【发布时间】:2019-12-11 10:06:41
【问题描述】:

我正在使用 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;

【问题讨论】:

  • 你在哪里使用filterColumn1ExistingKeys函数??
  • componentDidMount()。我忘记粘贴了。现在代码已编辑。
  • 你能把你的代码放在codesandbox里吗?我还是没明白。什么是 CustomTable,您使用的是两个组件。 componentDidMount 中的其他函数是如何工作的??
  • 我觉得我做不到。是工作相关的。很抱歉复制错误。有很多代码。修复了组件。
  • 很难从这段代码中分辨出来。尝试制作小型 POC,看看代码沙箱上发生了什么。

标签: javascript reactjs jsx material-table


【解决方案1】:

问题在于如何保存这些数据。您使用{ ...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
    }
    ]
  })
}

希望这会有所帮助。让我知道,如果这对你有用。如果您有任何问题,请告诉我。编码愉快。

【讨论】:

  • 嘿!谢谢您的答复。我真的不明白你的解决方案。为什么我需要用列更新lookup?此外,您对 filter... 函数所做的重构有一些语法错误。那正确吗?对不起。希望你能澄清一点。无论如何,谢谢你花时间做这件事。
  • @TheWoodStudio 让我们在聊天中讨论:chat.stackoverflow.com/rooms/197497/…
猜你喜欢
  • 2020-05-19
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2018-11-25
  • 2020-12-17
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多