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

安装

shell 复制代码
npm install @reduxjs/toolkit react-redux

创建 store

src\store\index.js

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

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'

js 复制代码
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

js 复制代码
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)

相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu10 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss