关于react-redux案例

颜值爆表事业有成一帆风顺升职加薪万事如意爱情甜蜜蒸蒸日上步步高升

前言

b0b81a6d839925d54bad5700468b59ce.png

 大家好 我是歌谣 今天带大家来学习react-redux的知识

 技术栈

96680b9fe209aefcac6fe28e5c5139d5.png

 react+ant design

 依赖

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"
  },

 文件目录

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

 涉及的知识点包含懒加载 和 路由跳转相关知识

  组件创建测试

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>
      <p>{geyao}</p>
      <button onClick={handleArr}>按钮</button>
    </div>
  )
  }
export default Geyao

 测试组件

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>
    </div>
  )
}




export default Fang

 主reducer文件

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__&&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

普通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执行")




    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

 数组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执行")
    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

运行结果

6c2879fc374368cd3f8a8fbbd7988909.png

db152ce9666d84de1943335a9fe38b36.png

 备注

dcca700020454222178a5957fa47686c.png

redux-thunk 解决异步问题 最终依赖安装 

4b051f17803a481b1cdb4a545b32695c.png

  github地址

f32554b3adcdfaf5124a7c5ca5598cdd.png

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

下方查看历史文章

2d2e4ac681362b223d3331b41a08d333.png

react-admin+material ui5.0项目的总结

rc-tree的使用

webpack原理实战笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一篇关于React Hooks的经验案例的文章。 React Hooks是React 16.8版本中引入的新特性,它允许我们在函数组件中使用state和其他React功能,避免了使用类组件时的繁琐代码和冗余逻辑。在我的开发工作中,我使用React Hooks来提高代码的可读性和可维护性,今天我想分享一些React Hooks的实际应用案例,希望对大家有所帮助。 1. useState Hook useState Hook是React Hooks中最基础的一个,它允许我们在函数组件中使用state。在一个项目中,我使用useState Hook来处理组件的内部状态,例如表单数据、用户输入等等。 例如,我在一个表单组件中使用useState Hook来处理表单数据: ``` import React, { useState } from 'react'; function Form() { const [formData, setFormData] = useState({ name: '', email: '', message: '' }); const handleInputChange = (event) => { const { name, value } = event.target; setFormData({ ...formData, [name]: value }); }; const handleSubmit = (event) => { event.preventDefault(); // 处理表单提交逻辑 }; return ( <form onSubmit={handleSubmit}> <input type="text" name="name" value={formData.name} onChange={handleInputChange} /> <input type="email" name="email" value={formData.email} onChange={handleInputChange} /> <textarea name="message" value={formData.message} onChange={handleInputChange}></textarea> <button type="submit">提交</button> </form> ); } ``` 在这个例子中,我使用useState Hook来定义表单数据的初始值,并使用handleInputChange函数来更新表单数据。使用useState Hook可以使代码更加简洁和易读。 2. useEffect Hook useEffect Hook是React Hooks中另一个重要的特性,它可以在函数组件中处理副作用,例如数据获取、订阅事件等等。在一个项目中,我使用useEffect Hook来处理组件的生命周期,例如组件挂载、更新和卸载等等。 例如,我在一个列表组件中使用useEffect Hook来获取数据: ``` import React, { useState, useEffect } from 'react'; function List() { const [data, setData] = useState([]); useEffect(() => { fetchData(); }, []); const fetchData = async () => { const response = await fetch('https://api.example.com/data'); const result = await response.json(); setData(result); }; return ( <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> ); } ``` 在这个例子中,我使用useEffect Hook来在组件挂载时获取数据,使用setData函数来更新组件的状态。使用useEffect Hook可以使代码更加清晰和易读。 3. useContext Hook useContext Hook是React Hooks中用于处理全局状态的一个特性,它可以让我们在不使用Redux或其他状态管理库的情况下,在组件之间共享状态。在一个项目中,我使用useContext Hook来实现全局主题。 例如,我在一个主题组件中使用useContext Hook来处理主题状态: ``` import React, { createContext, useContext, useState } from 'react'; const ThemeContext = createContext('light'); function ThemeProvider(props) { const [theme, setTheme] = useState('light'); const toggleTheme = () => { setTheme(theme === 'light' ? 'dark' : 'light'); }; return ( <ThemeContext.Provider value={{ theme, toggleTheme }}> {props.children} </ThemeContext.Provider> ); } function ThemeButton() { const { theme, toggleTheme } = useContext(ThemeContext); return ( <button onClick={toggleTheme} style={{ backgroundColor: theme === 'light' ? '#fff' : '#000', color: theme === 'light' ? '#000' : '#fff' }}> {theme === 'light' ? '开启暗黑模式' : '关闭暗黑模式'} </button> ); } ``` 在这个例子中,我使用useContext Hook来实现全局主题,当用户点击按钮时,可以切换网站的主题。使用useContext Hook可以避免使用Redux等状态管理库的复杂性和冗余代码。 总结 React Hooks是React 16.8版本中引入的新特性,它可以使我们在函数组件中使用state和其他React功能,避免了使用类组件时的繁琐代码和冗余逻辑。在实际项目中,我们可以使用useState Hook、useEffect Hook、useContext Hook等特性来处理组件的内部状态、生命周期和全局状态等等。使用React Hooks可以使代码更加简洁、易读和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值