【发布时间】:2020-08-20 03:01:43
【问题描述】:
编辑 - 添加 render 函数
我已经为此奋斗了好几个星期了。我想创建两个显示在仪表板中的列表,都使用来自 API 的数据。如果我使用虚拟数据创建 const,则列表将根据需要显示。但是,当我尝试使用相同的代码来显示来自我的 API 的信息时,我会在设置状态条件调用渲染之前显示一个列表。有一次我没有显示任何一个列表,所以我很高兴至少取得了一些进展。如果有人能帮助指出我做错了什么,我将不胜感激!
async componentDidMount() {
let data = {
firstName: sessionStorage.getItem('cwsFirstName'),
surname: sessionStorage.getItem('cwsSurname'),
email: sessionStorage.getItem('cwsUser'),
role: sessionStorage.getItem('cwsRole'),
type: sessionStorage.getItem('cwsType'),
storeId: sessionStorage.getItem('cwsStoreId'),
clientId: sessionStorage.getItem('cwsClient')
};
let user = [];
user.push(data);
await this.setState({ user: user });
const client = data.clientId;
// start with extracting the services from the db
const clientservices = await this.mysqlLayer.Get(`/admin/clientservices/${client}`);
//console.log('clientservices: ', clientservices);
let workzones = [
{
worklist: 'Queues',
task: 'list_all'
},
{
worklist: 'Today',
task: 'list_today'
}
];
// loop through services to populate worklists
let loopCount = 0;
clientservices.forEach(async service => {
let workspace = service.service;
let type = service.type;
let workspaces = [];
// loop through the workzones
workzones.forEach(async workzone => {
//console.log('workzone: ', workzone);
let worklists = [];
let task = workzone.task;
let records = await this.mysqlLayer.Get(`/${type}/${workspace}/${task}/${client}`);
//console.log('records: ', records);
let statusArr = [];
records.forEach(async record => {
//console.log('currentStatus: ', record.currentStatus);
statusArr.push(record.currentStatus);
});
let completeWorklist = statusArr.filter(this.onlyUnique);
let statusList = [];
if (completeWorklist.length > 0) statusList = this.filterWorklists(workspace, completeWorklist);
let items = [];
statusList.forEach(async element => {
//console.log('element: ', element);
let count = 0;
records.forEach(async record => {
if (record.currentStatus === element) {
++count;
}
});
items.push({
item: element,
count: count
});
//console.log('items: ', items);
}); // end of worklist loop *******************************
worklists.push({
worklist: workzone.worklist,
items: items
});
//console.log('worklists: ', workzone, worklists, moment(new Date()).format('HH:mm:sss'));
//console.log('worklists: ', workzone, worklists, moment(new Date()).milliseconds());
await this.setState({
records: records,
type: type,
worklists: [...this.state.worklists, ...worklists]
});
++loopCount;
console.log('loopCount: ', loopCount);
//console.log('this.state.worklists: ', this.state.worklists, moment(new Date()).milliseconds());
let tempWorklists = this.state.worklists;
//console.log('tempWorklists: ', tempWorklists, moment(new Date()).milliseconds());
workspaces.push({
workspace: workspace,
worklists: tempWorklists
});
}); // end of workzone loop *******************************
//console.log('2 workspaces: ', workspaces);
await this.setState({
//loading: false,
//workspaces: [...this.state.workspaces, ...workspaces]
workspaces: workspaces
//workspaces: workspacesConst
});
//console.log('this.state.workspaces: ', this.state.workspaces, moment(new Date()).milliseconds());
await this.setState({
//loading: false,
//workspaces: [...this.state.workspaces, ...workspaces]
workspaces: workspaces
//workspaces: workspacesConst
});
//console.log('this.state.workspaces: ', this.state.workspaces, moment(new Date()).milliseconds());
}); // end of workspace loop *******************************
// Should be good to render now
//if (this.state.worklists.length > 1)
await this.setState({ loading: false });
//this.forceUpate();
}
render() {
if (this.state.loading) {
return (
<div>Loading...</div>
);
} else {
const workspace = this.state.workspaces.map((workspace, idx) =>
//const workspace = workspaces.map((workspace, idx) =>
<div key={idx} className="card border-light mb-3" style={{padding: "20px"}}>
{console.log('render workspace: ', workspace.worklists, moment(new Date()).milliseconds())}
<Workspace
key={idx}
records={this.state.records}
workspaces={workspace}
type={this.state.type}
user={this.state.user}
/>
</div>
);
return (
<div className="container">
<div className="cols-12">
<Welcome user={this.state.user}/>
{workspace}
</div>
</div>
);
}
}
【问题讨论】:
-
一旦您使用 setState 更新状态,渲染将始终执行。在第一次迭代之后,您将更新工作区的状态,这将强制重新渲染。看不到渲染功能就忍不住了。
-
抱歉,我忘了包括
render。我现在编辑了我的问题以添加它。