React useEffect钩无限循环

时间:2019-10-25 11:41:52

标签: reactjs loops react-hooks use-effect

在尝试使用useEffect挂钩来获取和设置数据时,我一直遇到无限循环。香港专业教育学院尝试了3种变化的钩子,他们都产生一个循环,我该如何阻止这种情况发生?

useEffect(() => {
        (async () => {
            PostApi.getPostsByUser(auth.user._id, auth.token).then(response => setPosts(response))
        })()
    })
useEffect(() => {
        (async () => {
            PostApi.getPostsByUser(auth.user._id, auth.token).then(response => setPosts(response))
        })()
    },[])
useEffect(() => {
        (async () => {
            PostApi.getPostsByUser(auth.user._id, auth.token).then(response => setPosts(response))
        })()
    },[profile.posts])

编辑:这是PostApi.getPostsByUser代码

getPostsByUser: (userId, token) => {
        return(
            axios
            .get("/api/posts/by/" + userId, {
                headers: {
                    Accept: "application/json",
                    "Content-Type": "application/json",
                    Authorization: "Bearer " + token
                }
            })
            .then(response => {
                console.log("Posts by User");
                console.log(response.data);
                return response.data;
            })
            .catch(err => console.log(err))
        )
    }

编辑:功能组件代码:

const Posts = () => {
    const [{auth}] = useAuth();
    const [{profile},, setPosts] = useProfile()

    useEffect(() => {
        PostApi.getPostsByUser(auth.user._id, auth.token)
        .then(response => setPosts(response));
    },[]);

    console.log(profile)
    return(
        <div className="User-Post">
            <div className="New-Post">
                <NewPost />
            </div>
            <div className="User-Posts-Content">
                {
                    profile.posts ? profile.posts.map((item, key) => {
                        return <Post post={item} key={key} />
                    }) : null
                }
            </div>
        </div>
    )
}

export default Posts

3 个答案:

答案 0 :(得分:0)

更改:

const [auth] = useAuth();
const [profile, setPosts] = useState();


const setPosts = posts => { setPosts(state => ({ ...state, profile: { 
             ...state.profile, posts: posts } })) } 


getPostsByUser: (userId, token) => {
        return(
            axios
            .get("/api/posts/by/" + userId, {
                headers: {
                    Accept: "application/json",
                    "Content-Type": "application/json",
                    Authorization: "Bearer " + token
                }
            });
    }

useEffect(() => {
            PostApi.getPostsByUser(auth.user._id, auth.token)
            .then(response => setPosts(response.data));     
     },[]);

答案 1 :(得分:0)

您可以尝试这样。

useEffect(() => {
  const get = async () => {
    const response = await PostApi.getPostsByUser(auth.user._id, auth.token);
    setPosts(response);
  }
  get();
},[]);

答案 2 :(得分:0)

这对我有用...也是最简单的解决方案

  const [toggle, setToggle] = useState(false);
  useEffect(() => {
          (async () => {
              PostApi.getPostsByUser(auth.user._id, auth.token).then(response => setPosts(response))
          })()
      },toggle)