在 reactJS 中异步渲染内容
Rendering the content asynchronously in reactJS
基本上我有一组动态的 table 正在根据传递的值显示。如果传递了一个空数组,它应该显示没有找到数据。在我的例子中,当我向 table 发送数据时,所有 table 将首先显示 "No data found",然后是实际的 table 内容。我不确定是什么原因造成的。
异步加载数据,显示未找到数据,然后显示实际内容。我添加了 setInterval 来显示这种异步性质
沙盒:https://codesandbox.io/s/react-table-row-table-ryiny?file=/src/index.js:0-1322
有人可以帮助我吗?
Parent
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} />
</>
);
}
}
Child
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"
)}
</>
);
}
}
使用 null
而不是空数组 (sandbox) 初始化 App 状态的数据:
this.state = {
data1: null,
column1: [],
data2: null,
column2: [],
data3: null,
column3: []
};
在 DataGrid method
中检查值是否为假(null
计数,但空数组为真),以及 return null
(无要渲染)如果是:
render() {
const { data, columns } = this.props;
if (!data) return null;
为以上答案添加几点。
它以这种方式表现的原因不是因为异步行为,而是 React component.which 在这种情况下的生命周期性质发生在:
- DataGrid 使用数据的初始状态呈现,即空 [] 数组。
- 没有显示数据,因为此循环中传递的是空[]数组。
- 然后你在componentDidMount中设置状态。
- 为了显示效果,Datagrid 再次用实际数据重新渲染。
基本上我有一组动态的 table 正在根据传递的值显示。如果传递了一个空数组,它应该显示没有找到数据。在我的例子中,当我向 table 发送数据时,所有 table 将首先显示 "No data found",然后是实际的 table 内容。我不确定是什么原因造成的。
异步加载数据,显示未找到数据,然后显示实际内容。我添加了 setInterval 来显示这种异步性质
沙盒:https://codesandbox.io/s/react-table-row-table-ryiny?file=/src/index.js:0-1322
有人可以帮助我吗?
Parent
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} />
</>
);
}
}
Child
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"
)}
</>
);
}
}
使用 null
而不是空数组 (sandbox) 初始化 App 状态的数据:
this.state = {
data1: null,
column1: [],
data2: null,
column2: [],
data3: null,
column3: []
};
在 DataGrid method
中检查值是否为假(null
计数,但空数组为真),以及 return null
(无要渲染)如果是:
render() {
const { data, columns } = this.props;
if (!data) return null;
为以上答案添加几点。
它以这种方式表现的原因不是因为异步行为,而是 React component.which 在这种情况下的生命周期性质发生在:
- DataGrid 使用数据的初始状态呈现,即空 [] 数组。
- 没有显示数据,因为此循环中传递的是空[]数组。
- 然后你在componentDidMount中设置状态。
- 为了显示效果,Datagrid 再次用实际数据重新渲染。