【发布时间】:2021-06-09 22:23:26
【问题描述】:
我是反应原生(和 redux!)的新手。我正在创建一个非常简单且具有登录和仪表板屏幕的移动应用程序。
但是,我遇到了一个问题,当我调用另一个 reducer 时,它会覆盖并清除其他 reducer 先前设置的状态。
为了举例说明问题,这里是应用核心设计/代码。 登录屏幕在 Firebase 中登录用户并将操作发送到以下减速器:
const initialState = {
currentUser: null,
isLogged: false
}
export const user = (state = initialState, action) => {
return {
...state,
currentUser: action.currentUser,
isLogged: action.isLogged
}
}
到目前为止,一切顺利,现在我使用 App.js 将用户发送到仪表板,使用以下 sn-p:]
<NavigationContainer>
{
isLogged ? (
<Stack.Navigator initialRouteName="DashboardScreen">
<Stack.Screen name="DashboardScreen" component={DashboardScreen} options={{ headerShown: false }} />
</Stack.Navigator>
) : (
<Stack.Navigator initialRouteName="LoginScreen">
<Stack.Screen name="LoginScreen" component={LoginScreen} options={{ headerShown: false }} />
</Stack.Navigator>
)
}
</NavigationContainer>
在仪表板屏幕中,我有一个按钮可以触发一个动作,该动作会转到以下减速器:
const initialState = {
lastUpdate: null,
isSync: false
}
export const db = (state = initialState, action) => {
return {
...state,
lastUpdate: action.lastUpdate,
isSync: action.isSync
}
}
每当我单击按钮时,应用程序都会返回主屏幕。 “错误”是现在之前设置的 isLogged 变量没有未定义,导致应用返回登录。
我正在我的 App.js 中使用以下代码创建减速器:
import { combineReducers } from "redux";
import { user } from "./user";
import { db } from "./db";
const Reducers = combineReducers({
userState: user,
dbState: db
})
const store = createStore(rootReducer, applyMiddleware(thunk))
抱歉,问题令人困惑,但 react 似乎有太多样板文件,我无法用更少的行举例说明发生了什么。我该如何解决这个问题?
提前致谢
【问题讨论】:
-
只有当 action.type 是特定类型时,reducer 才应该返回一个新状态。所有的 reducer 都会被调用,包括那些不应该被 reducer 处理的 action。所以你的减速器应该看起来像
(state,{type,payload})=>{if(type===SOME_TyPE){return {...state,modification:payload}} return state} -
@HMR 你能进一步详细说明这个解决方案吗?
标签: javascript reactjs react-native react-redux state