React笔记(九)RTK

一、RTK的简介

1、官网地址

Redux Toolkit: 概览 | Redux 中文官网

2、Redux toolkit是什么

Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集。它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你使用它。

它包括几个实用程序功能,这些功能可以简化最常见场景下的 Redux 开发,包括配置 store、定义 reducer,不可变的更新逻辑、甚至可以立即创建整个状态的 "切片 slice",而无需手动编写任何 action creator 或者 action type。它还自带了一些最常用的 Redux 插件,例如用于异步逻辑 Redux Thunk,用于编写选择器 selector 的函数 Reselect ,你都可以立刻使用。

二、RTK入门使用

1、安装依赖

javascript 复制代码
yarn add react-redux
yarn add @reduxjs/toolkit

2、目录结构

javascript 复制代码
|-src
    |-store
        |-modules
            |-shopcartList.js
            |-counter.js
        |-index.js

3、创建slice切片

位置:src/store/modules/counter.js

javascript 复制代码
import {createSlice} from '@reduxjs/toolkit'
const counter=createSlice({
    //命名空间,name值会作为action type的前缀
    name:'counter',
    //初始化状态
    initialState:{
        count:0
    },
    //定义reducer更新状态的函数
    reducers:{
        increment(state,action){
            state.count=state.count+action.payload
        },
        subtraction(state,action){
            state.count=state.count-action.payload
        }
    }
})
//导出action函数
export const {increment,subtraction}=counter.actions
//导出reducer
export default counter.reducer

4、创建store

位置:src/store/index.js

javascript 复制代码
import {configureStore} from '@reduxjs/toolkit'
import counter from './modules/counter'
const store=configureStore({
  reducer:{
    counter
  }  
})
export default store

5、在入口集成redux

javascript 复制代码
import {Provider} from 'react-redux'
import store from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
        <App></App>
    </Provider>
);

6、在组件中获取和更新状态

javascript 复制代码
import React from 'react'
import {useSelector,useDispatch} from 'react-redux'
import {increment} from '../store/modules/counter'
export default function Counter() {
  const num=useSelector((state)=>{
    console.log('state',state);
    return state.counter.count
  })
  const dispatch=useDispatch()
  const add=(n)=>{
    dispatch(increment(n))
  }
  return (
    <div>
      <h1>计数器</h1>
      <div>{num}</div>
      <button onClick={()=>{add(2)}}>+</button>
    </div>
  )
}

三、RTK异步操作

  • 编写异步方法

位置:src/store/modules/counter.js

javascript 复制代码
export const subtractionAsync=(payload)=>{
    return async(dispatch,getState)=>{
        console.log('dipatch',dispatch);
        console.log('getState',getState());
        setTimeout(() => {
            dispatch(subtraction(payload))
        }, 4000);
    }
}
  • 在组件中调用
javascript 复制代码
import React from 'react'
import {useSelector,useDispatch} from 'react-redux'
import {subtractionAsync} from '../store/modules/counter'
export default function Counter() {
  const num=useSelector((state)=>{
    return state.counter.count
  })
  const dispatch=useDispatch()
  const jian=(n)=>{
    dispatch(subtractionAsync(n))
  }
  return (
    <div>
      <h1>计数器</h1>
      <div>{num}</div>
      <button onClick={()=>{jian(3)}}>异步-</button>
    </div>
  )
}
相关推荐
来颗仙人掌吃吃1 小时前
解决Echarts设置宽度为100%发现宽度变为100px的问题(Echarts图标宽度自适应问题)
前端·javascript·echarts
余子桃1 小时前
Echarts图表官网打开太慢怎么办?echarts.apache.org
前端·javascript·echarts
pas1361 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript
黑色的糖果2 小时前
vue中tailwindcss插件的引入及使用
前端·javascript·vue.js
戌中横2 小时前
JavaScript——预解析
前端·javascript·学习
AALoveTouch2 小时前
大麦网协议分析
javascript·python
●VON2 小时前
React Native for OpenHarmony:2048 小游戏的开发与跨平台适配实践
javascript·学习·react native·react.js·von
山岚的运维笔记2 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
光影少年3 小时前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
lpruoyu4 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习