React-RTK

news/2024/10/19 6:15:26/

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/news/1434728.html

相关文章

数据库——实验9 存储过程的使用

1. 存储过程的定义 存储过程是一系列预先编辑好的、能实现特定数据操作功能的SQL 代码集&#xff0c;它与特定的数据库相关联&#xff0c;存储在SQL Server服务器上。用户可以像使用自定义的函数一样重复调用这些存储过程&#xff0c;实现它所定义的操作。 2. 存储过程的类型…

声明式 GUI 工具包:响应式、跨平台、多语言 | 开源日报 No.230

slint-ui/slint Stars: 14.5k License: NOASSERTION slint 是一个声明式的 GUI 工具包&#xff0c;用于为 Rust、C 或 JavaScript 应用程序构建原生用户界面。 可扩展性&#xff1a;支持响应式 UI 设计&#xff0c;跨操作系统和处理器架构的跨平台使用&#xff0c;并支持多种…

具身智能的 Scaling Law

Scaling Law 具身智能的Scaling Law指的是一种理论&#xff0c;它探讨了具备智能的生物或机器系统随着规模的扩展而表现出的一些规律性变化。这个理论涵盖了许多方面&#xff0c;主要关注智能系统的不同尺度之间的相互关系。 具身智能是指生物或机器系统在其环境中感知、行动…

ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

前言 前面的几篇文章讲了很多 JWT 的优点&#xff0c;但作为技术人员都知道&#xff0c;没有一种技术是万能的 “银弹”&#xff0c;所谓有矛就有盾&#xff0c;相比 Session、Cookie 等传统的身份验证方式&#xff0c;JWT 在拥有很多优点的同时&#xff0c;也有着不可忽视的缺…

带头循环双向链表专题

1. 双向链表的结构 带头链表⾥的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这⾥“放哨 的” “哨兵位”存在的意义&#xff1a; 遍历循环链表避免死循环。 2. 双向链表的实现 2.1双向链表结构 typedef int DataTyp…

Vue实现SM4加密

前端先看有无.eslintrc.js文件&#xff0c;添加 rules 和 ‘globals’ rules: {no-console: process.env.NODE_ENV production ? warn : off,no-debugger: process.env.NODE_ENV production ? warn : off,},"globals":{"base64js": true,}安装SM4 np…

ETL工具-nifi干货系列 第十六讲 nifi Process Group实战教程,一文轻松搞定

1、目前nifi系列已经更新了10多篇教程了&#xff0c;跟着教程走的同学应该已经对nifi有了初步的解&#xff0c;但是我相信同学们应该有一个疑问&#xff1a;nifi设计好的数据流列表在哪里&#xff1f;如何同时运行多个数据流&#xff1f;如启停单个数据流&#xff1f; 带着这些…

Android Compose页面跳转Demo

1.引入依赖 //jetpack compose导航 implementation("androidx.navigation:navigation-compose:2.5.3") 2.代码 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…