当前位置: 首页 > news >正文

React Redux

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 // 定义redux函数
        // 第一个参数为状态对象,第二个是修改状态的方向
        function reducer (state = {count:0}, action){
            // 数据不可变 需要基于原始数据获得当前新数据
            if(action.type === "INCREMENT"){
                return {count:state.count+1}
            }
            else if (action.type === "DECREMENT"){
                return {count:count.type-1}
            }
            
        } 

        // 创建一个store实例使用redux函数
        const store = creatStore(reducer)

        // 通过store的实例对象订阅数据变化
        // 回调函数会在数据变化时候自动执行
        store.subscribe(()=>{
            console.log(`数据修改了`,store.getStore())
            document.getElementById(`count`).innerHTML = store.getStore().count
        })

        // 只能使用store实例调用的dispitch函数修改状态
        const inbtn = document.getElementById(`increment`)
        inbtn.addEventListener(`click`,()=>{
            store.dispatch({
                type:"INCREMENT"
            })

        })

        const debtn = document.getElementById(`decrement`)
        inbtn.addEventListener(`click`,()=>{
            store.dispatch({
                type:"DECREMENT"
            })

        })

        // 使用store实例调用get

在这里插入图片描述
在这里插入图片描述
每次修改需要store实力对象调用dispitch方法输入一个action 对象,其中有状态值属性决定state的修改

插件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

流程

在这里插入图片描述
counterStore子模块中

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

文件路径

在这里插入图片描述

store/modules/couterStore.js文件

import { createSlice } from "@reduxjs/toolkit"

// 定义对象
const counterStore = createSlice({
  name: 'counter',
  // 初始化state
  initialState: {
    count: 5
  },
  // 修改状态的方法 同步方法 支持直接修改
  reducers: {
    inscrement (state) {
      state.count++
    },
    decrement (state) {
      state.count--
    },
    addToNum (state, action) {
      state.count = action.payload
    }
  }
})

// 解构出来actionCreater函数
const { inscrement, decrement, addToNum } = counterStore.actions
// 获取reducer
const reducer = counterStore.reducer

// 以按需导出的方式导出actionCreater
export { inscrement, decrement, addToNum }
// 以默认导出的方式导出reducer
export default reducer

store/index.js文件

import {configureStore}  from  "@reduxjs/toolkit"

// 导入子模块
import counterReducer from "./modules/counterStore"


const store = configureStore({
    reducer:{
        counter:counterReducer
    }
})
export default store

APP.js文件


// 获取store和dispatch方法的hook
import { useSelector,useDispatch } from "react-redux";
// 获取生成action对象的方法
import { inscrement,decrement } from "./store/modules/counterStore";


function App() {
  const {count} = useSelector(state => state.counter)
  // 获得useDispatch函数
  const usedispatch = useDispatch()

  // 需要useDispatch勾子函数修改store中counterStore的值

 

  return (
    <div className="App">
      <button id="decrement" onClick={()=>usedispatch(decrement())}>-</button>
      <span id="count">{count}</span>
      <button id="increment" onClick={()=>usedispatch(inscrement())}>+</button>
    </div>
  );
}

export default App;

在这里插入图片描述

例子

在这里插入图片描述

原本的actionCreater函数没有形参,加入形参action

reducers: {
    inscrement (state) {
      state.count++
    },
    decrement (state) {
      state.count--
    },
    addToNum (state, action) {
      state.count = action.payload
    }

形参action的payload包含在组件中传入的实参

在这里插入图片描述
reducer函数增加一个action作为参数,action.payload会接到调用 该函数时传入的实参,如:组件内传入实参
在这里插入图片描述

例子 :实现异步修改

在这里插入图片描述

第一步写store/modules/channelStore.js

import { createSlice } from "@reduxjs/toolkit"
import axios from "axios"

const channelStore = createSlice({
  name: 'channel',
  initialState: {
    channelList: []
  },
  reducers: {
    setChannels (state, action) {
      state.channelList = action.payload
    }
  }
})


// 异步请求部分
const { setChannels } = channelStore.actions

const fetchChannlList = () => {
  return async (dispatch) => {
    const res = await axios.get('http://geek.itheima.net/v1_0/channels')
    dispatch(setChannels(res.data.data.channels))
  }
}

export { fetchChannlList }

const reducer = channelStore.reducer

export default reducer
import { useEffect } from 'react'

// 获取store和dispatch方法的hook
import { useSelector,useDispatch } from "react-redux";


// 获取生成action对象的方法
import { inscrement, decrement, addToNum } from './store/modules/counterStore'
import { fetchChannlList } from './store/modules/channelStore'

function App() {
  const {count} = useSelector(state => state.counter)
  const {channelList} = useSelector(state => state.channel)
  // 获得useDispatch函数
  const usedispatch = useDispatch()

  // 需要useDispatch勾子函数修改store中counterStore的值

  // 有加载网页数据的时机 使用useEffect()函数 使用effect触发异步请求
  useEffect(()=>{
    usedispatch(fetchChannlList())
  },[usedispatch])
 

  return (
    <div className="App">
      <button id="decrement" onClick={()=>usedispatch(decrement())}>-</button>
      <span id="count">{count}</span>
      <button id="increment" onClick={()=>usedispatch(inscrement())}>+</button>
      <button id ="addnum" onClick={()=>usedispatch(addToNum(20))}>增加到20</button>
      <ul>
        {channelList.map((item)=><li key={item.id}>{item.name}</li>)}
      </ul>
    </div>
  );
}

export default App;

`# 和同步请求不同的是定义了一个函数表达式,其中使用axios异步获取了数据并在函数体内实现了dispatch(action函数)并将请求的数据作为实参给了createAction函数


# APP.js中使用 useEffect组件将dispatch作为执行异步函数的条件时机



```bash
在这里插入代码片

相关文章:

  • Docker简介,快速入门
  • OSPF+MGRE的配置练习
  • 1.29G 雨晨 19044.5737 Windows 10 IoT 企业版 LTSC x64 极速版 VIP 7天有效开放体验
  • GPT - 多头注意力机制(Multi-Head Attention)模块
  • AI应用开发平台 和 通用自动化工作流工具 的详细对比,涵盖定义、核心功能、典型工具、适用场景及优缺点分析
  • CTF web入门之文件包含
  • SAP BDC:企业数据管理的新纪元
  • flink部署使用(flink-connector-jdbc)连接达梦数据库并写入读取数据
  • NO.85十六届蓝桥杯备战|动态规划-经典线性DP|最长上升子序列|合唱队形|最长公共子序列|编辑距离(C++)
  • FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
  • BGP分解实验·23——BGP选路原则之路由器标识
  • 最新版IDEA超详细图文安装教程(适用Mac系统)附安装包及补丁2025最新教程
  • 首批 | 云轴科技ZStack通过电子标准院云上部署DeepSeek验证测试
  • Tkinter高级布局与窗口管理
  • Node.js中util模块详解
  • 【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)
  • vue3使用keep-alive缓存组件与踩坑日记
  • [实战] 二分查找与哈希表查找:原理、对比与C语言实现(附完整C代码)
  • PostgreSQL 实例运行状态全面检查
  • 考研数据结构精讲:数组与特殊矩阵的压缩存储技巧(包含真题及解析)
  • 2025年两岸关系研讨会在上海开幕
  • 王毅同印度国家安全顾问多瓦尔通电话
  • 中方是否认同俄方关于新纳粹主义观点?外交部:联大曾多次通过相关决议
  • 中国天主教组织发贺电对新教皇当选表示祝贺
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 早期投资人蜂巧资本清仓泡泡玛特套现超22亿港元,称基金即将到期