0

我目前正在使用来自 OMDB API 的数据在 React.js 中开发一个类似 imdb 的小项目。为了提取数据,我首先编译了一个 imdbID 列表,然后从 API 调用这些端点以获取更详细的数据。

但是,当我将数据添加到数组时,对象会正确显示在 console.logs 中,但数组的长度仍然为零。这使我无法在 React 中显示该数据。

例如:

在此处输入图像描述

如您所见,这里的电影详细信息数组充满了对象,但长度为零。

我很感激任何关于我是否真的正确地将数据推送到数组的见解,因为我似乎无法从其他反应组件中的电影细节数组中访问数据。

这是我正在使用的代码:


const App = () => {
    const [movies, setMovies] = useState([])
    const [movieData, setMovieData] = useState([])
    const [searchValue, setSearchValue] = useState('')
    const movieids = []
    const moviedetails = []
    

    const getMovieRequest = async (searchValue) => {
        const url = `http://www.omdbapi.com/?s=${searchValue}&apikey=263d22d8`
        const response = await fetch(url)
        const responseJson = await response.json()

        if (responseJson.Search) {
            setMovies(responseJson.Search)
        }

    };

    const generateMovieIds = ()=>{
        movies.forEach(element => {
            const currentid = element.imdbID
            movieids.push(currentid)
        });

    }

    const getMovieDetails = async (idValue) => {
        const url = `http://www.omdbapi.com/?i=${idValue}&apikey=263d22d8`
        const response = await fetch(url)
        const responseJson = await response.json()
        moviedetails.push(responseJson)     
        
    };

    const generateMovieDetails = async()=>{
        for(const element of movieids){
            await getMovieDetails(element)
            
        }

    }

    useEffect(() => {
        getMovieRequest(searchValue)
        generateMovieIds()
        generateMovieDetails()
    
        console.log(movies.length + ' LENGTH OF MOVIES')
        console.log(movies)
        console.log(moviedetails.length + ' LENGTH OF MOVIEDETAILS')
        console.log(moviedetails)       
        console.log(movieids.length + ' LENGTH OF MOVIEIDS')
        console.log(movieids)       
            
            
        
        
    }, [searchValue])

    return (
        <div className='container-fluid movie-app'>
            <div className='row d-flex align-items-center mt-4 mb-4'>
                <Heading heading='Movies' />
                {movies.length}
                vs
                {moviedetails.length}
                
                <Searchbar searchValue={searchValue} setSearchValue={setSearchValue} />
            </div>
            <div className='row'>
                <Movies moviedetails={moviedetails} />
            </div>
        </div>
    );
};

export default App;
4

2 回答 2

0

您是否检查过您在下面的函数中获得的数据,我认为您应该控制台记录 responseJson,然后将您想要的数据推送到特定数组。

const getMovieDetails = async (idValue) => {
        const url = `http://www.omdbapi.com/?i=${idValue}&apikey=263d22d8`
        const response = await fetch(url)
        const responseJson = await response.json()
        moviedetails.push(responseJson);
于 2022-01-14T08:27:34.240 回答
0

您不应该将您的 movieDetails 保存为您推送的静态数组。将其更改为useState([])最初,然后setStatemovieDetails组件内部(当前您说movieDetails.push(response).

您的问题是,当您手动将数据推送到数组时,react 不会触发重新渲染,但在您setState使用时会触发useState

于 2022-01-14T08:36:19.890 回答