反应.js - 处于异步数据状态的深层对象不起作用
react.js - Deep Object in state with async data does not work
我刚刚发现 React 状态下有多个子级的对象不容易渲染。
在我的示例中,我有通过 AJAX 与第三方 API 通信的组件:
var Component = React.createClass({
getInitialState: function () {
return {data: {}};
},
loadTrackData: function () {
api.getDataById(1566285, function (data) {
this.setState({data: data});
}.bind(this));
},
componentDidMount: function () {
this.loadTrackData();
},
render: function () {
return (
<div>
<h2>{this.state.data.metadata.title}</h2>
</div>
);
}
});
问题是{this.state.data.metadata}
渲染得很好。
但是{this.state.data.metadata.title}
抛出错误Uncaught TypeError: Cannot read property 'title' of undefined
!
处理此类异步数据的正确方法是什么?
如果页面具有异步操作,我总是喜欢添加加载微调器或指示器。我会这样做
var Component = React.createClass({
getInitialState: function () {
return {data: null};
},
loadTrackData: function () {
api.getDataById(1566285, function (data) {
this.setState({data: data});
}.bind(this));
},
componentDidMount: function () {
this.loadTrackData();
},
render: function () {
var content = this.state.data ? <h2>{this.state.data.metadata.title}</h2> : <LoadingIndicator />;
return (
<div>
{content}
</div>
);
}
});
使用加载指示器基本上它可以改善用户体验,并且不会得到太多不必要的惊喜。 您可以在此处创建自己的加载指示器组件,其中包含许多选择 http://loading.io/
this.state.data.metadata
undefined
,直到加载发生。访问undefined
上的任何属性都会给您带来TypeError
。这不是特定于 React 的——这只是 JavaScript 对象引用的工作方式。
我建议您在初始状态下使用 { data: null }
,并从具有 if (!this.state.data)
条件的 render
返回其他内容。
相关文章:
- 如何在具有某些 UI 视图的状态中管理工厂单个请求数据
- 来自应用程序状态的Jquery数据表源
- 基于javascript中的状态字段对动态行数据进行动态着色
- 美国地图插件,具有状态数据/悬停功能的新按钮
- 如何在状态输入ui路由器时立即显示模板,然后当承诺被解决时显示数据
- 无限滚动,动态数据按上次修改状态排序
- ReactJS加载有状态数据,优化
- 在状态更改时发送带有状态数据的 AJAX 请求
- 当用户单击浏览器后退按钮时,无法在 Angular js 中获取以前的状态数据
- 如何将全局状态数据处理到Redux中的深度嵌套组件中
- 使用基于应用程序状态/数据的UI路由器
- Angularjs ui路由器初始加载时的状态数据
- Ionic混合应用程序,在退出时保存应用程序状态/数据
- 通过JSON响应发送状态数据到POST -通过JavaScript解析
- 访问与Redux状态数据一起发送给组件的props
- 如何在使用Redux进行异步操作调度后检索状态数据
- 通过web更改Firebase上的状态数据(true/false)
- Reactjs:立即使用更新的状态数据(来自存储)
- 在ReactJS中,如何在将新值推入数组之前验证状态数据
- 修改非子react组件的状态数据