【问题标题】:React JS Map only renders one elementReact JS Map 只渲染一个元素
【发布时间】:2021-04-25 02:35:59
【问题描述】:

我有一个对象数组,它们应该作为道具传递给一个元素以呈现每个对象的列表,但是当我尝试代码时,只有一个它呈现,而其他的被忽略,即使我有 console.log他们,我可以看到他们。代码如下:

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>
    )

【问题讨论】:

  • 您可以尝试最小化代码来定位问题所在。例如,删除除return 之外的所有内容,尝试使用硬编码值,将moviesLists.length 添加到输出中。像这样:return &lt;div&gt; {moviesLists.length} {moviesLists.map((x, i) =&gt; &lt;span&gt;{i}&lt;/span&gt;)} &lt;/div&gt;。在此之后,找出问题所在会容易得多。

标签: javascript reactjs react-hooks


【解决方案1】:

您正在循环调用setMethod([...state, dataObject])state 在下一次渲染之前永远不会更新,这意味着您实际上是像这样调用函数:setMethod([...[], dataObject]) 每次迭代。

改为使用setState的功能更新形式,如下所示:

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

功能更新确保之前的状态与之前对setMethod的任何调用都是最新的。

另见why-calling-react-setstate-method-doesnt-mutate-the-state-immediately

【讨论】:

  • 谢谢!有效。我不知道这种形式的 setState,我会阅读更多关于它的内容!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2019-03-13
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多