useEffect无限循环与Redux分派上的依赖项数组

问题描述

当我尝试调度从状态中获取所有最新帖子的动作时,它陷入无限循环。

我在useEffect依赖项数组中尝试了以下方法

  • Object.values(statePosts)
  • useDeepCompare(statePosts)
  • 通过dispatch
  • 省略dispatch
  • 省略statePosts
  • 通过statePosts
  • useCallback中做同样的事情

很多建议来自here

我已验证数据在我的redux存储中正确更新。

我不知道为什么这种情况仍在发生

我的组件

  const dispatch = useDispatch()
  const { user } = useSelector((state) => state.user)
  const { logs: statePosts } = useSelector((state) => state.actionPosts)

  const useDeepCompare = (value) => {
    const ref = useRef()
    if (!_.isEqual(ref.current,value)) {
      ref.current = value
    }
    return ref.current
  }

  useEffect(() => {
    dispatch(getActionLogsRest(user.email))
  },[user,dispatch,useDeepCompare(stateLogs)])

actionPosts createSlice

const slice = createSlice({
  name: 'actionPosts',initialState: {
    posts: [],},reducers: {
    postsLoading: (state,{ payload }) => {
      if (state.loading === 'idle') {
        state.loading = 'pending'
      }
    },postsReceived: (state,{ payload }) => {
      state.posts = payload
    },})

export default slice.reducer

const { postsReceived,postsLoading } = slice.actions

export const getActionPostsRest = (email) => async (dispatch) => {
  try {
    dispatch(postsLoading())
    const { data } = await getUserActionPostsByUser({ email })
    dispatch(postsReceived(data.userActionPostsByUser))
    return data.userActionPostsByUser
  } catch (error) {
    throw new Error(error.message)
  }
}

解决方法

从依赖项中删除调度。

 useEffect(() => {
    dispatch(getActionLogsRest(user.email))
  },[user,dispatch,useDeepCompare(stateLogs)])

您不能使用钩子作为依赖项,顺便说一句,ref.current在这里始终未定义

const useDeepCompare = (value) => {
    const ref = useRef()
    if (!_.isEqual(ref.current,value)) {
      ref.current = value
    }
    return ref.current
  }

因为useDeepCompare本质上是您在每次调用时(与ref一起)初始化的一个函数,所以它所做的只是返回value。这就是循环开始的地方。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...