react函数式组件中使用react-redux

一、背景

最近我最近在用react重构公司的项目,但是在使用redux时,我遇到了很多坑,经过多次查找资料,特此记录:

二、踩坑过程

因为我已经搭建了项目架构,所以这里只从react-redux的使用开始

1、安装插件

npm i redux react-redux -S

2、定义store仓库,action,reducer

    redux目录结构如下

我们先来看看index.js,定义全局 数据仓库

/redux/index.js

import {
          
   legacy_createStore as createStore} from redux
import {
          
   reducer} from ./reducer
const store = createStore(reducer)
export default store

如上,因为 redux已经不推荐使用 createStore()创建数据仓库了,如果我们继续使用,需要引入具有标识的 legacy_createStore 我这里仓库的数据比较简单,如果结构很复杂,我们应当根据模块拆分不同的文件,再用combineReducers合并为一个reducer

/redux/reducer.js

// store初始化仓库数据
const initState = {
          
   
    isLogin:false,
    menuList:[]
}
// reducer纯函数,用于操作中央仓库的数据
export const reducer = (state=initState,action)=>{
          
   
    const {
          
    type,data} = action
    switch(type){
          
   
        case SET_LOGIN_STATUS:
        	// 在不改变原有的state基础上,返回一个新的state
            return {
          
   
                ...state,
                isLogin:data
            }
        case SET_MENU_LIST:
            return {
          
   
                ...state,
                menuList:data
            }
        default:
            return initState    
    }
}

3、跟组件中引用

/index.js

import React from react;
import ReactDOM from react-dom/client;
import {
          
   BrowserRouter} from react-router-dom
import ./index.css;
import antd/dist/antd.min.css
import App from ./App;
import reportWebVitals from ./reportWebVitals;
// redux实现数据共享
import {
          
   Provider} from react-redux
import store from ./redux/index

console.log(app......store.....,store,store.getState())
ReactDOM.createRoot(document.getElementById(root)).render(
    <React.StrictMode>
        <BrowserRouter>
        	{
          
   /* 引入Provider,并将store注入 */}
            <Provider store={
          
   store}>
                <App store={
          
   store} />
            </Provider>
        </BrowserRouter>
    </React.StrictMode>
)

4、在需要获取store仓库数据的组件中获取

我这里是在Login登录页面中,需要获取仓库中的 isLogin字段

/components/login/index.jsx

import React, {
          
    useEffect } from react
import {
          
   useSelector,useDispatch} from react-redux	// 通过useSelector(callback)获取store数据
// 登录页面组件
const Login = ()=>{
          
   
	// 获取中央仓库中的isLogin数据
	const isLogin = useSelector(state => state.isLogin)
	
	// 修改中央仓库数据
	const dispatch = useDispatch()
	dispatch({
          
   type:SET_LOGIN_STATUS,data:true})
}

参考:

三、api总结

    createStore(): 创建仓库 useSelector(): 用户获取数据仓库某一项数据 useDispatch():更新数据
经验分享 程序员 微信小程序 职场和发展