【问题标题】:Adding new columns dynamically with mui-datatable使用 mui-datatable 动态添加新列
【发布时间】:2019-11-18 03:56:51
【问题描述】:

每次按下按钮时,我都想在 mui-datatable 中添加一个新列。然而,数据表似乎并没有呈现它。但是,如果我单击添加列按钮,然后选择下拉列表,则会出现新列。此外,选定的下拉值似乎也没有反映出来。我已将问题缩小到使用 const [columns,setColumns] = useState(...) 列,但没有它,我根本无法动态添加任何新列。感谢您帮助我摆脱这个泡菜,谢谢。

https://codesandbox.io/s/unruffled-sun-g77xc

const App = () => {
  function handleChange(event) {
    setState({ value: event.target.value });
  }

  const [state, setState] = useState({ value: "coconut" });

  const [columns, setColumns] = useState([
    {
      name: "Column 1",
      options: {}
    },
    {
      name: "Column with Input",
      options: {
        customBodyRender: (value, tableMeta, updateValue) => {
          return (
            <div>
              <select value={state.value} onChange={handleChange}>
                <option value="grapefruit">Grapefruit</option>
                <option value="lime">Lime</option>
                <option value="coconut">Coconut</option>
                <option value="mango">Mango</option>
              </select>
            </div>
          );
        }
      }
    }
  ]);

  const options = {
    responsive: "scroll"
  };

  const addColumn = () => {
    columns.push({
      name: "NewColumn",
      label: "NewColumn"
    });
    setColumns(columns);
  };

  const data = [["value", "value for input"], ["value", "value for input"]];

  return (
    <React.Fragment>
      <MUIDataTable columns={columns} options={options} data={data} />

      //add a new column if this button is clicked
      <button onClick={addColumn}>Add Column</button>
    </React.Fragment>
  );
};

【问题讨论】:

    标签: reactjs mui-datatable


    【解决方案1】:

    您的新列实际上并没有被推送到columns 变量。使用 useState 时,除非使用 setColumns,否则无法更改变量,否则不会触发重新渲染。试试这个:

      const addColumn = () => {
        setColumns([ ...columns, {
          name: "NewColumn"
        }]);
      };
    

    或者这个:

      const addColumn = () => {
        const editableColumns = [...columns];
        editableColumns.push({
          name: "NewColumn"
        });
        setColumns(editableColumns);
      };
    

    两者都可以,这只是您的偏好。

    您可以测试它是否正在编辑列: useEffect(() =&gt; console.log(columns), [columns]);

    【讨论】:

    • 感谢您的帮助。我已经对其进行了修改,并且现在可以添加列。我已经使用您在此处打开此帖子后描述的方法修复了它。但是,正如您从此处修改的代码codesandbox.io/s/elastic-lalande-hntew?fontsize=14 中看到的那样,下拉菜单仍然没有反映我选择的值。
    • 将您的选择标签更改为&lt;select value={value} onChange={e =&gt; updateValue(e.target.value)}&gt;
    猜你喜欢
    • 2019-07-26
    • 2021-01-22
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2020-10-30
    • 2015-08-26
    相关资源
    最近更新 更多