【发布时间】:2016-06-19 13:55:36
【问题描述】:
ReactJS、Baobab、Material-UI 应用程序显示一些项目,由它们的数字 id 标识。为了显示这些,标题和图像 url 是通过 ajax 从远程服务中检索的。树分支存储该数据:
data: {
12345: {title:'ABC', image:'https://...'}, // id is 12345
12346: {...
}
在项目组件创建和首次渲染时,其扩展数据可能已经在树中可用,也可能不可用。如果不是,则将 ajax 调用排入队列以接收该数据。可能会使用相同的项目 ID 创建多个项目。
为了避免对同一个 id 的额外请求,我想在第一次请求该 id 的信息时将一个虚拟信息 {title:'loading', image:'spinner.gif'} 放入树中。因此,该数据将用于第一个render()。后续组件将获取该虚拟信息,并且不会发起任何额外请求。
问题:我可以如何以及在哪里放置代码来测试树是否还没有信息,并将虚拟对象放置在那里以指示其“等待”状态并将请求排入队列?
到目前为止尝试过:
- 组件的
constructor- 尚未设置道具; -
componentWillMount()– 第一次渲染以树的旧状态开始,尽管在设置虚拟值后出现了tree.commit(); - 在分支函数中动态创建指向其数据的组件光标。收到警告:
setState(...):在现有状态转换期间无法更新(例如在
render内)。渲染方法应该是 props 和 state 的纯函数。
这可以在上一级解决 - 一旦 ID 列表可用。但是,组件应该能够在其内部处理其数据,这感觉是对的。
请建议一个正确的方法,在第一次渲染 React 组件之前从该组件中立即更新猴面包树数据?
【问题讨论】:
标签: javascript ajax reactjs flux baobab