this.props 属性的问题,即使它们存在
Issue with this.props properties not existing even though they do
对,这是一个地狱般的名字。但我就是想不出更好的标题。
问题如下。
在 React 中,在componentWillMount
期间,我将状态启动到 null
,然后在通过 ajax 从服务器中提取数据后进行更新。
结构如下所示:
componentWillMount() {
this.state = { calculator: {} };
initCalculator()
.then(calculator => {
this.setState({ calculator });
})
.catch(err => {
console.log(err);
});
}
数据本身被拉到这里:
function initCalculator() {
const promise = new Promise((resolve, reject) => {
const instance = parseInstance();
const compId = Wix.Utils.getOrigCompId();
axios.get(`/api/calculator?instance=${instance}&compId=${compId}`)
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err);
});
});
return promise;
}
res.data
是包含来自服务器的数据的响应对象。
然后,这些数据将传递到状态,如您在上面看到的那样。
然后,此状态数据将传递给另一个元素,如下所示:
<Settings tab="Settings" calculator={ this.state.calculator } onUpdate={ this.settingsUpdate.bind(this) }/>
但是,数据不会在"设置"选项卡的另一端"解析"。
每当我尝试访问计算器对象深处的属性时,它总是向我抛出错误。
cannot read property settings of null
这可以在这里看到
const name = this.props.calculator.settings ? this.props.calculator.settings.name : '';
因此,如果我尝试访问calculator.settings.name
,它会向我抛出类似的错误。
此外,const name
总是设置为 ''
,即使在第二次重新渲染期间,当数据可能已经可用时,因为状态已更新,从而提示在子元素中重新渲染。
我理解为什么会这样。至少有点。对象在解析之前传递,因此在第二次状态更改期间(即this.setState({ calculator });
在状态完全更新之前调用重新渲染。至少我是这么认为的。
如果我console.log(this.props.calculator)
,我可以看到所有这些数据。但是由于控制台.log,单击箭头展开详细信息后,它会同时解析数据。
如果我这样做JSON.stringify(this.props.calculator)
,数据都显示在那里可用。现在我知道我可以使用JSON.stringify
和JSON.parse
来解决这个问题。但这只是解决我可能自己创造的此类问题的一种愚蠢方法。
我知道对象通过引用工作。所以我认为问题出在初始 ajax get 请求或 setState 方法的某个地方。
也许有敏锐眼光的人能够看到这里的问题所在。但此时我只是把头撞在墙上。
在constructor
而不是componentWillMount
中设置您的状态。在 componentDidMount 上进行 ajax 调用,并在请求成功时更新状态。
constructor(props) {
super(props);
this.state = {
data: null,
}
}
componentWillMount() {
}
updataStateFromCompletedAjax(data) {
this.setState({
data: data
})
}
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 如何使用Spring MVC将Facebook返回的响应数据保存在Java类中
- 用于检查数组中是否存在元素的javascript自定义方法
- 未捕获的类型错误:无法读取属性'name'即使它存在,也无法定义
- 正在将事件处理程序添加到不存在的类
- 是否存在React Native“;WEB代码安全防护”;
- 一个密码测试程序,如果存在空格,它会提醒用户
- 验证会话中是否存在对象's数组
- javascript如果图像不存在don't加载它
- 如何查找值是否存在于二叉树中
- IE9的HTML5 Canvas getImageData()函数存在问题
- 由于响应中不存在“Access Control Allow Origin”标头,跨域请求停止工作
- CORS-服务器端cookie没有保存在chrome浏览器上
- 检查是否存在使用chrome扩展的javascript库
- 是否存在Javascript Liferay Service库的文档?如何处理错误情况
- 测试mongo脚本中是否存在参数
- 存在每个时间元素的javascript事件
- this.props 属性的问题,即使它们存在