React-Native Redux reducer switch 语句忽略类型

Posted

技术标签:

【中文标题】React-Native Redux reducer switch 语句忽略类型【英文标题】:React-Native Redux reducer switch statement ignores type 【发布时间】:2020-04-13 19:44:27 【问题描述】:

这真的让我很困惑。我在我的 react-native 应用程序中创建了一个减速器和一个动作。但是 reducers 开关与类型不匹配,只是返回默认状态。 整个 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);
    
;

【问题讨论】:

只是const LOGIN = 'LOGIN'; 我记得有完全相同的问题,但我忘了是什么导致她 可能有一些依赖?我在一些 github 问题中看到了这种情况。但它是我不使用的 react-router 不,它在你的代码中 我已经添加了整个商店创建文件,可能有一些我看不到的东西 【参考方案1】:

您不导出类型

   export const LOGIN = 'LOGIN';

【讨论】:

以上是关于React-Native Redux reducer switch 语句忽略类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在reducer中专门使用redux来获取react-native中的API?

Reducer 总是返回初始状态 React-native

路由器状态没有通过 redux 保持在 react-native

我在 react-native 和 redux 中处理 API 调用的地方

将 Redux 添加到 React-Native 应用程序?

React-Native Redux 无法设置状态