• React的Redux的状态管理


    步骤

    1.创建新项目

    npx create-react-app react-redux

    2.安装配套工具

    npm i @reduxjs/toolkit react-redux

    3.启动项目

    npm run start

    4.在src目录下创建store文件夹

    5.在store文件夹下创建modules文件夹

    6.在store文件夹里创建index.js文件

    7.在counterStore.js文件里编写子store(使用React Toolkit 创建 counterStore)

    1. // createSlice 是为了创建store用的
    2. import { createSlice} from "@reduxjs/toolkit"
    3. const counterStore= createSlice({
    4. // 模块
    5. name:'counter',
    6. // 初始化state(状态)
    7. initialState:{
    8. count:0
    9. },
    10. //(修改状态的方法) 编写书写数据的方法,同步方法,支持直接修改
    11. reducers:{
    12. inscrement(state){
    13. state.count++;
    14. },
    15. decrement(state){
    16. state.count--;
    17. },
    18. inscrementTen(state,actions){
    19. console.log("actions",actions);
    20. state.count= state.count+actions.payload;
    21. },
    22. // action传递对象
    23. actionObg(state,actions){
    24. console.log("测试传递对象",actions);
    25. }
    26. }
    27. })
    28. // 解构出来actionCreater函数
    29. const {inscrement,decrement,inscrementTen,actionObg} =counterStore.actions;
    30. // 获取reducer
    31. const counterReducer = counterStore.reducer
    32. // 以按需导出的方式导出actionCreater
    33. export {inscrement,decrement,inscrementTen,actionObg}
    34. // 以默认导出的方式发哦出reducer
    35. export default counterReducer;

    8.在store文件夹的index.js里组合moudels里的子模块,并导出store

    1. import { configureStore } from "@reduxjs/toolkit";
    2. // 导入子模块reducer (counterReducer,channelReducer 这俩名称是counterStore.js和chaenlStore.js最后一行导出来的名称)
    3. import counterReducer from './modules/counterStore'
    4. import channelReducer from "./modules/chaenlStore";
    5. // 创建子组合模块
    6. // 根store
    7. const store =configureStore({
    8. reducer:{
    9. counter:counterReducer,
    10. channel:channelReducer
    11. }
    12. })
    13. export default store

    9.在src文件夹下的index.js文件里   为React注入store

    1. // 使React
    2. import store from './store';
    3. // 导出;来的Provider 用于下面标签里
    4. import {Provider} from 'react-redux'
    5. const root = ReactDOM.createRoot(document.getElementById('root'));
    6. root.render(
    7. <React.StrictMode>
    8. {/* 注入store Provider标签很重要 */}
    9. <Provider store={store}>
    10. <App />
    11. </Provider>
    12. </React.StrictMode>
    13. );
    10.React组件使用store中的数据

    在React组件中使用store中的数据,需要用到一个钩子函数-useSelector,它的作用是把store中的数据映射到组件中

    useDispatchReact-Redux库提供的一个钩子函数,它用于访问Redux store的dispatch函数。useDispatch可以让你从函数组件中派发actions。

    app.js文件

    1. // useSelector 获取store里面 变量
    2. // useDispatch作用可以修改store里面变量
    3. import {useSelector,useDispatch} from 'react-redux'
    4. // 导入actionCreater
    5. import { decrement,inscrement,inscrementTen,actionObg } from './store/modules/counterStore';
    1. function App() {
    2. // 使用回调函数state拿到任意一个模块 counter和channel 名称来自strore文件夹下的index.js文件里绑定的模块名
    3. const {count} =useSelector(state => state.counter)
    4. const {channelList}= useSelector(state=>state.channel)
    5. const dispatch=useDispatch();
    6. // 使用useEffect触发异步接口调用 [dispatch] 的意思是调用dispatch一次执行一次
    7. useEffect(()=>{
    8. dispatch(fetchChannlList());
    9. },[dispatch])
    10. return (
    11. <div className="App">
    12. <button onClick={()=>dispatch(decrement())}>-</button>
    13. alksdfn---{count}
    14. <button onClick={()=>dispatch(inscrement())}>+</button>
    15. <button onClick={()=>dispatch(inscrementTen(10))}>+10</button>
    16. <button onClick={()=>dispatch(actionObg({'age':10,'qie':20}))}>提交action传递对象</button>
    17. <ul>
    18. {channelList.map((item,index)=><li key={item.id}>{item.name}</li>)}
    19. <li></li>
    20. </ul>
    21. </div>
    22. );
    23. }
    24. export default App;

    异步获取到请求结果

    4.在src目录下创建store文件夹

    5.在store文件夹下创建modules文件夹

    6.在store文件夹里创建index.js文件

    7.在takeaway.js文件里编写子store(使用React Toolkit 创建 counterStore)

    1. import { createSlice } from "@reduxjs/toolkit";
    2. import axios from "axios";
    3. const takeawayStore=createSlice({
    4. name:"food",
    5. initialState:{
    6. 'foodList':[],
    7. 'activiteIndex':0,
    8. 'cart':[],
    9. 'allmoney':[],
    10. },
    11. reducers:{
    12. steFoodList(state,action){
    13. state.foodList=action.payload
    14. },
    15. }
    16. })
    17. const {steFoodList}= takeawayStore.actions;
    18. const getFoodList=()=>{
    19. return async (dispatch)=>{
    20. const res=await axios.get('http://localhost:3004/takeaway');
    21. console.log("接口获取结果",res);
    22. const foodList=res.data;
    23. for(var a=0;a<foodList.length;a++){
    24. for(var b=0;b<foodList[a].foods.length;b++){
    25. foodList[a].foods[b].count=0;
    26. }
    27. }
    28. console.log('foodList',foodList);
    29. dispatch(steFoodList(foodList));
    30. }
    31. }
    32. // 异步方法导出
    33. export {getFoodList}
    34. const foodListReducer=takeawayStore.reducer;
    35. export default foodListReducer

    store文件夹下的js文件

    1. import { configureStore } from "@reduxjs/toolkit";
    2. import foodListReducer from './modules/takeaway'
    3. const store=configureStore({
    4. reducer:{
    5. food:foodListReducer
    6. }
    7. });
    8. export default store

    app.js

    1. import NavBar from './components/NavBar'
    2. import Menu from './components/Menu'
    3. import Cart from './components/Cart'
    4. import FoodsCategory from './components/FoodsCategory'
    5. import { useDispatch,useSelector } from 'react-redux'
    6. import {getFoodList} from './store/modules/takeaway'
    7. import { useEffect, useState } from 'react'
    8. import './App.scss'
    9. const App = () => {
    10. // 获取食物列表
    11. const {foodList}= useSelector(state=>state.food)
    12. const despach=useDispatch();
    13. useEffect(()=>{
    14. despach(getFoodList());
    15. },[])
    16. return (
    17. <div className="home">
    18. div>
    19. )
    20. }
    21. export default App

    修改Store里面变量的唯一方法就是提交一个action

    redux异步从后台获取数据

    安装Axios异步请求库、

    npm i axios

    谷歌插件调试React项目

    插件下载地址(https://chromewebstore.google.com/detail/lmhkpmbekcpmknklioeibfkpmmfibljd

  • 相关阅读:
    温故知新(十二)——SPI
    【嵌入式开源库】cJSON的使用,高效精简的json解析库
    程序员应该有什么职业素养
    MySQL导出数据为csv的方法(亲测)
    python按照【修改时间顺序】读取文件夹下的TXT文本内容
    自动激光分板系统(自动PCB激光分板系统)市场现状分析
    day62:ARMday9,I2c总线通信
    初级查找算法
    mssql调用外部接口
    最小编译器the-super-tiny-compiler
  • 原文地址:https://blog.csdn.net/qq_36935391/article/details/139862805