Redux最佳实践「Redux Toolkit」

 首先你要有基本的Redux ,React-Reudx,中间件 的基础

如果没有基础,可以看下面两篇文章 

redux详解     在项目中使用redux,react-redux

一,Redux Tooikit解决的问题 

1.redux和react-redux存在问题

  • 配置Redux Store并不简单。
  • 我们需要几个软件包来使Redux与React一起工作。
  • Redux需要太多样板代码。

2. 解决问题

Redux Toolkit(之前称为Redux Starter Kit)提供了一些选项来配置全局store,并通过尽可能地抽象Redux API来更精简地创建动作和reducers。

二,Redux Tooikit包含了?

如果你写过Redux的传统写法,就知道异步请求中间件,Redux DevTools都需要手动配置,但是Redux Tooikit很好地解决了这一点

Redux Toolkit附带了一些有用的软件包,例如ImmerRedux-ThunkReselect。它使React开发人员的工作变得更加轻松,允许他们直接更改状态(不处理不可变性),并应用Thunk之类的中间件(处理异步操作)。它还使用了Redux的一个简单的“选择器”库Reselect来简化reducer函数。

三,具体写法

1.configureStore

configureStore (): 包装 createStore 以提供简化的配置选项和良好的默认设置。它可以自动组合你的slice reducers,添加你提供的任何 Redux 中间件,默认包括 Redux-thunk,并启用 Redux DevTools 扩展。

在store.js中

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from './slice'

 const store=configureStore({
  reducer:{
    /**
     * 们需要从上面的创建的空的 store 导入 reducer 函数并将其添加到我们的存储中,
     * 通过在 reducer 参数中定义一个字段,告诉 store 使用这个 slice reducer 函数来处理该状态的所有更新。
     */
       counter:counterReducer
  }
   // middleware: [],
  // 启用Redux DevTools,默认true
  // devTools: true,
})
export default store

2.creactSlice

它是一个生成存储片的助手函数。它接受片的名称、初始状态和reducer函数来返回reducer、action类型和action creators。

createSlice接收的:一个字符串名来标识该片也就是name
   * 一个初始状态值initialState
   * 以及多个reducer函数。
   * 并且为每个 reducer 函数生成动作创建器

 Redux Toolkit 允许我们在还原器中编写“可变的(mutable)”逻辑。
       * 它实际上并没有改变状态,因为它使用 Immer 库,
       * 它将检测对"draft state" 的更改,并根据这些更改生成
       * 一个全新的不可变状态

在slice.js中

这里写了一个加法,减法,和传参加法的函数

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

const initialState={
  value:0,
}
export const counterSlice=createSlice({
  /**
   * createSlice接收的:一个字符串名来标识该片也就是name,
   * 一个初始状态值initialState,
   * 以及多个reducer函数。
   * 并且为每个 reducer 函数生成动作创建器。
   *  */ 
   name:'counter',
   initialState, //相当于state
   reducers:{ //注意这里加了S,后面导出没加S
    increment:(state)=>{
     /** 
       * Redux Toolkit 允许我们在还原器中编写“可变的(mutable)”逻辑。
       * 它实际上并没有改变状态,因为它使用 Immer 库,
       * 它将检测对"draft state" 的更改,并根据这些更改生成
       * 一个全新的不可变状态
       */
       state.value+=1
    },
    decrement:(state)=>{
        state.value-=1
    },
     incrementByAmount: (state, action) => {
      state.value += action.payload
    },
   },
  
})
// 为每个 reducer 函数生成动作创建器(Action creators)
// 相当action
export const {increment,decrement,incrementByAmount}=counterSlice.actions
export default counterSlice.reducer

3.UI渲染

这里的用法与之前的用法一样

  • useSelector,useDispatch进行渲染数据和调用函数
  • 把slice.js中的函数进行导入 

在App.js中

import React from 'react'
import { useSelector,useDispatch } from 'react-redux/es/exports'
import {increment,decrement,incrementByAmount} from './store/slice.js'
export default function App() {
  const count=useSelector((state)=>state.counter.value)
  const dispatch=useDispatch()
  return (
   <div>
        <p>当前的count值:{count}</p>
        
        <button onClick={()=>dispatch(increment())}>增加</button>
        <button onClick={()=>dispatch(decrement())}>减少</button>
        <button onClick={()=>dispatch(incrementByAmount(10))}>传参加法</button>
        <button onClick={asyncget}>异步请求</button>
      </div>
  )
}

 

四,异步写法createAsyncThunk

在RTK中默认启用了redux-thunk作为异步逻辑中间件,Thunk在Redux中指返回值为函数的action 生成器。

异步请求不是写在Reducers{}对象中,而是写在extraReducers中

  • builder.addCase:是一个内置函数

  • extraReducers内部,您可以处理准备(pedding)已解决(fulfilled)和已拒绝(rejected)状态。

  • 传入的两个参数分别是state:上面初始化状态的对象,和action

  • 注意:在axios请求时,第一个是命名空间和Slice里一样,千万不要重复啊,要不然都不知道使用的哪个!
    第二个参数是一个异步函数,我这里用的是axios

直接上代码,这里以上面的加减法为基础,增加异步请求数据

import { createSlice } from "@reduxjs/toolkit";
import { createAsyncThunk } from "@reduxjs/toolkit";
import axios from 'axios'
export  const getlist=createAsyncThunk(
  "getlist",async ()=>
    await axios.get('http://localhost:8888/data')
)
const initialState={
  value:0,
}
export const counterSlice=createSlice({
  /**
   * createSlice接收的:一个字符串名来标识该片也就是name,
   * 一个初始状态值initialState,
   * 以及多个reducer函数。
   * 并且为每个 reducer 函数生成动作创建器。
   *  */ 
   name:'counter',
   initialState, //相当于state
   reducers:{ //注意这里加了S,后面导出没加S
    increment:(state)=>{
     /** 
       * Redux Toolkit 允许我们在还原器中编写“可变的(mutable)”逻辑。
       * 它实际上并没有改变状态,因为它使用 Immer 库,
       * 它将检测对"draft state" 的更改,并根据这些更改生成
       * 一个全新的不可变状态
       */
       state.value+=1
    },
    decrement:(state)=>{
        state.value-=1
    },
     incrementByAmount: (state, action) => {
      state.value += action.payload
    },
   },
  //  异步请求extraReducers这里用来处理那些异步操作,走完UserById ,还会走这里
   extraReducers:(builder)=>{
    // 这里的state就是上面的state对象
    builder.addCase(getlist.fulfilled,(state,action)=>{
   console.log('完成中');
      const data = action.payload && action.payload.data; // data为接口返回的data字段
      console.log(data);
    })
  
   }
})
// 为每个 reducer 函数生成动作创建器(Action creators)
// 相当action
export const {increment,decrement,incrementByAmount}=counterSlice.actions
export default counterSlice.reducer

 请求到数据了,接下来就是渲染,这里给一个按钮,点击在控制台输出

 五,总结

当开始使用Redux时,Redux Toolkit是一个很好的选择。它简化了代码,并通过减少模板代码来帮助管理Redux状态。

这里简要的讲一下这个简单例子的整体的步骤

  • 使用 configureStore 创建 Redux 存储
    • configureStore 接受作为命名参数的 reducer 函数
    • configureStore 自动设置好了默认设置
  • 向 React 应用程序组件提供 Redux 存储
    • 在 组件外包裹 React-Redux < Provider > 组件
    • < Provider store = { store } >
  • 使用 createSlice 创建一个 Redux“ slice”reducer
    • 使用字符串名称、初始 state 和 reducer 函数调用 createSlice
    • Reducer 函数可能使用 Immer“mutate”状态
    • 导出生成的slice reducer 和 action creators
  • 在 React 组件中使用 redux useSelector/useDispatch 挂钩
    • 使用 useSelector 钩子从 store 中读取数据
    • 使用 useDispatch 钩子获取 dispatch 函数,并根据需要进行 dispatch actions 操作

非常感谢你看到这,如果觉得不错的话点个赞 ⭐ 吧

 

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.指尖舞者

如果帮助到了你,请给点赞助支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值