React 18 仿携程项目【二十四】【redux-toolkit】createSlice、reducer、与immer

1、安装Redux Toolkit(RTK)

npm install @reduxjs/toolkit  react-redux

2、因为redux-toolkit是全面支持typescript的,所以不需要安装类型文件。

slice.ts

(1)引入createSlice 方法

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

(2)createSlice函数创建并导出本地变量 productDetailSlice

export const ProductDetailSlice = createSlice({
    name: ,
    initialState: ,
    reducers: {
        fetchStart: (state)=>{
            state.loading = true
        }
    }

})

createSlice中的reducer有3个特点:

  • 第一,这里的reducer实际上是把action和reducer捆绑在一起了,所以不需要再单独定义action了

  • 第二,这里的reducer是对象而不是过程,每个对象对应一个action,同时也对应action的处理函数

  • 第三,因为是createSlice是面对对象而不是面对过程,所以我们不必再写switch了,这一点实在是太方便了。

 store.ts

(1)引入slice

import { ProductDetailSlice } from "./productDetail/slice";

(2)引入combineReducers方法

import { combineReducers } from "@reduxjs/toolkit";

(3) rootReducer中写入新的slice中的reducer

//组合多个reducer
const rootReducer = combineReducers({
    language: languageReducer,
    productRecommend: productRecommendReducer,
    productDetail: ProductDetailSlice.reducer
})

rootReducer完成,这时把鼠标放在type RootState上面。会看到现在productDetail的类型也进来了

DetailPage.ts(函数组件)

(1)引入ProductDetailSlice和hooks

import { ProductDetailSlice } from "../../redux/productDetail/slice";
import { useSelector } from "../../redux/hooks";
import { useDispatch } from "react-redux";

(2)初始化数据

const loading = useSelector((state)=> state.productDetail.loading);
const error = useSelector((state)=> state.productDetail.error);
const product = useSelector((state)=> state.productDetail.product);

(3)useDispatch hook取得dispatch函数,用来分发actions

const dispatch  = useDispatch();

(4)初次渲染UI时使用axios异步获取api

useEffect (()=>{ //初次渲染UI时使用axios异步获取api
        const fetchData = async()=>{
            dispatch(ProductDetailSlice.actions.fetchStart())
            try {
                const res = await axios.get(`http://123.56.149.216:8080/api/touristRoutes/${touristRouteId}`)
                dispatch(ProductDetailSlice.actions.fetchSuccess(res.data))
            } catch (error) {
                dispatch(ProductDetailSlice.actions.fetchFail(error instanceof Error ? error.message : "error"))
            }

        };
        fetchData()
    },[])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值