3 回答
TA贡献1829条经验 获得超4个赞
不知道为什么要在类之外声明变量,然后将其用作其状态。我愿意:-
import React, {Component} from 'react';
import './App.css';
class App extends Component {
constructor() {
super();
this.state = {
myData: [{name:'Item 1'},
{name:'Item 2'},
{name:'Item 3'}],
myVar : 2}
}
componentDidMount() {
//myVar = myVar + 1;
// myDataObj.myData.push({name:'Item 4'});
// someData.myData.push({name:'Item 4'}); this doesn't work... 'someData' is not defined
this.setState({myData: [...this.state.myData, {"name" : 4}],
myVar : this.state.myVar + 1});
}
render () {
return(
<div className="App">
{console.log(this.state.myVar)}
{console.log(this.state.myData[3])}
</div>
);
}
}
export default App;
TA贡献1815条经验 获得超6个赞
您可能想查看 React 的组件生命周期。
ComponentDidMount get 在挂载后执行,例如在组件渲染一次之后。在您的第一次渲染期间this.state.someData.myData未定义。访问未定义的属性会导致 TypeError。
将您的变量直接移动到您的状态:
this.state = {
myData: [
{name:'Item 1'},
{name:'Item 2'},
{name:'Item 3'}
],
myVar : 2
}
TA贡献2065条经验 获得超14个赞
关于您的第一个日志语句,someData未定义,因为它是一个状态变量,因此需要作为this.state.someData. 仍然将项目直接推入状态不是一个好习惯。只是为了您的日志语句,您的状态需要像我在下面所做的那样初始化才能正确运行。
this.state = {
someData: {
myData: []
},
myVar
}
这也应该解决您的第二个日志语句。如果你想登录this.state.someData.myData[0]你的第一次渲染,你的状态需要像上面一样初始化,因为myDatasomeData 中的数组直到你的setStatein componentDidMount 运行才被定义。
添加回答
举报