【问题标题】:Refresh table after post in react在反应后刷新表
【发布时间】:2019-10-15 09:24:16
【问题描述】:

发布后我想重新加载我的表格,以便能够在发布后显示数据。现在问题来了,如何让我的“DataProvider”再次渲染?

我会在“FormOPCConnect”中作为函数调用来执行此操作。但我不知道如何开始。我已经尝试使用“DataProvider”的“props”,但我不知道如何渲染新表。

附上我的源代码。

TableOPCConnections.js

import React from "react";
import PropTypes from "prop-types";
import key from "weak-key";
import Table from 'react-bootstrap/Table'

const OPCVarTable = ({ data }) =>
  !data.length ? (
    <p>Nothing to show</p>
  ) : (
    <div>
      <h2 className="subtitle">
        Showing <strong>{data.length}</strong> OPC Variables
      </h2>
      <Table striped bordered hover>
        <thead>
          <tr>
            {Object.entries(data[0]).map(el => <th key={key(el)}>{el[0]}</th>)}
          </tr>
        </thead>
        <tbody>
          {data.map(el => (
            <tr key={el.id}>
              {Object.entries(el).map(el => <td key={key(el)}>{el[1]}</td>)}
            </tr>
          ))}
        </tbody>
      </Table>
    </div>
  );
OPCVarTable.propTypes = {
  data: PropTypes.array.isRequired
};

export default OPCVarTable;

DataProvider.js

import React, { Component } from "react";
import PropTypes from "prop-types";

class DataProvider extends Component {
  static propTypes = {
    endpoint: PropTypes.string.isRequired,
    render: PropTypes.func.isRequired
  };
  state = {
      data: [],
      loaded: false,
      placeholder: "Loading..."
    };
  componentDidMount() {
    fetch(this.props.endpoint)
      .then(response => {
        if (response.status !== 200) {
          return this.setState({ placeholder: "Something went wrong" });
        }
        return response.json();
      })
      .then(data => this.setState({ data: data, loaded: true }));
  }
  render() {
    const { data, loaded, placeholder } = this.state;
    return loaded ? this.props.render(data) : <p>{placeholder}</p>;
  }
}
export default DataProvider;

FormOPCConnect.js (这里我想刷新一下DataProvider的状态)

在 fetch 方法之后,只要 post 到数据库成功,我想再次渲染表。

import React, { Component, useState } from "react";
import PropTypes from "prop-types";
import Button from "react-bootstrap/Button";
import Form from 'react-bootstrap/Form'
import DataProvider from "./DataProvider";

import csrftoken from './csrftoken';

class FormOPCConnect extends Component {
  constructor(props) {
    super(props);
    this.state = {
      validated: false
    };
  }
  static propTypes = {
    endpoint: PropTypes.string.isRequired
  };
  state = {
    ip_address: "",
    port: "",
    namespace_name: "",
    root_name: "",
    owner: ""
  };

  handleChange = e => {
    this.setState({ [e.target.name]: e.target.value });
  };

  handleSubmit = event => {
    const form = event.currentTarget;
    if (form.checkValidity() === false) {
      event.preventDefault();
      event.stopPropagation();
    }
    event.preventDefault();
    const { ip_address, port, namespace_name, root_name, owner } = this.state;
    const opcConn= { ip_address, port, namespace_name, root_name, owner };
    const conf = {
      method: "post",
      body: JSON.stringify(opcConn),
      headers: new Headers({ "Content-Type": "application/json", "X-CSRFTOKEN": csrftoken })
    }

    fetch(this.props.endpoint, conf).then(response => console.log(response));

    //>>
    //if response is valid -> refresh the Dataprovider and the table...
    //<<

    this.setState({ validated: this.state.validated = true })

  };

App.js

const App = () => (
<React.Fragment>
<Container>
<Row>
 <Col> <NavBarTop fixed="top" /> </Col>
  </Row>
  <Row>
    <Col>  <DataProvider endpoint="opcconnection/"
                render={data => <OPCVarTable data={data} />} /></Col>
    <Col><FormOPCConnect endpoint="opcconnection/" /></Col>
  </Row>
</Container>
  </React.Fragment>
);

const wrapper = document.getElementById("app");

wrapper ? ReactDOM.render(<App />, wrapper) : null;

我是 React 新手,所以请原谅我的错误。 :D

最后看起来像这样。 OPCConnection_Image

【问题讨论】:

  • 1st .that 代码太多,无法检查,你能只提供必要的代码吗?2nd 我从来没有做过,但据我所知,你每次不发帖时都需要更新你的状态要求 。它会自动更新你的表
  • 我删除了不必要的部分,谢谢。我认为其余的必须保持这种状态,否则你看不到连接?是的,我已经试过了。但是当我调用DataProvider的状态时,怎么会再次触发渲染呢?

标签: javascript reactjs jsx react-component


【解决方案1】:

您的代码当前包含 2 个需要修复的问题,以便在您发布数据时更新您的表格。


1) 您的 DataProvider 实际上会在 props 更改时重新渲染。这里的问题是您获取data 的逻辑在componentDidMount 中。 componentDidMount 仅在组件第一次挂载时触发,不会在重新渲染时触发。

如果您希望每次组件重新呈现时都获取数据,您可以将获取功能放在 DataProviderrender 方法中。

要重新渲染组件,您只需更新其propsstate


2)您希望您的DataProvider 在您的FormOPCConnect 完成一些逻辑后更新。

React 的特点是。您只能将变量从parents 传递到children。您不能直接从siblingsibling 或从childparent 通信。

在您的App 中,您的DataProviderFormOPCConnect 的符号,它们彼此相邻。

<App> // App can communicate with every component inside it.
   <DataProvider /> // This component can't communicate with the component next to it.
   <FormOPCConnect />
</App>

这里最简单的做法是在FormOPCConnect 中渲染DataProvider 并直接更新DataProvider 的道具。

或者,如果这不可能,请在 App 中保留一个状态,以检查您在 FormOPCConnect 中的逻辑是否已完成。

class App extends Component {
  constructor(props) {
    super(props);
    this.state = { boolean: false }; //state is remembered when a component updates.
  }

  flipBoolean() { //this function updates the state and rerenders App when called.
    this.setState(
      boolean: boolean!
    );
  };

  render {
    return (
      <Fragment>
        <DataProvider />
        <FormOPCConnect flipBoolean={this.flipBoolean} />
      </Fragment>
    )
  }
}

将一个函数传递给FormOPCConnect,它会更新App 的状态。当您希望 DataProvider 重新渲染时,您只需在 FormOPCConnect 中调用 flipBoolean 函数。这将更新App 中的state。这将触发App 重新渲染。这又会重新渲染它的孩子DataProvider andFormOPCConnect`。

(这个变量不需要是布尔值,你可以在这里做任何你想做的。这个布尔值只是一个例子)。

【讨论】:

  • 那么解决办法就是将fetch的数据放到DataProvider的通用函数中?如果有必要,然后在帖子之后调用它?
  • 要么,要么fetch直接在DataProvider的渲染方法中,而不是在componentDidMount
  • 好的,我知道了,但是如何在FormOPCConnect类中再次调用DataProvider的渲染函数呢?
  • 我已经更新了我的答案,以提供有关反应组件之间的通信如何工作的更多解释
  • 感谢 Luze 的回答。我已经按照解决方案 2 中的描述实现了这一点。但是,这不是我想要的结果。作为DataProvider,我了解一个模块或类,它可以让我获得有关给定端点的相应数据。我希望能够从任何地方触发它。所以DataProvider 总是可以重复使用的。它不再是,只要我将它包含在FormOPCConnect 中,就像在这个例子中一样。在解决方案 2 的第二个解决方案中,我强制所有孩子再次渲染自己,这又不是我想要的结果,因为这也涉及渲染表单。
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多