【问题标题】:React Component keeps re-renderingReact 组件不断重新渲染
【发布时间】:2022-01-27 19:30:43
【问题描述】:

在我的页面中,我在 useEffect 中调用了一个操作来填充我的减速器。我有一个名为 page 的组件级别状态,它是操作中的一个参数。因此,每次page 的值发生变化时,我都希望再次调用该操作,因为显然我打算从不同的页面获取数据。

遗憾的是,我在控制台中遇到错误,告诉我组件已达到其重新渲染次数的限制。

以下是相关代码:

const Home = props => {

    const [page, setPage] = useState(1);

    useEffect(() => {
        props.getPopularMovies(page);
    }, [page])

我的props.getPopularMovies 函数来自我的mapDispatchToProps 函数,该函数被传递到connect()

整个主页:

import React, { useEffect, useState } from 'react'
import { connect } from "react-redux";

// Actions
import { getPopularMovies } from "../actions/movies.action";

const Home = (props) => {

    const [page, setPage] = useState(1);

    useEffect(() => {
        props.getPopularMovies(page);
    }, [page])

    return (
        <div>
            {props.movies && props.movies.length > 0 && props.movies.data.results.map(movie => (
                <p key={movie.id}>{movie.title}</p>
            ))}
            <button onClick={setPage(page + 1)}>Next Page</button>
        </div>
    )
}

const mapStateToProps = state => {
    return {
        movies: state.movies.movies
    }
}

export default connect(mapStateToProps, {
    getPopularMovies
})(Home)

动作文件:

import axios from "axios";
import { GET_MOVIES_FAIL, GET_MOVIES_SUCCESS } from "../constants/movies.constants"

export const getPopularMovies = (page) => async (dispatch) => {
    try {
        const config = {
            params: {
                api_key: process.env.REACT_API_KEY,
                page
            
            }
        };

        const movies = await axios.get('/movie/popular', config);

        dispatch({
            type: GET_MOVIES_SUCCESS,
            payload: movies
        })
    } catch (err) {
        dispatch({
            type: GET_MOVIES_FAIL,
            payload: err
        })
    }
}

【问题讨论】:

  • 谁在使用setPage
  • 请分享 getPopularMovies 的代码
  • 我已更新问题以包含更多代码 :) @SiddharthS.
  • 在更新后的问题中,您将看到它被用于按钮单击@Krasimir
  • @JaredSmith 不太明白,我知道它会在page 更改时运行,因为它在依赖数组中,不确定您在第二部分中的意思。

标签: javascript reactjs use-effect


【解决方案1】:

当您将方法 setPage 作为事件处理程序分配给 onClick 事件时,您是在调用它而不是分配它。所以,而不是这个:

<button onClick={setPage(page + 1)}>Next Page</button>

试试这个:

<button onClick={() => setPage(page + 1)}>Next Page</button>

【讨论】:

  • 这确实做了一些事情,我至少现在可以看到页面上的按钮,但是我的地图功能中没有出现电影列表。尽管在我的减速机中
  • 返回的数据是什么结构... props.movi​​es.data.result的值是多少?此处或 props.movi​​es.map 上的结果是否可以为您提供所需的结果...
  • 当我刷新页面时它又回到空白。在控制台中,它说无法读取未定义的属性,读取“结果”。但我认为我在 map 函数之前的检查应该排序:/
  • 我知道了,看来我得检查一下该州的每个级别,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2023-03-13
  • 2021-06-19
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多