Next js 应用刷新时,useEffect 不调度 redux saga 动作并更新状态

Posted

技术标签:

【中文标题】Next js 应用刷新时,useEffect 不调度 redux saga 动作并更新状态【英文标题】:When the Next js app refreshing, useEffect not dispatching redux saga action and updating the state 【发布时间】:2022-01-12 05:22:08 【问题描述】:

我的问题是,当下一个 js 应用程序刷新/重新加载时,redux 存储状态没有更新。我在组件中有以下代码

const Landing = () => 
   const freeADS = useSelector((state) => state.ads.freeAds); //this states are working fine without page refresh
    useEffect(() => 
        dispatch(fetchFreeAds());
    , [])

  return(
    freeADS.map((data, i) => 
       //some codings.........
    )
  )

export default Landing;

redux 操作调用

export const fetchFreeAds = () => 
    return 
        type: ActionTypes.FETCH_FREE_ADS
    

rootsaga / watch saga 收到请求后,我调用如下处理程序

export function* handleFreeAds() 
    
    const  response, error  = yield call(fetchFreeAds);

    if (response)
    
        yield put(type:"SET_FREE_ADS", payload: response.data[0]);
    
    else
        
    

实际的 api 调用在这里

export function fetchFreeAds() 
    return axios.get('http://xxxxxxxxxx')
        .then(response => ( response ))
        .catch(error => ( error ))

我现在收到此错误。请给予一些支持。谢谢

【问题讨论】:

在 API 返回之前不会填充关联的数据。你可以给状态切片一个初始状态。例如。 state = ads: freeAds: [] @slideshowp2 这是管理状态的方法export interface StatefreeAds: nullexport const adReducers = (state = , type, payload) => ...... 【参考方案1】:

感谢@slideshowp2

通过进行此矿工修改解决了问题。将 freeAds:[ ] backet 添加到初始状态。

export interface State
   freeAds: null

export const adReducers = (state = freeAds:[], type, payload) => 
 switch(type)
 case ActionTypes.SET_FREE_ADS:
        return  
           ...state,
           freeAds: payload
        ;
 

【讨论】:

以上是关于Next js 应用刷新时,useEffect 不调度 redux saga 动作并更新状态的主要内容,如果未能解决你的问题,请参考以下文章

手动刷新页面时如何强制app.js中的useEffect在其他组件的useEffect之前加载

Next.js 和 Styled Components 在刷新时服务器和客户端之间不同步

动态路由在使用 Next.js 刷新页面时不起作用

next.js socket.io 使用效果不更新套接字消息

Next.js 500 内部服务器错误在 404 页面内调用 useEffect Hook 后立即出现

useEffect 中的套接字连接事件在创建组件时不起作用,但在 React 中刷新页面后起作用