React-RTK

devtools/2024/9/23 9:21:59/

b15c93b7b73c4ec6b712ebea1fcd685f.png

​🌈个人主页:前端青山
🔥系列专栏:React篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来React篇专栏内容:React-RTK

目录

1、介绍

2、安装

3、编写RTK使用示例

4、官方提供项目包示例

创建 Redux Store

定义 Slice

创建 Async Thunk

在 React 组件中使用

1、介绍

Redux是reactjs中进行组件状态共享的js库,工具。基于flux思想实现

ReduxToolKit 是redux官方提供的一种编写redux的范本。toolkit工具包

2、安装

# yarn
​
javascript">yarn add redux @reduxjs/toolkit react-redux

3、编写RTK使用示例

store/index.js

javascript">/*** createSlice  创建分片  分模块* configureStore 配置store仓库* RTK工具库里带的方法**  */
import { createSlice, configureStore } from '@reduxjs/toolkit'
​
const counterSlice = createSlice({// 模块的命名name: 'counter',// state初始值initialState: {value: 0},// 操作方法reducers: {// action 代表处理的对象参数// type:执行的方法名称// payload:传递的参数incremented: (state,action) => {console.log(action);// Redux Toolkit 允许在 reducers 中编写 "mutating" 逻辑。// 它实际上并没有改变 state,因为使用的是 Immer 库,检测到“草稿 state”的变化并产生一个全新的// 基于这些更改的不可变的 state。state.value += action.payloadconsole.log(state.value);},decremented: (state) => {state.value -= 1}}
})
​
export const { incremented, decremented } = counterSlice.actions
​
// 将各模块汇总 进行配置为同一的store
const store = configureStore({reducer: counterSlice.reducer
})
export default store
​
// 可以订阅 store
// store.subscribe(() => console.log(store.getState()))
​
// 将我们所创建的 action 对象传递给 `dispatch`
// store.dispatch(incremented())
// {value: 1}
// store.dispatch(incremented())
// {value: 2}
// store.dispatch(decremented())
// {value: 1}

App.jsx

javascript">import React, { Component } from 'react'
// 导入store
import store, { incremented } from './store'
export default class App extends Component {// 初始化操作constructor() {super()// 监听器  订阅  订阅state变化store.subscribe(() => {this.setState({ value: store.getState().value })})}state = {value: 0}render() {// console.log(store.getState().value)return (<div><button onClick={() => store.dispatch(incremented(100))}>{this.state.value}</button></div>)}
}
​

4、官方提供项目包示例

redux官方提供了一个RTK工具包编写的redux的计算器实例

javascript"># 生成RTK项目包
npx create-react-app rtk-ts --template redux-typescript
​
# yarn
yarn create react-app rtk-ts --template redux-typescript

React-RTK 的作用

  1. 简化 Redux 开发流程:React-RTK 提供了一系列预封装的工具函数和中间件,如 createSlicecreateAsyncThunk 等,大大减少了编写 Redux 相关代码的工作量,避免了繁琐的样板代码。

  2. 提升代码质量与可维护性:RTK 遵循 Redux 最佳实践,确保代码结构清晰、逻辑一致。内置的 Immer 库允许通过修改现有状态的副本来描述状态更新,无需手动实现 immutability。同时,TypeScript 支持增强了类型安全。

  3. 优化性能与开发体验:RTK 自动配置 Redux DevTools Extension,方便开发者监控和调试应用状态变化。它还默认集成了 redux-thunk 以支持异步操作,并通过代码生成优化了 store 的创建过程。

创建 Redux Store

首先,使用 configureStore 函数创建 Redux store,通常在应用的主入口文件(如 index.js 或 App.js)中进行:

javascript">import { configureStore } from '@reduxjs/toolkit';
import rootReducer from './reducers'; // 导入已合并的 Reducerconst store = configureStore({reducer: rootReducer,
});// 如果使用 React-Router,可能需要将 store 与 Provider 组件一起包裹应用
import { Provider } from 'react-redux';
import App from './App';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);

定义 Slice

使用 createSlice 函数来定义一个 Redux slice,包含相关的 action types、action creators 和 reducer:

javascript">import { createSlice } from '@reduxjs/toolkit';const initialState = {items: [],loading: false,error: null,
};const mySlice = createSlice({name: 'mySlice',initialState,reducers: {// 纯同步 reduceraddItem(state, action) {state.items.push(action.payload);},removeItem(state, action) {state.items = state.items.filter(item => item.id !== action.payload);},},extraReducers: builder => {// 异步操作处理(通常使用 createAsyncThunk 创建)builder.addCase(fetchItems.pending, state => {state.loading = true;state.error = null;});builder.addCase(fetchItems.fulfilled, (state, action) => {state.items = action.payload;state.loading = false;});builder.addCase(fetchItems.rejected, (state, action) => {state.loading = false;state.error = action.error.message;});},
});export const { addItem, removeItem } = mySlice.actions;export default mySlice.reducer;

创建 Async Thunk

对于涉及异步操作(如 API 调用)的状态变更,使用 createAsyncThunk 创建一个 thunk action:

javascript">import { createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';export const fetchItems = createAsyncThunk('mySlice/fetchItems', async () => {const response = await axios.get('/api/items');return response.data;
});

在 React 组件中使用

在 React 组件中,通过 useSelector 和 useDispatch 钩子访问和操作 store:

javascript">import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { addItem, removeItem, fetchItems } from './mySlice';function ItemList() {const dispatch = useDispatch();const { items, loading, error } = useSelector(state => state.mySlice);useEffect(() => {dispatch(fetchItems());}, [dispatch]);const handleAddItem = () => {const newItem = /* 新建一个 item 对象 */;dispatch(addItem(newItem));};const handleRemoveItem = (itemId) => {dispatch(removeItem(itemId));};if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error}</div>;return (<div>{/* 渲染 items 列表,添加/删除按钮 */}</div>);
}export default ItemList;

 

 


http://www.ppmy.cn/devtools/4056.html

相关文章

使用【node】创建本地接口

在前端开发的过程中&#xff0c;接口相关的信息一般是由后端处理好返回给前端&#xff0c;但是有时候后端不在的时候想自己写个接口进行测试是非常麻烦的。 node是前端一个不错的写接口工具 一 初始化文件 1 在新建一个空的文件夹node 进入空文件夹在&#xff0c;文件夹的地…

每日两题 / 15. 三数之和 73. 矩阵置零(LeetCode热题100)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 先确定一个数t&#xff0c;对于剩下的两个数&#xff0c;要求两数之和为t的负数 三数之和就退化成了两数之和&#xff0c;两数之和可以用双指针 先排序&#xff0c;左右两个指针&#xff0c;指向的数之和大于目标值&…

mysql多表查询

目录 多表关系 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 什么是多表查询 例子&#xff1a; 多表查询的分类&#xff1a; 连接查询&#xff1a; 子查询&#xff1a; 内连接 内连接查询语法&#xff1a; 隐式内连接&#xff1a; 显示内连…

linux对网络的监控操作学习--端口、流量、IP

文章目录 linux对网络的监控操作学习--端口、流量、IP理解Netfilter队列设置iptables规则以使用队列使用用户空间程序处理队列中的数据包linux用户空间使用Python实现使用rust实现功能 综合应用注意事项其他实现方式nftablesfirewalldufw (Uncomplicated Firewall)tc (Traffic …

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…

API高频量化交易平台:数字货币市场的革新与挑战

在数字货币市场迅速发展的背景下&#xff0c;越来越多的普通投资者开始将注意力转向高频量化交易&#xff0c;将其视为一种稳定的投资策略。在这一趋势中&#xff0c;API高频量化交易平台&#xff0c;成为了众多投资者的首选。 作为数字货币投资的“闪电猎手”&#xff0c;高频…

美国家安全局等发布安全部署人工智能系统指南

该指南旨在为部署和运行由其他实体设计和开发的人工智能系统的组织提供最佳实践。 2024年4月15日&#xff0c;美国国家安全局发布了名为《安全部署人工智能系统&#xff1a;部署安全、弹性人工智能系统的最佳实践》&#xff0c;该指南旨在为部署和运行由其他实体设计和开发的人…

ArtCoder——通过风格转换生成多元化艺术风格二维码

简介 ArtCoder能够从原始图像&#xff08;内容&#xff09;、目标图像&#xff08;风格&#xff09;以及想要嵌入的信息中&#xff0c;生成具有艺术风格的二维码。这一过程类似于通常的图像风格转换&#xff0c;但特别针对二维码的特点进行了优化和调整。 通过这种方法&#…