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

【React】Redux-toolkit 处理异步操作

安装

npm install @reduxjs/toolkit react-redux

创建 store

src\store\index.js

import { configureStore } from '@reduxjs/toolkit';
import homeReducer from './modules/home';

const store = configureStore({
  reducer: {
    home: homeReducer,
  },
});

export default store;

创建 Reducer

src\store\modules\home.js

import { getHomeGoodPriceData } from '@/services'
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'

// 定义异步操作,用于获取首页商品价格信息
export const fetchHomeDataAction = createAsyncThunk('fetchdata', async (payload) => {
  const res = await getHomeGoodPriceData()
  return res
})

// 创建 Redux slice,管理首页相关的状态
const homeSlice = createSlice({
  name: 'home',
  // 定义初始状态,包含商品价格信息
  initialState: {
    goodPriceInfo: {},
  },
  // reducers 里面包裹的是同步的方法
  reducers: {
    // 定义 reducer,用于更新商品价格信息
    changeGoodPriceInfoAction(state, { payload }) {
      state.goodPriceInfo = payload
    },
  },
  // 处理异步操作结果,更新状态
  // 我们在extraReducers中放入的是异步的方法,我们在action中声明的方法可以在此处使用
  // 在此处我们可以监听创建好的异步action,此处有三个取值是比较常用的
  // 1、fulfilled 成功之后需要做的操作
  // 2、pending 加载时需要做的操作
  // 3、rejected失败后需要做什么处理
  extraReducers: (builder) => {
    builder.addCase(fetchHomeDataAction.fulfilled, (state, { payload }) => {
      state.goodPriceInfo = payload
    })
  },
})

// 导出 reducer,供 Redux store 使用
export const { changeGoodPriceInfoAction } = homeSlice.actions
export default homeSlice.reducer

对以上builder的解释:此重载接受一个回调函数,该函数接收一个builder对象作为其参数。该构建器提供addCase,addMatcher和addDefaultCase函数,可以调用这些函数来定义此 reducer 将处理的操作。(详情建议官网查)

注入 store

src\index.js

Provider 是React Redux中非常重要的组件,它的主要作用是向整个React应用程序树提供Redux.store。

import { Provider } from 'react-redux'

import React, { Suspense } from 'react'
import ReactDOM from 'react-dom/client'
import { HashRouter } from 'react-router-dom'
import { Provider } from 'react-redux'
import { ThemeProvider } from 'styled-components'

import App from '@/App'
import './assets/css/index.less'
import 'normalize.css'
import store from './store'
import theme from './assets/theme'

const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <Suspense fallback='loading'>
    <Provider store={store}>
      <ThemeProvider theme={theme}>
        <HashRouter>
          <App />
        </HashRouter>
      </ThemeProvider>
    </Provider>
  </Suspense>,
)

使用 store

import React, { memo, useEffect } from 'react'
import { shallowEqual, useDispatch, useSelector } from 'react-redux'

import { fetchHomeDataAction } from '@/store/modules/home'
import { HomeWrapper } from './style'
import HomeBanner from './components/home-banner'
import SectionHeader from '@/components/section-header'
import SectionRooms from '@/components/section-rooms'

const Home = memo(() => {
  /** 从redux中获取数据 */
  const { goodPriceInfo } = useSelector(
    (state) => ({
      goodPriceInfo: state.home.goodPriceInfo,
    }),
    shallowEqual,
  )
  /** 派发异步的事件: 发送网络请求 */
  const dispatch = useDispatch()
  useEffect(() => {
    dispatch(fetchHomeDataAction('xxxx'))
  }, [dispatch])

  return (
    <HomeWrapper>
      <HomeBanner />
      <div className='content'>
        <div className='good-price'>
          <SectionHeader title={goodPriceInfo.title} />
          <SectionRooms roomList={goodPriceInfo.list} />
        </div>
      </div>
    </HomeWrapper>
  )
})

export default Home

参考资料

Redux-toolkit 傻瓜式使用教程(TS)(demo)

相关文章:

  • leetcode 41.缺失的第一个正数
  • 58.以太网数据回环实验(1)理论知识
  • C++指南-标准库,数学库,数据结构
  • 参数校验学习笔记
  • 快充协议方案 TYPE-C口取电支持PD5V、 9V、 12V、 15V、 20V
  • Unity3D DOTS中ECS核心架构详解
  • Windows上安装 nodejs,npm 和 yarn详细教程
  • 玩转云服务:Oracle Cloud甲骨文永久免费云主机配置指南(续)
  • python基础(13魔法方法介绍)
  • 江协科技STM32学习- P7 GPIO输入
  • 打造 LLMOps 时代 Prompt 数据驱动引擎
  • Java、python、php版 美发美甲预约服务平台 美容院管理系统(源码、调试、LW、开题、PPT)
  • Python相关系数导图
  • ChatGPT 3.5/4新手使用手册(附:案例)
  • 如何禁止电脑访问网站
  • 看论文文献用哪种阅读器比较好?
  • “决胜面试:高频题目与算法策略一览”
  • 机器学习 之 决策树与随机森林的实现
  • 知乎知+和信息流广告报价,知乎推广多少钱?
  • keil中内存的存储规律
  • 人民日报社论:坚定信心、奋发有为、创新创造——写在“五一”国际劳动节
  • 五大光伏龙头一季度亏损超80亿元,行业冬天难言结束
  • 从孔雀尾巴到蒙娜丽莎,一个鸟类学博士眼中的“美”
  • 中国人保一季度业绩“分化”:财险净利增超92%,寿险增收不增利
  • 宋徽宗《芙蓉锦鸡图》亮相,故宫首展历代动物绘画
  • 外交部:美方应在平等、尊重和互惠的基础上同中方开展对话