在 React 中执行任何操作后,如何在 material UI table 中自动刷新或呈现更新的 table 数据表单数据库?

How can i auto refresh or render updated table data form database in material UI table after doing any operation in React?

这里 useVideos() 为我们提供了数据库中的所有视频。添加新视频后,新条目不会附加到 Material UI table 中,但如果我刷新页面,则会显示该新条目。现在我想在添加操作后显示这个新条目。请帮助我做到这一点!提前致谢。

const initialState = [{}];
const reducer = (state, action) => {
  switch (action.type) {
    case "videos":
      const data = [];
      let cnt = 1;
      action.value.forEach((video, index) => {
        data.push({
          sl: cnt,
          noq: video.noq,
          id: index,
          youtubeID: video.youtubeID,
          title: video.title,
        });
        cnt = cnt + 1;
      });
      return data;
    default:
      return state;
  }
};

export default function ManageVideos() {
  const { videos, addVideo, updateVideo, deleteVideo } = useVideos("");
  const [videoList, dispatch] = useReducer(reducer, initialState);

  useEffect(() => {
    dispatch({
      type: "videos",
      value: videos,
    });
  }, [videos]);

  const columns = [
    { title: "Serial", field: "sl" },
    { title: "Title", field: "title" },
    { title: "Number of Qusetion", field: "noq" },
    { title: "Youtube Video Id", field: "youtubeID" },
  ];

  return (
    <div>
      <MaterialTable
        title="Videos Table"
        data={videoList}
        columns={columns}
        editable={{
          onRowAdd: (newData) =>
            new Promise((resolve, reject) => {
              setTimeout(() => {
                addVideo(newData);
                resolve();
              }, 1000);
            }),
          onRowUpdate: (newData) =>
            new Promise((resolve, reject) => {
              setTimeout(() => {
                updateVideo(newData);
                resolve();
              }, 1000);
            }),
        }}
      />
    </div>
  );
}

由于提供的信息有点缺乏,我假设当您更新视频时 useEffect 挂钩不起作用(用 consle.log("I'm not working") 检查它,如果它确实有效,那么您可以忽略此答案)。

你可以在这个组件中定义一个简单的状态,我们称之为 reRender 并将值设置为 0,每当用户点击按钮添加视频时你应该调用一个函数将 reRender 的值加 1 (()=>setReRender(prevState=>prevState+1))。在你的 useEffect hook 中,第二个参数传递 reRender。这样,当用户点击提交更改时,reRender 会导致 useEffect 运行 并调度以获取新数据。

如果这不起作用,我有一个需要更多工作的解决方案。您将需要使用像 redux 或 context api 这样的状态管理器来在全局级别存储您的状态。您应该将视频存储在那里,并使用多种方式中的一种来访问此组件中的状态(mapStateToProps 或 store.subscribe() 或 ...)。然后把视频全局状态作为第二个参数传给useEffect,voilà,一定可以的