You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React天气应用首次启动从Redux Store读取数据异常问题

天气应用首次启动报错问题

我开发了一款天气应用,启动逻辑是:通过IP请求确定城市,将城市信息保存到Redux Store,随后立即请求并显示该城市的天气。

但遇到以下问题:首次运行时error字段为true(React DevTools检查显示状态已填充正确数据),导致应用直接进入错误页面无法启动;刷新页面后一切正常。怀疑该问题与redux-persist的配置有关。


组件核心代码

const { isPending, days, error, currentDayWeather } =
    useTypedSelector((state) => state.weather)
const weatherCity = useTypedSelector(
    (state) => state.weather.weather?.city,
)
const userCity = useTypedSelector(
    (state: any) => state.location?.location?.city?.name_en,
)
const { service } = useTypedSelector(
    (state) => state.service,
)

useLayoutEffect(() => {
    dispatch(getGeolocation())
}, [])

useEffect(() => {
    dispatch(getWeather(userCity))
}, [userCity])

useEffect(() => {
    setSelected(0)
}, [weatherCity])

if (isPending || !weatherCity) return <Loading />
if (!days || error) return <ErrorLoader />

return (
    <WeatherWrapper>
        <WeatherMain
            params={weatherCity}
            currentWeather={currentDayWeather}
        />
        <WeatherListCard>
            {days.map((item: ResultDaysType, index: number) => (
                <WeatherItem
                    key={uuidv4()}
                    day={index}
                    weatherData={item}
                    active={selected === index}
                    onChangeSelected={setSelected}
                />
            ))}
        </WeatherListCard>
        {service === SERVICES[1] && <ChartWeather />}
    </WeatherWrapper>
)

store.ts 配置代码

...
const persistedReducer = persistReducer(persistConfig, rootReducer)

const configureStore = () =>
    createStore(
        persistedReducer,
        composeEnhancers(applyMiddleware(thunk)),
    )

const store = configureStore()
const persistor = persistStore(store)

export { store, persistor }

Reducers 代码

locationReducer

export const locationReducer = (
    state = initialState,
    action: { location: any, type: string },
): initialStateType => {
    const { location, type } = action

    switch (type) {
        case TYPES.GET_LOCATION:
            return {
                ...state,
                location
            }
        default: {
            return state
        }
    }
}

weatherReducer

export const weatherReducer = (
    state = initialState,
    action: any,
): initialStateType => {
    const {
        weather, days, isPending, error, type,
    } = action

    switch (type) {
        case TYPES.SET_WEATHER:
            return {
                ...state,
                weather,
                days
            }
        case TYPES.SET_WEATHER_HOURLY:
            return {
                ...state,
                weatherHourly: weather,
            }
        case TYPES.SET_PENDING:
            return {
                ...state,
                isPending
            }
        case TYPES.SET_ERROR:
            return {
                ...state,
                error
            }
        case TYPES.CHANGE_DAY:
            return {
                ...state,
                currentDayWeather: state?.days![action.payload] ?? false,
                weatherOnHours: {
                    temp: state?.days![action.payload].weather.map((temp) => Math.round(+temp.main.temp)) ?? false,
                    date: state?.days![action.payload].weather.map((temp) => temp.dt_txt) ?? false,
                },
            }
        default: {
            return state
        }
    }
}

Thunk 异步逻辑代码

export const getWeather = (city: string): ThunkType<ActionsTypes<typeof actions>> => async (dispatch) => {
    try {
        dispatch(actions.setPending(true))
        dispatch(actions.setError(false))

        const weather = await weatherApi.getWeather(city)

        dispatch(actions.setWeather(weather))
        dispatch(actions.changeDay(0))
    } catch (error: unknown) {
        dispatch(actions.setError(true))
    } finally {
        dispatch(actions.setPending(false))
    }
}

内容的提问来源于stack exchange,提问作者qwfrjk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:15:39