React是装载前处理空对象的最佳方式
React best way to handle empty object before mount?
我有一个React类,它想要呈现如下所示的对象:
data: {
title: "haha",
description: {
country: "US",
year: "1996"
}
}
但是,当React想要渲染它时,它会给出一个错误。
未捕获错误:不变冲突:receiveComponent(…):只能更新已安装的组件
我认为问题出在getInitalState中,我将数据声明为空对象,因此当我在超时后获得完整的数据对象时,React会尝试将我的数据对象映射到组件,但会出错。
但有一件有趣的事是,我访问this.props.title.title没有问题,但不访问this.props.title.description.country,它会给出未定义的
但是,当我安慰日志时,我可以看到我的对象。但React无法访问它!
我的猜测是,当React从空对象初始化时,它只会用数据对象的第一级和第二级初始化虚拟DOM。
这就是为什么,当我尝试访问this.props.data.title时可以,但不能访问this.props.data.data.description.country
下面是我的代码
var BookBox = React.createClass({
getInitialState: function() {
return { data: {} };
},
componentWillMount: function() {
var that = this;
setTimeout(function() {
console.log('timeout');
that.setState({
data: {
title: "haha",
description: {
country: "US",
year: "1996"
}
}
});
}, 2000);
},
render: function() {
return (
<div>
<h1>{this.state.data.title}</h1>
<TestBox title={this.state.data} />
</div>
);
}
});
var TestBox = React.createClass({
render: function() {
console.log(this.props.title);
return (
<div>
<p>{ this.props.title.description.country }</p>
<p>{ this.props.title.title }</p>
</div>
);
}
})
我可以知道处理这个问题的最佳方法是什么吗?我应该在getInitialState中初始化我的数据对象结构,还是有更好的方法?
我认为您收到了Can only update a mounted component
错误,因为您同时使用了componentWillMount
和settimeout
,但您不知道在settimeout
函数启动时组件是否已安装。
由于您事先知道自己的状态,我认为最好从getInitialState
函数返回数据。
您也可以使用componentDidMount
而不是componentWillMount
函数。这样,您就可以确保在调用componentDidMount
时安装组件。
任何时候,当您使用像settimeout
或xhr调用这样的asycn函数时,都应该在回调函数中使用this.isMounted()
,以检查在回调触发时组件是否仍处于挂载状态。
例如,如果您事先不知道状态,可以在componentDidMount
函数中激发xhr调用,在success回调中检查this.isMounted()
和setState
。
至于<p>{ this.props.title.description.country }</p>
行上的错误:在初始渲染时,this.state.data
(BookBox)是一个空对象,this.props.title
(TestBox)也是。访问空对象的({ }
)title
属性是undefined
。没问题。访问CCD_ 20也是CCD_。但是访问undefined
的country
是错误的。为了避免这个错误,您可以创建一个description
变量:description = this.props.title.description || {}
,并使用<p>{description.country}</p>
来确保您的代码在this.props.title
为空时不会中断。
- 解析以下对象的最佳方式
- Javascript,用vars创建对象的最佳方法
- Javascript.连接两组对象的最佳方式,如SQL
- 返回多个变量的 JavaScript 函数:数组与对象.最佳实践是什么
- 在对象类上实现 jquery 作用域的最佳方法
- 在下划线.js中扩展对象的最佳实践
- Javascript:从数组中删除包含带有侦听器的对象的项目的最佳方法
- 什么'是使输入上禁用的属性与Meteor辅助对象反应的最佳方法
- Angular:将对象存储在服务中以在视图中显示和将crud函数存储到服务器的最佳方式是什么
- 检查链接对象形式中未定义属性的最佳实践是什么
- 用JavaScript编写对象方法的最佳方式是什么
- 迭代JSON对象并将元素打印到屏幕上的最佳方式是什么
- React是装载前处理空对象的最佳方式
- 对对象数组进行分组和排序的最佳方式
- 传单JS面向对象的最佳方法
- 将特性插入到角度控制器中阵列中的对象中的最佳方式
- 创建javascript对象的最佳方式
- 什么'It是声明对象的最佳方式
- 创建 JavaScript 对象最佳实践
- jQuery/JS -在数组中输出对象-最佳实践