简体   繁体   English

React JS Map 只渲染一个元素

[英]React JS Map only renders one element

I have an array of objects that are suposed to pass as props to a element to render a list for each object, but when I try the code only one its rendered and the others are ignored even though I've console.log them and I can see them.我有一个对象数组,这些对象应该作为道具传递给一个元素,以便为每个 object 呈现一个列表,但是当我尝试代码时,只有一个呈现了它,而其他的被忽略了,即使我已经 console.log 他们和我可以看到他们。 Here's the code:这是代码:

const mainFilterQueries = ['popular', 'top_rated', 'upcoming']
    const sortByMovies = "movie"
    const [moviesLists, setMoviesLists] = useState([])
    
    
    useEffect(()=>{
        createLists(mainFilterQueries, sortByMovies , setMoviesLists, moviesLists)
        console.log(moviesLists)
    }, [])

    
    async function fetchData(query, sort, setMethod, state){

        let listsCreated = []

        try {
            const response = await fetch(`https://api.themoviedb.org/3/${sort}/${query}?api_key=${apikey}`)
            const data = await response.json();
            let dataObject = {key:`${sort}-${query}`, data:data.results, title:`${query}`}
            console.log(dataObject)
            listsCreated.push(dataObject);
            setMethod([...state, dataObject])

        } catch (error) {
            console.error(error)
        }
    }
    function createLists(arr, sort, target, state){
        arr.forEach(query =>{
            fetchData(query, sort, target, state)
        })
    }
    


    

    


    return (
        <React.Fragment>
            {moviesLists.map(list =>{
            return(
                <div>
                    <MoviesList dataList={list}/>
                </div>
            )  
            })}
        </React.Fragment>
    )

You're calling setMethod([...state, dataObject]) in a loop.您正在循环中调用setMethod([...state, dataObject]) state will never be updated until the next render, meaning you're actually calling the function as if it were like this: setMethod([...[], dataObject]) for every iteration. state在下一次渲染之前永远不会更新,这意味着您实际上是在调用 function 就好像它是这样的:每次迭代的setMethod([...[], dataObject])

Instead use the functional update form of setState like this:而是使用setState的功能更新形式,如下所示:

setMethod((prev) => ([...prev, dataObject]))

The functional update ensures that the previous state is most up-to-date with any previous calls to setMethod .功能更新确保之前的 state 与之前对setMethod的任何调用都是最新的。

See also why-calling-react-setstate-method-doesnt-mutate-the-state-immediately .另请参阅为什么调用反应设置状态方法不改变状态立即

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM