最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

useState 没有设置任何内容,如果我将该值添加到依赖项列表中,我的组件将触发无限重新渲染循环

网站源码admin36浏览0评论

useState 没有设置任何内容,如果我将该值添加到依赖项列表中,我的组件将触发无限重新渲染循环

useState 没有设置任何内容,如果我将该值添加到依赖项列表中,我的组件将触发无限重新渲染循环

我想设置一个从 Nodejs 获得的电影数组,该部分工作正常,因为响应正常,但是当我使用 useState 在我的组件中设置数组时,它好像没有触发重新渲染。对不起,如果我的英语不完美,我来自阿根廷,但我找不到任何对我的语言有帮助的文章。

收藏夹组件显示登录用户的收藏夹电影

import React, { useEffect, useState } from "react";
import axios from "axios";
import Modal from "../Modal";

const Favorites = ({user, favMovies}) =>{
    const [myList,setMyList] = useState(favMovies);
    const [favsList,setFavsList] = useState([]);

    const getData = async() =>{
        const response = await axios.post('/api/favs',{favMovies:myList});
        const data = response.data.favsList;
        console.log(data);
        setFavsList(data);
    }

    useEffect(()=>{
        setMyList(favMovies);
        if(myList){
            getData();
        }
    },[])

}

export default Favorites;

App 组件有路由器,如您所见,将 favMovies 作为 prop 发送到 Favorites 组件,这个名为 favMovies 的数组是一个 Id 数组,我通过它逐一获取用户的电影

function App() {
  const [user,setUser] = useState({});
  const [favsList,setFavsList] = useState([]);

  useEffect(()=>{
    const loggedinUser = localStorage.getItem('user');
    if(loggedinUser){
      setUser(JSON.parse(loggedinUser));
      console.log(user);
    }
  },[])

  return (
    <Router>
      <Navbar {...user} setUser={setUser}/>
      <Routes>
        <Route exact path='/' element={<ListMovies url={'/api'}/>} />
        <Route path='/popular' element={<ListMovies url={'/api/popular'} />} /> 
        <Route path='/movie/:id' element={<InfoMovie {...user}/>} />
        <Route path='/contact' element={<Modal msg='Acirca de nos'/>} />
        <Route path='/login' element={<Login setUser={setUser}/>} />
        <Route path='/register' element={<Register/>}/>
        <Route path='/favs' element={<Favorites user={user} favMovies={user.favMovies}/>}/>
        <Route path='*' element={<Modal msg='No hubo coincidencias de ruta'/>} />
      </Routes>
    </Router>
  );
}

export default App;   

如果有人可以帮助我或者已经解决了这个问题,我将非常感激

回答如下:

可能的解决方案:

1.将 favMovies 作为 props 传递给 Favorites 组件而不是将其存储为组件的状态更合适。当组件的 props 改变时,React 会自动重新渲染组件。因此,可以去掉myList状态,直接在getData函数中使用favMovies

2.在useEffect hook中,添加favMovies作为依赖。这样,只要 favMovies 道具发生变化,效果就会运行。

3.在 App 组件中,确保正确设置用户状态并将 user.favMovies 作为 favMovies 属性传递给 Favorites 组件:

 const Favorites = ({ user, favMovies }) => {
      const [favsList, setFavsList] = useState([]);
    
      const getData = async () => {
        const response = await axios.post("/api/favs", { favMovies: favMovies });
        const data = response.data.favsList;
        console.log(data);
        setFavsList(data);
      };
    
      useEffect(() => {
        if (favMovies) {
          getData();
        }
      }, [favMovies]);
    
    
    export default Favorites;
发布评论

评论列表(0)

  1. 暂无评论