【问题标题】:How to use UseEffect() hook to load data from the backend to material table?如何使用 UseEffect() 钩子将数据从后端加载到材料表?
【发布时间】:2019-12-21 09:35:51
【问题描述】:

我是 react 新手,我正在尝试使用 UseEffect 挂钩向我的后端发出 http 请求以获取一些数据,然后将其显示在 materialTable 中,但状态中的数据直到第二次渲染导致空数据表。这是我的代码:

export default function MembersList() {
  const [state, setState] = React.useState({
    columns: [
      { title: "First Name", field: "firstName" },
      { title: "Last Name", field: "lastName" }
    ],
    data: []
  });

  useEffect(() => {
    async function fetchData() {
      const result = await axios("http://localhost:3300/members");
      return result;
    }
    fetchData().then(result => setState({ data: result.data }));
    console.log("useEffect hook is called");
  }, []);

  console.log("state.data", state.data);
  return state.data.length === 0 ? (
    "no data to display"
  ) : (
    <MaterialTable
      title="Members List"
      columns={state.columns}
      data={state.data}
      editable={{
        onRowAdd: newData =>
          new Promise(resolve => {
            setTimeout(() => {
              resolve();
              const data = [...state.data];
              data.push(newData);
              setState({ ...state, data });
            }, 600);
          }),
        onRowUpdate: (newData, oldData) =>
          new Promise(resolve => {
            setTimeout(() => {
              resolve();
              const data = [...state.data];
              data[data.indexOf(oldData)] = newData;
              setState({ ...state, data });
            }, 600);
          }),
        onRowDelete: oldData =>
          new Promise(resolve => {
            setTimeout(() => {
              resolve();
              const data = [...state.data];
              data.splice(data.indexOf(oldData), 1);
              setState({ ...state, data });
            }, 600);
          })
      }}
    />
  );
}

我做错了什么?

【问题讨论】:

  • 还有一件好事是setState 给你useEffect 依赖数组,这样它就是[setState] 而不仅仅是一个空数组。结果应该是相同的,但它遵循hooks standards

标签: reactjs material-table


【解决方案1】:

React.useState() 不像 React.Component 类中可用的 setState 方法那样进行浅层合并

setState((prevState) => ({
 ...prevState,
 data: result.data
}))

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2020-05-09
    • 1970-01-01
    • 2020-07-11
    • 2020-03-08
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多