React-Native Redux reducer switch 语句忽略类型
React-Native Redux reducer switch statement ignores type
这让我很困惑。我在我的本机反应应用程序中创建了一个减速器和一个动作。但是减速器开关与类型不匹配,只是 returns 默认状态。
整个 store.js,我正在使用 redux-persist 将 redux 数据存储到 AsyncStorage 中:
import {AsyncStorage} from 'react-native';
import {createStore, applyMiddleware} from 'redux';
import {createLogger} from 'redux-logger';
import thunk from 'redux-thunk';
import {persistStore, persistReducer} from 'redux-persist';
import {initAxios, configAxios} from './axios';
import {LOGIN, LOGOUT, LOGIN_ERROR} from '../components/login/actions';
const initialState = {
loggedIn: false,
token: '',
};
const globalReducer = (state = initialState, {type, payload}) => {
console.warn(type); // Logs: LOGIN
switch (type) {
case LOGIN:
console.warn('update state'); // doesn't log
return {...state, loggedIn: true, token: payload};
case LOGOUT:
return {...state, loggedIn: false, token: ''};
case LOGIN_ERROR:
return {...state, loginError: payload, loggedIn: false};
default:
console.warn('no state update'); // do logs
return state;
}
};
const persistConfig = {
key: 'root',
storage: AsyncStorage,
whitelist: ['loggedIn', 'token'],
};
const persistedReducer = persistReducer(persistConfig, globalReducer);
const axiosInstance = initAxios();
export const store = createStore(
persistedReducer,
applyMiddleware(
createLogger(),
thunk.withExtraArgument({axios: axiosInstance}),
),
);
configAxios(axiosInstance, store.dispatch);
export const persistor = persistStore(store);
和调度的动作:
export const loginUser = (login, password, navigate) => async (
dispatch,
_,
{axios},
) => {
try {
const response = await axios.post('/login', {
login,
password,
});
if (!response.token) {
throw new Error('Wrong login credentials');
}
dispatch({type: LOGIN, payload: response.token});
navigate();
} catch (error) {
console.error(error.message);
dispatch({type: LOGIN_ERROR, payload: error.message});
}
};
您不导出类型
export const LOGIN = 'LOGIN';
这让我很困惑。我在我的本机反应应用程序中创建了一个减速器和一个动作。但是减速器开关与类型不匹配,只是 returns 默认状态。 整个 store.js,我正在使用 redux-persist 将 redux 数据存储到 AsyncStorage 中:
import {AsyncStorage} from 'react-native';
import {createStore, applyMiddleware} from 'redux';
import {createLogger} from 'redux-logger';
import thunk from 'redux-thunk';
import {persistStore, persistReducer} from 'redux-persist';
import {initAxios, configAxios} from './axios';
import {LOGIN, LOGOUT, LOGIN_ERROR} from '../components/login/actions';
const initialState = {
loggedIn: false,
token: '',
};
const globalReducer = (state = initialState, {type, payload}) => {
console.warn(type); // Logs: LOGIN
switch (type) {
case LOGIN:
console.warn('update state'); // doesn't log
return {...state, loggedIn: true, token: payload};
case LOGOUT:
return {...state, loggedIn: false, token: ''};
case LOGIN_ERROR:
return {...state, loginError: payload, loggedIn: false};
default:
console.warn('no state update'); // do logs
return state;
}
};
const persistConfig = {
key: 'root',
storage: AsyncStorage,
whitelist: ['loggedIn', 'token'],
};
const persistedReducer = persistReducer(persistConfig, globalReducer);
const axiosInstance = initAxios();
export const store = createStore(
persistedReducer,
applyMiddleware(
createLogger(),
thunk.withExtraArgument({axios: axiosInstance}),
),
);
configAxios(axiosInstance, store.dispatch);
export const persistor = persistStore(store);
和调度的动作:
export const loginUser = (login, password, navigate) => async (
dispatch,
_,
{axios},
) => {
try {
const response = await axios.post('/login', {
login,
password,
});
if (!response.token) {
throw new Error('Wrong login credentials');
}
dispatch({type: LOGIN, payload: response.token});
navigate();
} catch (error) {
console.error(error.message);
dispatch({type: LOGIN_ERROR, payload: error.message});
}
};
您不导出类型
export const LOGIN = 'LOGIN';