IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Redux最佳实践「Redux Toolkit」 -> 正文阅读

[JavaScript知识库]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 操作

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

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:43:07  更:2022-07-20 18:45:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 11:41:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码