【问题标题】:Rendering the content asynchronously in reactJS在 reactJS 中异步渲染内容
【发布时间】:2020-05-29 07:41:34
【问题描述】:

基本上,我有一组根据传递的值显示的动态表。如果传递了一个空数组,它应该显示 No data found。就我而言,当我将数据发送到表时,所有表都会首先显示“未找到数据”,然后是实际的表内容。我不确定是什么原因造成的。

数据是异步加载的,它显示没有找到数据,然后显示实际内容。我添加了 setInterval 来展示这种异步性质

沙盒:https://codesandbox.io/s/react-table-row-table-ryiny?file=/src/index.js:0-1322

有人可以帮我吗?

家长

import * as React from "react";
import { render } from "react-dom";
import DataGrid from "./DataGrid";

const d1 = [{ name: "test", age: "20" }, { name: "test1", age: "15" }];
const d2 = [{ area: "area", pin: "123" }, { area: "area1", pin: "1245" }];
const c1 = [
  { Header: "Name", accessor: "name" },
  { Header: "Age", accessor: "age" }
];
const c2 = [
  { Header: "Area", accessor: "area" },
  { Header: "Pin", accessor: "pin" }
];
const d3 = [];
const c3 = [];

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data1: [],
      column1: [],
      data2: [],
      column2: [],
      data3: [],
      column3: []
    };
  }

  componentDidMount() {
    setTimeout(() => {
      this.setState({
        data1: d1,
        column1: c1
      });
    }, 2000);
    setTimeout(() => {
      this.setState({
        data2: d2,
        column2: c2
      });
    }, 2500);
    this.setState({
      data3: d3,
      column3: c3
    });
  }

  render() {
    return (
      <>
        <DataGrid data={this.state.data1} columns={this.state.column1} />
        <DataGrid data={this.state.data2} columns={this.state.column2} />
        <DataGrid data={this.state.data3} columns={this.state.column3} />
      </>
    );
  }
}

孩子

import * as React from "react";
import ReactTable from "react-table";
import "react-table/react-table.css";

export default class DataGrid extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      showMore: false
    };
  }

  toggleState = () => {
    this.setState(prevState => ({
      showMore: !prevState.showMore
    }));
  };

  formatData = () => {
    let arr = [];
    if (this.props.data && this.props.data.length > 0)
      arr = this.state.showMore ? this.props.data : this.props.data.slice(0, 2);
    return arr;
  };

  render() {
    const { showMore } = this.state;
    const { data, columns } = this.props;
    const showLink = data.length > 2;
    const subset = this.formatData();
    return (
      <>
        {showLink && (
          <button onClick={this.toggleState}>
            Show {showMore ? "Less" : "More"}
          </button>
        )}
        {data && data.length > 0 ? (
          <ReactTable
            showPagination={false}
            data={subset}
            columns={columns}
            minRows={0}
            NoDataComponent={() => null}
            loading={false}
          />
        ) : (
          "No data found"
        )}
      </>
    );
  }
}

【问题讨论】:

    标签: javascript reactjs ecmascript-6 setstate react-table


    【解决方案1】:

    对上述答案补充几点。

    它以这种方式表现的原因不是因为异步行为,而是因为 React 组件的生命周期性质。在这种情况下发生如下:

    • DataGrid 以数据的初始状态呈现,即 empty[] 数组。
    • 没有数据显示,因为在这个循环中传递了empty[]数组。
    • 然后您在 componentDidMount 中设置状态。
    • 为了显示效果,Datagrid 再次使用实际数据重新渲染。

    【讨论】:

      【解决方案2】:

      使用null 而不是空数组 (sandbox) 初始化 App 状态的数据:

      this.state = {
        data1: null,
        column1: [],
        data2: null,
        column2: [],
        data3: null,
        column3: []
      };
      

      在 DataGrid 中 method 检查值是否为假(null 可计数,但空数组为真),如果是则返回 null(无渲染):

      render() {
        const { data, columns } = this.props;
      
        if (!data) return null;
      

      【讨论】:

        猜你喜欢
        • 2021-09-11
        • 2019-02-15
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多