反应 this.state 未定义的数组

Posted

技术标签:

【中文标题】反应 this.state 未定义的数组【英文标题】:React this.state undefined array 【发布时间】:2018-05-09 07:48:36 【问题描述】:

我对 React 有疑问。 我有一个传递给 this.state 的数组。但我面临一个问题,我无法访问数组中的子元素。就我而言,我无法访问 this.state.folders[0]。

这是我的代码:

class DriveContent extends Component 
    constructor () 
        super();
        let list_files = [];
        let list_folders = [];
        axios.get('/api/getFilesAndFolders').then((response) => 
            for (var i = 0; i < response.data.length; i++) 
              if (response.data[i]["isFile"] ==true)
                  list_files.push(response.data[i]);
              
              else 
                  list_folders.push(response.data[i]);
              
            
        ).catch((error) => 
             console.error(error);
        );

       this.state = files: list_files, folders: list_folders;
       console.log(this.state.folders);
       console.log(this.state.folders[0]);
    

这是返回 2 console.log 的内容:

// console.log(this.state.folders);
        []
    0: "Commun"
    1: "Privé"
    2: "Public"
    length: 3

//console.log(this.state.folders[0]);
    undefined

提前致谢!

【问题讨论】:

【参考方案1】:

你设置状态太快了。在您的回调函数中,您需要在分配给list_fileslist_folders 之后使用setState,因为回调是在构造函数完成后执行的。试试这个:

for (var i = 0; i < response.data.length; i++) 
     if (response.data[i]["isFile"] ==true)
       list_files.push(response.data[i]);
     
     else 
       list_folders.push(response.data[i]);
     

// setState here:
this.setState = files: list_files, folders: list_folders;

然后将您的 console.logs 移动到您的渲染函数以查看正在更新的状态。一次是在初始构造上,一次是在 setState 之后。

【讨论】:

效果很好,非常感谢您的解决方案和解释! 很高兴听到这个消息。在开发时始终在您的渲染函数中使用它会很方便:console.log('render', this.props, this.state); 这样您就可以查看所有更新,还可以查看是否需要优化以使用 shouldComponentUpdate 函数减少重新渲染。

以上是关于反应 this.state 未定义的数组的主要内容,如果未能解决你的问题,请参考以下文章

未定义不是对象(正在评估this.state)

this.state.articles 在 React js 中未定义

未定义不是对象(评估“this.state.input”)

this.setState(file) 之后 this.state.file 仍未定义 [重复]

反应:子组件未接收通过“this.state”传递的道具

错误:this.state.data[index].number 打印索引未定义