About react-redux case

Great looks, successful career, smooth sailing, promotion, salary increase, everything goes well, sweet love, prosperous and prosperous

Preface

b0b81a6d839925d54bad5700468b59ce.png

Hello everyone, I am Ge Yao. Today I will take you to learn about react-redux.

technology stack

96680b9fe209aefcac6fe28e5c5139d5.png

react+ant design

rely

f2da99125c91adf9ed7543c21a319145.png

"dependencies": {
    "@ant-design/icons": "^5.2.5",
    "antd": "4.23.4",
    "less": "2.7.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-redux": "^7.2.8",
    "react-router-dom": "^6.3.8",
    "redux": "^4.1.2",
    "redux-thunk": "^2.4.2",
    "reset-css": "^5.0.2",
    "sass": "^1.66.1",
    "vite-plugin-style-import": "^2.0.0"
  },

File Directory

ae4189c1e47aecf72d4aa7795b71f5bd.png

a67016f5e5edbc9d77f6936cde075aed.png

router+app.tsx

router

799219b633988fcbd92efd7e54eb9336.png

import React, { lazy } from "react"
import { Navigate } from "react-router-dom"
const Fang = lazy(() => import("../views/fang"))
const Home = lazy(() => import("../views/home"))
const Geyao = lazy(() => import("../views/Geyao"))
import Login from "@/views/Login"
const withLoadingComponent = (comp: JSX.Element) => {
    return (
        <React.Suspense fallback={<div>Loading...</div>}>
            {comp}
        </React.Suspense>
    )
}
const routes = [{
    path: "/",
    element: <Navigate to="/geyao" />
},
{
    path: "/login",
    element: <Login />
},
{
    path: "*",
    element: <Navigate to="/geyao" />
},
{
    path: "/",
    element: <Home />,
    children: [{
        path: "/geyao",
        element: withLoadingComponent(<Geyao />),
    }, {
        path: "/fang",
        element: withLoadingComponent(<Fang />),
    }]
}]
export default routes

App.tsx

fbeb25afa0626d8a4d4038fc509c157f.png

import "reset-css"
import "./assets/global.scss"
import 'antd/dist/antd.css'
import {useRoutes,Link} from "react-router-dom"
import router from "./router";
function App() {
  const outlet=useRoutes(router)
  return (
    <>
     {outlet}
    </>
  )
}
export default App

The knowledge points involved include lazy loading and routing jump related knowledge

Component creation test

8601c5703e03a7cf10edb7a1b9576449.png

geyao.tsx

870d1755b7274496f1897f0c1eb3207a.png

import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import NumberStatus from "@/store/Numberstatus"
export const Geyao = () => {
  const { number } = useSelector((state:RootState) => ({
    number: state.handleNum.number
  }))
  const dispatch = useDispatch()
  const handleChange = () => {
      dispatch(NumberStatus.aysncActions.asyncAdd1)
  }
  const handleArr = () => {
    dispatch({type: "geyaopush",value:100})
  }
  const { geyao } = useSelector((state:RootState) => ({
    geyao: state.handleArray.geyao
  }))
  return (
    <div>
      fanghome
      <p>{number}</p>
      <button onClick={handleChange}>Button</button>
      <p>{geyao}</p>
      <button onClick={handleArr}>Button</button>
    </div>
  )
  }
export default Geyao

test component

acfe8a3cf71080fcb7ae86135d783d30.png

fang.tsx

09ca16f4e4db2109dba08200cb0402f1.png

import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import store from '@/store'




export const Fang = () => {
  const { number } = useSelector((state:RootState) => ({
    number: state.number
  }))
  const dispatch = useDispatch()
  const handleChange = () => {
    dispatch( {type: "add1"})
  }
  return (
    <div>
      fanghome
      <p>{number}</p>
      <button onClick={handleChange}>Button</button>
    </div>
  )
}




export default Fang

main reducer file

37764fcaede7b3a314e978683f0c9df2.png

index.ts

21c2764642396bc4431149e9cd6b951b.png

import { legacy_createStore,combineReducers,
compose,applyMiddleware} from "redux";
import reduxThunk from "redux-thunk"
import handleNum from "./Numberstatus/reduce.ts";
import handleArray from "./Arraystatus/reduce.ts";
const reducers=combineReducers({
    handleNum,
    handleArray
})
// const store= legacy_createStore(reducer,window.__REDUX_DEVTOOLS_EXTENSION__ & amp; & amp;window.__REDUX_DEVTOOLS_EXTENSION__())
let composeEnhances=window.__REDUX_DEVTOOLS_EXTENSION__COMPOSE
?window.__REDUX_DEVTOOLS_EXTENSION__COMPOSE({})
:compose
const store=legacy_createStore(reducers,composeEnhances
(applyMiddleware(reduxThunk)))
export default store

Ordinary number

bbb462ddfd5c14cef568f31eb8afb430.png

index.ts

a6dfbedc1e6d71f24a0cd83d750ef240.png

const store = {
    state: {
        number: 20
    },
    actions: {
        add1(newState: { number: number }, action: { type: string }) {
            setTimeout(()=>{
                newState.number + +
            },1000)
        },
        add2(newState: { number: number }, action: { type: string, value: number }) {
            newState.number + = action.value
        }




    },
    aysncActions:{
        asyncAdd1(dis:Function){
            setTimeout(()=>{
                dis({type:"add1"})
            },1000)
        }
    },
    // add1:"add1",
    // add2:"add2"
    actionNames: {
     
    }
   
}
let actionNames={
        
}
for(let key in store.actions){
    actionNames[key]=key
}
store.actionNames=actionNames
export default store

reduce.ts

410d9d9b9a84e316a23d786ff2dc59d7.png

import HandNumber from "./index"








let reducer=(state={
    ...HandNumber.state,
  
},action:{type:string,value:number})=>{
    console.log("dispatch execution")




    let newState=JSON.parse(JSON.stringify(state))
    console.log(newState,"newState")
    console.log(action,"action")
    // switch(action.type){
    // case HandNumber.add1:
    // HandNumber.actions[HandNumber.add1](newState,action)
    // break;
    // case HandNumber.add2:
    // HandNumber.actions[HandNumber.add2](newState,action)
    // break
    //default:
    // break;
    // }
    for(let key in HandNumber.actionNames){
        if(action.type===HandNumber.actionNames[key]){
            HandNumber.actions[HandNumber.actionNames[key]](newState,action)
            break
        }
    }




    return newState
}
export default reducer

array number

280f302b49ff9c8cfe85e79808f480ef.png

index.ts

3eef6bfaf54df2d642805a0817444f74.png

const store= {
    state:{
        geyao:[10,20,30]
    },
    actions:{
        geyaopush(newState:{geyao:number[]},action:{type:string,value:number}){
            newState.geyao.push(action.value)
        }
    },
    actionNames:{}
}
let actionNames={
}
for(let key in store.actions){
    actionNames[key]=key
}
store.actionNames=actionNames
export default store

reduce.ts

094c231d3019f91e00547ac7fffae9ff.png

import HandleArr from "./index"
let reducer=(state={
    ...HandleArr.state,
},action:{type:string,value:number})=>{
    console.log("dispatch execution")
    let newState=JSON.parse(JSON.stringify(state))
    console.log(newState,"newState")
    console.log(action,"action")
    for(let key in HandleArr.actionNames){
        if(action.type===HandleArr.actionNames[key]){
            HandleArr.actions[HandleArr.actionNames[key]](newState,action)
            break
        }
    }




    return newState
}
export default reducer

operation result

6c2879fc374368cd3f8a8fbbd7988909.png

db152ce9666d84de1943335a9fe38b36.png

Remark

dcca700020454222178a5957fa47686c.png

redux-thunk solves asynchronous problems and final dependency installation

4b051f17803a481b1cdb4a545b32695c.png

github address

f32554b3adcdfaf5124a7c5ca5598cdd.png

https://github.com/geyaoisnice/React-manage-demo

View historical article below

2d2e4ac681362b223d3331b41a08d333.png

Summary of react-admin + material ui5.0 project

Use of rc-tree

Webpack Principles Practical Notes