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

如何在React Native旧项目中迁移Redux Toolkit并保留原有核心逻辑

在React Native项目中集成Redux Toolkit并升级react-redux(保留现有Store/Reducer/Dispatch)

需求描述

我需要在现有React Native项目中接入Redux Toolkit,但要完全保留当前正在使用的Store、Reducer和Dispatch调用方式,不需要重新编写相关逻辑。同时我正在尝试把react-redux升级到最新版本,求具体的实施步骤。

项目现有代码如下:

现有store.js

import { createStore } from 'redux';

const initialState = {
    SelectIdForm: [],
    OrgList: [],
    OrgListLength: "",
    RequesterList: [],
    getUserStatus: "",
    TicketDetails: [],
    UsersList: [],
    UsersListLength: "",
    helpTopicMentMultopleSelect: -1,
    departMentMultopleSelect: -1,
    storeIndexValueOfHelpdesk: -1,
    storeIndexValueOfDepartment: -1
};
import reducer from './reducer';
const store = createStore(reducer, initialState);
export default store;

现有reducer.js

export default (state, action) => {

    switch (action.type) {
        case "SEARCHRESULT":
            return {
                ...state,
                searchTicket: action.payload,
            }
        case "USERNAME":
            return {
                ...state,
                userName: action.payload,
            }
        case "SEARCHDATA":
            return {
                ...state,
                SearchData: action.payload,
            }
        case "DEPARTMENTSSUPPLEMENTS":
            return {
                ...state,
                departments_supplements_Id: action.payload,
            }
        case "HELPTOPICSUPPLEMENTS":
            return {
                ...state,
                help_topic_supplements_Id: action.payload,
            }
        case "ALLSHOWINGTICKET":
            return {
                ...state,
                AllTIcketShowing: action.payload,
            }
        case "TICKETLENGHT":
            return {
                ...state,
                TicketLenght: action.payload,
            }
        case "TICKETDETAILS":
            return {
                ...state,
                TicketDetails: action.payload,
            }
        case "GET_USER_STARTED":
            return {
                ...state,
                getUserStatus: 'STARTED',
            }
        case "GET_USER_SUCCESS":
            return {
                ...state,
                getUserStatus: 'SUCCESS',
            }
        case "GET_USER_FAILED":
            return {
                ...state,
                getUserStatus: 'FAILED',
            }
        case "USERSLIST":
            return {
                ...state,
                UsersList: action.payload,
            }
        case "ORGLIST":
            return {
                ...state,
                OrgList: action.payload,
            }
        case "USERSLISTLENGTH":
            return {
                ...state,
                UsersListLength: action.payload,
            }
        case "ORGLISTLENGTH":
            return {
                ...state,
                OrgListLength: action.payload,
            }

        case "PROFILEIMAGE":
            return {
                ...state,
                ProfileImage: action.payload,
            }
        case "PROFILENAME":
            return {
                ...state,
                ProfileName: action.payload,
            }
        case "APIENDPOINT":
            return {
                ...state,
                ApiEndPoint: action.payload,
            }
        case "TOTALTICKETLENGHT":
            return {
                ...state,
                TotalTicketLenght: action.payload,
            }
        case "PAGECHANGE":
            return {
                ...state,
                PageChange: action.payload,
            }
        case "DRAWERITEMLISTLENGTH":
            return {
                ...state,
                DrawerItemListLengh: action.payload,
            }
        case "DRAWERITEMLIST":
            return {
                ...state,
                DrawerItemList: action.payload,
            }
        case "UPDATEDRAWERITEMLISTLENGTH":
            return {
                ...state,
                UpdateDrawerItemListLength: action.payload,
            }
        case "CATEGORY":
            return {
                ...state,
                SelectCategory: action.payload,
            }
        case "HELPTOPICSENDINGNODEDATA":
            return {
                ...state,
                sendingNodeDataHelpTopic: action.payload,
            }
        case "DEPARTSENDINGNODEDATA":
            return {
                ...state,
                sendingNodeDataDepart: action.payload,
            }
        case "SERACHBOTTOMTRUE":
            return {
                ...state,
                searchButtomTrue: action.payload,
            }
        case "RESETSEARCHDATA":
            return {
                ...state,
                resetSearchData: action.payload,
            }
        case "TITLESET":
            return {
                ...state,
                setTitle: action.payload,
            }
        case "INBOXANDREPLYISTRUE":
            return {
                ...state,
                replyAndInboxIsTrue: action.payload,
            }
        case "ALLCHECKTICKET":
            return {
                ...state,
                AllCheckTicket: action.payload,
            }
        case "ALLCHECKTICKETTREAD":
            return {
                ...state,
                AllCheckTicketThread: action.payload,
            }
        case "REPLYPAGECOLLABO":
            return {
                ...state,
                ReplyPageCollabo: action.payload,
            }
        case "USERINFOID":
            return {
                ...state,
                UserInfoID: action.payload,
            }
        case "HIDEBUTTOM":
            return {
                ...state,
                HideBottomOnThread: action.payload,
            }
        case "CLOSEDBUTTOM":
            return {
                ...state,
                ClosedButtomOnThread: action.payload,
            }
        case "CHANGESTATUS":
            return {
                ...state,
                ChangeStatus: action.payload
            }
        case "USERLISTLENGTH":
            return {
                ...state,
                UserListLenth: action.payload
            }
        case "USERLISTINBOXPAGELENGTH":
            return {
                ...state,
                UserListInboxLenth: action.payload
            }
        case "USERLIST":
            return {
                ...state,
                UserList: action.payload
            }
        case "USERSAPIENDPOINT":
            return {
                ...state,
                UserApiEndPoint: action.payload
            }
        case "USERCREATEAFTERLOGIN":
            return {
                ...state,
                UserCreateAfterLogin: action.payload
            }
        case "ORGANISATIONSELECTVALUE":
            return {
                ...state,
                OrganisationSelectValue: action.payload
            }
        case "OWNERIDTRUE":
            return {
                ...state,
                OwnerIdTrue: action.payload
            }
        case "OWNERID":
            return {
                ...state,
                OwnerId: action.payload
            }
        case "ORGANIZATIONIDTRUE":
            return {
                ...state,
                OrganizationsIdTrue: action.payload
            }
        case "ORGANIZATIONID":
            return {
                ...state,
                OrganizationsId: action.payload
            }
        case "RETURNSAMEPAGE":
            return {
                ...state,
                ReturnSamePage: action.payload
            }
        case "SAVENEWUSERDETAIL":
            return {
                ...state,
                SaveNewUserData: action.payload
            }
        case "FROMLOGINPAGETOUSERREG":
            return {
                ...state,
                FromLoginTOuserReg: action.payload
            }
        case "RETURNEDITTICKET":
            return {
                ...state,
                returnEditTicket: action.payload
            }
        case "BACKEDITTICKET":
            return {
                ...state,
                backEditTicket: action.payload
            }

        case "SHOWINGINEDITTICKET":
            return {
                ...state,
                showingUserInEditTicket: action.payload
            }
        case "PANEL":
            return {
                ...state,
                panel: action.payload
            }
        case "FILTERAPI":
            return {
                ...state,
                filterApitrue: action.payload
            }
        case "GETTICKETTHREAD":
            return {
                ...state,
                getTicketThread: action.payload
            }
        case "STORECCDATA":
            return {
                ...state,
                storeCCData: action.payload
            }
        case "DEPARTMULTIPLESELECT":
            return {
                ...state,
                departMentMultopleSelect: action.payload
            }
        case "HELPTOPICMULTIPLESELECT":
            return {
                ...state,
                helpTopicMentMultopleSelect: action.payload
            }
        case "STOREINDEXVALUEOFHELPTOPICNODE":
            return {
                ...state,
                storeIndexValueOfHelpdesk: action.payload
            }
        case "STOREINDEXVALUEOFDEPARTMENTNODE":
            return {
                ...state,
                storeIndexValueOfDepartment: action.payload
            }

        case "GOBACK":
            return {
                ...state,
                goBack: action.payload
            }

        default:
            return state;
    }
}

组件中现有Dispatch用法(userlist.js)

AddUser = () => {
    this.props.dispatch({ type: "CATEGORY", payload: "user" });
    this.props.dispatch({ type: "PANEL", payload: "agent" });
    this.props.dispatch({ type: "USERCREATEAFTERLOGIN", payload: true });
    this.props.dispatch({ type: "RETURNEDITTICKET", payload: false });
    this.props.dispatch({ type: "RETURNSAMEPAGE", payload: false });
    this.props.dispatch({ type: "FROMLOGINPAGETOUSERREG", payload: false });
    this.props.navigation.push(AppRoutes.CREATETICKET);
  };

实施步骤

1. 安装依赖

首先安装Redux Toolkit和最新版react-redux:

npm install @reduxjs/toolkit react-redux@latest
# 或使用yarn
yarn add @reduxjs/toolkit react-redux@latest

2. 改造Store配置(仅修改store.js)

Redux Toolkit的configureStore完全兼容传统reducer,不需要修改现有reducer代码,仅替换createStore为configureStore即可:

改造后的store.js:

import { configureStore } from '@reduxjs/toolkit';
import reducer from './reducer';

const initialState = {
    SelectIdForm: [],
    OrgList: [],
    OrgListLength: "",
    RequesterList: [],
    getUserStatus: "",
    TicketDetails: [],
    UsersList: [],
    UsersListLength: "",
    helpTopicMentMultopleSelect: -1,
    departMentMultopleSelect: -1,
    storeIndexValueOfHelpdesk: -1,
    storeIndexValueOfDepartment: -1
};

// configureStore自动包含redux-thunk等常用中间件,完全兼容现有reducer
const store = configureStore({
  reducer: reducer,
  preloadedState: initialState
});

export default store;

3. 验证现有组件代码无需修改

你现有组件中(比如userlist.js的AddUser方法)的dispatch调用方式,完全兼容最新版react-redux和Redux Toolkit,不需要做任何改动。不管是通过connect高阶组件注入的dispatch,还是用useDispatch钩子获取的dispatch,都能正常触发原有action类型。

4. 可选:逐步迁移到Redux Toolkit的Slice(非必须)

如果后续想逐步使用Redux Toolkit的特性,可以把部分reducer逻辑迁移到createSlice,原有reducer和新slice可以共存,不影响现有代码运行。示例如下:

创建新的userSlice.js:

import { createSlice } from '@reduxjs/toolkit';

const userSlice = createSlice({
  name: 'user',
  initialState: {
    userName: '',
    UserInfoID: ''
  },
  reducers: {
    setUserName: (state, action) => {
      state.userName = action.payload;
    },
    setUserInfoID: (state, action) => {
      state.UserInfoID = action.payload;
    }
  }
});

export const { setUserName, setUserInfoID } = userSlice.actions;
export default userSlice.reducer;

修改store.js合并原有reducer和新slice:

import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducer';
import userReducer from './userSlice';

const initialState = {
    // 原有初始状态
};

const store = configureStore({
  reducer: {
    root: rootReducer, // 原有reducer作为root分支
    user: userReducer // 新slice作为user分支
  },
  preloadedState: {
    root: initialState // 对应root分支的初始状态
  }
});

export default store;

此时原有dispatch调用依然有效,同时可以在新组件中使用slice生成的action creators。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:45:37