无法使用钩子在 React 中设置状态

Posted

技术标签:

【中文标题】无法使用钩子在 React 中设置状态【英文标题】:Can't set state in React using hooks 【发布时间】:2020-05-12 03:54:13 【问题描述】:

我正在开发一个相当简单的应用程序来学习 React Hooks,但我遇到了困难。我想从特定的 Spotify 播放列表中获取和显示数据。到目前为止,这是我的组件:

import React,  useState, useEffect  from 'react';
import axios from 'axios';

function SongsList() 
    const [data, setData] = useState( songs: [] );
    const [isLoading, setIsLoading] = useState(false);

    useEffect(() => 
        const fetchData = async () => 
            setIsLoading(true);
            const result = await axios.get('https://api.spotify.com/v1/playlists/37i9dQZEVXbMDoHDwVN2tF/tracks', 
                    headers: 
                        Authorization: 'Bearer sometoken'
                    
                
            )
            setData(result.data.items);
            console.log(result.data.items);
            setIsLoading(false);
        
        fetchData();
    , [])

    return (
        <div>
            isLoading ? (
                <div>Loading...</div>
            ) : (
                <div>
                    data.songs.map(song => (
                        <li key=song.track.id>
                            <p>song.track.artist</p>
                        </li>
                    ))
                </div>
            )
            
        </div>
    )


export default SongsList;

这段代码抛出一个错误,说TypeError: data.songs is undefined,我不明白为什么会这样。请注意,在我的fetchData 函数中,我有一个来自控制台的日志,请确保我至少获取任何数据:console.log(result.data.items);。它给了我正确的输出:

但我在useState 输出中的data 似乎从未设置或设置错误。你能帮我理解我的代码有什么问题吗?提前致谢!

【问题讨论】:

您将 array 设置为 data 状态 (result.data.items) 的内容,因此您的代码可能应该是 data.map(...) 【参考方案1】:

您没有正确设置data。您已将data 声明为包含songs 的对象。您应该将songs 设置为:

setData( songs: result.data.items );

这对你有用。

【讨论】:

【参考方案2】:

考虑到您的组件是在发出请求之前安装的,您还应该在渲染之前检查数据是否存在。如下:

 data && data.songs.map(song => (
   <li key=song.track.id>
       <p>song.track.artist</p>
   </li>
   )) 

【讨论】:

【参考方案3】:

改成这个setData(songs: result.data.items);

因为您在对象中定义了 songs 数组。

【讨论】:

以上是关于无法使用钩子在 React 中设置状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在钩子中设置值

为啥我不能在 React 中设置这个状态?

ReactJS 在功能组件中设置状态的基本问题

似乎无法在 UIDocumentInteractionController 中设置颜色或删除状态栏

反应钩子。无法对未安装的组件执行 React 状态更新

无法在 Android 中设置 @react-native-firebase/messaging