javascript - 反应数组映射中的设置值不起作用
问题描述
我有一个看起来很容易的问题..
总而言之,我有很多商店和通过 storeId 与商店相关的许多用户
在我的 componentDidMount 中,我调用了一个服务“getByStore”,它是一个 Promise,它按 storeId(基于模型成员的成员)返回成员列表。
直到那里,一切都好。现在我必须为每个成员设置附加值。所以我映射所有成员并触发一个新的 Promise,它返回一个护送列表。
我将承诺回报分配给会员的正确价值。
之后,我在组件状态中设置值并将其发送到另一个组件。
问题是当我在最终组件中 console.log 时,该值始终设置为 null。就像我的数组映射从未发生过一样。
这很难解释,所以如果我忘记了一些有助于理解的内容,请告诉我。
这是带有数组映射的代码:
componentDidMount() {
const { storeId, store } = Auth.user();
MemberService.getByStore(storeId).then((members) => {
const options = {
fromDate: this.state.period.from,
toDate: this.state.period.to,
};
const membersWithEscorts = members.map((member) => {
EscortService.getLastEscorts(member.id, options).then((escorts) => {
member.setEscortHistory(new EscortHistory(escorts));
});
return member;
});
this.setState({ members: membersWithEscorts, store });
});
}
这是接收成员的代码:
render() {
const { members } = this.props;
return (
<div id="member-list" className="grid">
<div className="grid-sizer" />
{members.map(member => (
<div key={member.id} className="grid-item">
<MemberCard linkTo={`/member/${member.id}`} member={member} />
</div>
))}
</div>
);
}
谢谢 !
解决方案
在将其传递给 setState 之前,您应该等待设置所有护送历史记录:
const membersWithEscorts = Promise.all(members.map((member) => {
return EscortService.getLastEscorts(member.id, options).then((escorts) => {
member.setEscortHistory(new EscortHistory(escorts));
return member;
});
}));
membersWithEscorts.then(members => {
this.setState({ members, store });
});
async
使用/可能会更优雅await
:
async componentDidMount() {
const { storeId, store } = Auth.user();
const members = await MemberService.getByStore(storeId);
const membersWithEscorts = await Promise.all(members.map(m => this.addHistory(m)));
this.setState({ members: membersWithEscorts, store });
}
async addHistory(member) {
const options = {
fromDate: this.state.period.from,
toDate: this.state.period.to,
};
const escorts = await EscortService.getLastEscorts(member.id, options);
member.setEscortHistory(new EscortHistory(escorts));
return member;
}
推荐阅读
- python-3.x - 在 OpenCV python 中使用 0xFF 和 keyWait(1)
- ruby-on-rails - 多重渲染(或部分在 Rails 应用程序中)
- python - 如何在子图中显示所有标签。我有 12 个标签,我必须绘制一个混淆矩阵。但其中只有 6 个可见
- windows-subsystem-for-linux - 导入旧 wsl tar 包后如何更改默认用户?
- javascript - 在 React 中切换不切换所有元素
- c++ - 自旋锁不消耗 100% cpu
- python - Discord 应用程序机器人 Python 3.6
- python - Django/Python3:将复杂的内连接查询转换为
- vue.js - Apexchart 不使用 axios 动态更新
- php - 列出所有超过 28 个字符的分类