How can I achieve optimistic rendering with remote data using material-table?

不想你离开。 提交于 2020-01-30 06:43:04

问题


I am using the library material-table for data tables in my application. I was setting the data prop to use data from this.state.data and adding rows would update on my table by using setState. But after switching to remote data the table doesn't update after adding a row. Is there another way to achieve this with remote data?

import React, {Component} from "react";
import MaterialTable from "material-table";
import Add from "@material-ui/icons/Add";
import Clear from "@material-ui/icons/Clear";
import Check from "@material-ui/icons/Check";
import Edit from "@material-ui/icons/Edit";
import FirstPage from "@material-ui/icons/FirstPage";
import ChevronRight from "@material-ui/icons/ChevronRight";
import LastPage from "@material-ui/icons/LastPage";
import ChevronLeft from "@material-ui/icons/ChevronLeft";
import Search from "@material-ui/icons/Search";
import ReactDOM from "react-dom";

import "./styles.css";

class App extends Component {
  state = {
    data: []
  }
  render() {
  return (
    <MaterialTable
      columns={[
        {
          title: "Avatar",
          field: "avatar",
          render: rowData => (
            <img
              style={{ height: 36, borderRadius: "50%" }}
              src={rowData.avatar}
            />
          )
        },
        { title: "Id", field: "id" },
        { title: "First Name", field: "first_name" },
        { title: "Last Name", field: "last_name" }
      ]}
      icons={{
        Add: () => <Add />,
        Check: () => <Check />,
        Clear: () => <Clear />,
        Edit: () => <Edit />,
        FirstPage: () => <FirstPage />,
        NextPage: () => <ChevronRight />,
        LastPage: () => <LastPage />,
        PreviousPage: () => <ChevronLeft />,
        ResetSearch: () => <Clear />,
        Search: () => <Search />
      }}

      // If this is an array from state(ie. this.state.data) then it works.
      data={query =>
        new Promise((resolve, reject) => {
          let url = "https://reqres.in/api/users?";
          url += "per_page=" + query.pageSize;
          url += "&page=" + (query.page + 1);
          fetch(url)
            .then(response => response.json())
            .then(result => {
              resolve({
                data: result.data,
                page: result.page - 1,
                totalCount: result.total
              });
            });
        })
      }
      editable={{
        onRowAdd: newData =>
          new Promise((resolve, reject) => {
            setTimeout(() => {
              {
                const data = this.state.data;
                data.push(newData);
                this.setState({ data }, () => resolve());
              }
              resolve();
            }, 1000);
          })
      }}
      title="Remote Data Example"
    />
  )
    }
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

回答1:


there is a solution calling the funtion that manage all query event of Material Table

You can do it creating a a React reference to the table. And in that moment you can access to the function. You can use this to pass values directly to the functions if you wanted.

These are the step: 1- Create a value and assign React.createRef() let tableRef=React.createRef()

2- Assign this to the Material Table property called tableRef

tableRef={tableRef}

3- Then you can call the function onQueryChange() whitout any parameters, when you need update your table.

tableRef.current.onQueryChange()

For example:

`async apiDelete(IDs) {
try {
  await Service.delete(IDs);
  this.state.tableRef.current.onQueryChange();
} catch (e) {
  console.log("Error Deleting" + e);
}

}`

You can do others things like: this.state.tableRef.current.onQueryChange({filters: "value"});

Please make a console.log(tableRef) to see all you can do.

Let me know if this help you Regards



来源:https://stackoverflow.com/questions/55752163/how-can-i-achieve-optimistic-rendering-with-remote-data-using-material-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!