当前位置: 首页 > article >正文

前端框架 Redux tool RTK 总结

目录

一、安装依赖

二、创建redux仓库的目录结构

三、createSlice

四、configureStore

五、配置全局仓库标签

六、useSelector

七、useDispatch


Redux Tool官网:Redux - A JS library for predictable and maintainable global state management | Redux

一、安装依赖

# NPM
npm install react-redux @reduxjs/toolkit -S

# Yarn
yarn add react-redux @reduxjs/toolkit

react-redux为redux的核心包,toolkit为redux的工具包。

二、创建redux仓库的目录结构

1、在src目录下创建store目录

在store目录下创建对应的redux仓库。

2、在store目录下创建slices目录

slices目录用于存放不同的slice。

3、最终目录结构如下:

三、createSlice

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

const userSlice = createSlice({
    name: "user", //用来自动生成action中的type
    initialState: {
        name: "Jack",
        age: 18,
        sex: 1,
        address: "US"
    }, // state的初始值
    reducers: {  // 指定state的各种操作,直接在对象中添加方法
        setName(state, action) {
            // 可以通过不同的方法,来指定对state不同的操作
            // 两个参数: state 这是state的一个代理对象,可以直接修改
            state.name = "诛八界"
        },
        setAge(state, action) {
            state.age = action.payload
        }
    }
})

// 切片对象会自动地帮我们生成action
// action中的存储的slice自动生成action创建器(函数),调用函数后会自动创建action对象
// action对象结构:{type:name/函数名,payload:函数的参数}
const {setName, setAge} = userSlice.actions;

const nameAction = setName("哈哈")
const ageAction = setAge(30)
console.log(nameAction)
console.log(ageAction)

打印:

Slice一般这样书写到一个单独的文件里:

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

const userSlice = createSlice({
    name: "user", //用来自动生成action中的type
    initialState: {
        name: "Jack",
        age: 18,
        sex: 1,
        address: "US"
    }, // state的初始值
    reducers: {  // 指定state的各种操作,直接在对象中添加方法
        setName(state, action) {
            // 可以通过不同的方法,来指定对state不同的操作
            // 两个参数: state 这是state的一个代理对象,可以直接修改
            state.name = "诛八界"
        },
        setAge(state, action) {
            state.age = action.payload
        }
    }
})

// 切片对象会自动地帮我们生成action
// action中的存储的slice自动生成action创建器(函数),调用函数后会自动创建action对象
// action对象结构:{type:name/函数名,payload:函数的参数}
export const {setName, setAge} = userSlice.actions;
export default userSlice;

四、configureStore

configureStore用于创建Redux集中管理仓库。

在store的index文件下书写如下:

import {configureStore} from "@reduxjs/toolkit";
import userSlice from "./slices/userSlice";

const store = configureStore({
    reducer: {
        userData: userSlice.reducer
        // config: configSlice.reducer
    }
})

export default store;

五、配置全局仓库标签

引入redux里的Provider标签,使用Provider标签来包裹软件根标签。

import {Provider} from "react-redux";
import store from "./store";

<Provider store={store}>
        <App/>
</Provider>

六、useSelector

useSelector用来加载state中的数据,

import React from "react";
import {useSelector} from "react-redux";

function App() {
    //useSelector用于加载state中的数据
    // 注意: state.reducer的名称而不是slice的name
    const user = useSelector(state => state.userData)

    return (
        <>
            <div className="App">
                {JSON.stringify(user)}
            </div>
        </>
    );
}

页面效果:state中的值被读取到了。

对于需要使用多个state里reducer的情况,可以像以下简写:

const {user,config} = useSelector(state => state) //直接解构获取

七、useDispatch

通过userDispatch钩子函数获取派发器对象。

import {useDispatch, useSelector} from "react-redux";
import {setAge, setName} from "./store/slices/userSlice";

function App() {
    const user = useSelector(state => state.userData)

    // 通过userDispatch()获取派发器对象。
    const dispatch = useDispatch()

    const changeUser = () => {
        dispatch(setName())
        dispatch(setAge(22))
    }

    return (
        <>
            <div className="App">
                {JSON.stringify(user)}
                <button onClick={changeUser}>修改</button>
            </div>
        </>
    );
}

点击修改后页面state发生改变了:dispatch(action函数(payload参数))

甚至你这样写依然可以正常执行:

dispatch({type:"user/setAge",payload:22}) //但不推荐这样写,容易写错参数

总结到此!


http://www.kler.cn/a/408966.html

相关文章:

  • 图片生成视频-右进
  • 《文件操作》
  • stable-diffusion-webui在conda pycharm中运行
  • Spring注入Map学习
  • 【Pytest+Yaml+Allure】实现接口自动化测试框架
  • YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路
  • STM32总体架构简单介绍
  • 【SQL】【数据库】语句翻译例题
  • IDEA 添加外部.jar包。maven本地仓库录入新jar包。IDEA maven 命令巧妙使用。
  • php 限制访问次数
  • 数据结构-队列-顺序队列
  • tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
  • C++结构型设计模式之使用抽象工厂来创建和配置桥接模式的例子
  • XviD4PSP视频无损转换器
  • oracle的静态注册和动态注册
  • 数据可视化复习2-绘制折线图+条形图(叠加条形图,并列条形图,水平条形图)+ 饼状图 + 直方图
  • 【技术支持】vscode不使用插件,两种方式重命名html标签对
  • 基于物联网设计的人工淡水湖养殖系统(华为云IOT)_253
  • 关于mqtt协议与qt联合开发的实现记录
  • 用Tauri框架构建跨平台桌面应用:1、Tauri快速开始
  • 【桂林理工大学主办 | 往届均已EI检索】第五届能源工程、新能源材料与器件国际学术会议(NEMD 2025)
  • ctfshow -web 89-115-wp
  • 数据结构之二:表
  • RoPE——Transformer 的旋转位置编码
  • Centos使用docker搭建Graylog日志平台
  • python中的base64使用小笑话