」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Redux 指南:用於 JavaScript 應用程式的強大狀態管理庫

Redux 指南:用於 JavaScript 應用程式的強大狀態管理庫

發佈於2024-07-30
瀏覽:296

Guide to Redux: A Robust State Management Library for JavaScript Applications

Redux 被广泛认为是专为 JavaScript 应用程序设计的强大状态管理库,通常与流行的框架 React 一起使用。通过提供可靠的状态容器,Redux 建立了坚实的基础,大大简化了应用程序状态的处理和故障排除任务。本指南深入研究了构成 Redux 的基本组件,提供了每个元素的详细解释,并说明了它们如何协同互操作以简化应用程序的整体功能。这种深入的探索旨在阐明 Redux 的内部工作原理,使开发人员能够掌握这个状态管理工具的复杂性,并在他们的项目中有效地利用其功能。

目录

  1. Redux 简介
  2. 在 React 应用程序中设置 Redux
  3. 操作和操作类型
  4. 减速器和切片
  5. 配置商店
  6. 连接 React 组件
  7. 结论与参考文献

1.Redux简介

Redux 遵循单向数据流模型,并基于三个核心原则:

  • 单一事实来源:整个应用程序的状态存储在单个存储中的对象树中。这种集中化使得调试和跟踪应用程序中的更改变得更加容易。
  • 状态是只读的:改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。这确保了状态突变是可预测和可追踪的。
  • 使用纯函数进行更改:要指定状态树如何通过操作进行转换,您可以编写纯减速器。纯函数是可预测和可测试的,这简化了调试和单元测试。

2. 在 React 应用程序中设置 Redux

首先,安装Redux和React-Redux:

npm install redux react-redux @reduxjs/toolkit

此命令安装核心 Redux 库、Redux 的 React 绑定和 Redux Toolkit,这简化了许多常见任务,例如设置存储和创建切片。

3. 动作和动作类型

操作是将数据从应用程序发送到 Redux 存储的信息负载。动作类型是表示动作的常量。

动作类型.js

export const INCREMENT = "INCREMENT";
export const DECREMENT = "DECREMENT";
export const INCREMENT_BY_VALUE = "INCREMENT_BY_VALUE";
export const RESET = "RESET";

export const increment = () => ({ type: INCREMENT });
export const decrement = () => ({ type: DECREMENT });
export const incrementByValue = (value) => ({
  type: INCREMENT_BY_VALUE,
  payload: value,
});
export const reset = () => ({ type: RESET });

定义操作和操作类型显然有助于保持一致性并减少应用程序中的错误。

4. 减速器和切片

Reducer 指定应用程序的状态如何更改以响应发送到存储的操作。切片是应用程序单个功能的 Redux 减速器逻辑和操作的集合,使用 Redux Toolkit 的 createSlice 方法创建。

counterSlice.js

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

const initialState = { number: 0 };

const counterSlice = createSlice({
  name: "counter",
  initialState,
  reducers: {
    increment: (state) => {
      state.number  = 5;
    },
    decrement: (state) => {
      state.number = Math.max(0, state.number - 5);
    },
    incrementByValue: (state, action) => {
      state.number  = action.payload;
    },
    reset: (state) => {
      state.number = 0;
    },
  },
});

export const { increment, decrement, incrementByValue, reset } = counterSlice.actions;

export default counterSlice.reducer;

合并多个切片:

rootReducer.js

import { combineReducers } from "@reduxjs/toolkit";
import counterReducer from "../slices/counterSlice";

const rootReducer = combineReducers({
  counter: counterReducer,
});

export default rootReducer;

5. 配置商店

store是将actions和reducers结合在一起的对象。它保存应用程序状态,允许通过 getState() 访问它,通过dispatch(action) 更新它,并通过 subscribe(listener) 注册监听器。

商店.js

import { configureStore } from "@reduxjs/toolkit";
import rootReducer from "../reducers/rootReducer";

const store = configureStore({
  reducer: rootReducer,
});

export default store;

6. 连接 React 组件

要将React组件连接到Redux存储,请使用react-redux中的Provider组件将存储传递给您的组件,并使用useSelector和useDispatch钩子来访问和操作状态。

应用程序.js

import React from "react";
import { Provider } from "react-redux";
import store from "./redux/store/store";
import Counter from "./components/Counter";
import MusCo from "./MusCo redux logo.png";

function App() {
  return (
    
      
logo

Practice Redux with MusCo

by Mustafa Coskuncelebi
); } export default App;

CounterComponent.js

import { useDispatch, useSelector } from "react-redux";
import {
  decrement,
  increment,
  incrementByValue,
  reset,
} from "../slices/counterSlice";
import { useState, useEffect } from "react";

function Counter() {
  const [value, setValue] = useState("");
  const dispatch = useDispatch();
  const number = useSelector((state) => state.counter.number);

  useEffect(() => {
    const showcase = document.querySelector("#showcase");
    if (number 
      

Counter

{number}

{ let newValue = e.target.value.trim(); if (newValue === "") { newValue = ""; reset(); } if (/^\d*$/.test(newValue)) { setValue(newValue); } }} value={value} placeholder="Enter Value" />

Counter cannot be less than 0

); } export default Counter;

7 结论和参考文献

Redux 是一个强大的库,用于管理应用程序中的状态。通过了解操作、减速器、存储以及如何将所有内容连接到 React 组件,您可以创建可预测和可维护的应用程序。

关键点:

  • 操作:定义应用程序中应该发生的事情。
  • Reducers:指定状态如何响应操作而变化。
  • Store:保存状态并处理操作。
  • Provider:将 store 传递给你的 React 组件。

更多信息请查看Redux官方文档:

  • Redux 文档
  • Redux 工具包文档
  • React-Redux 文档

通过遵循本指南,您应该对 Redux 有深入的了解,并能够在自己的应用程序中实现它。

版本聲明 本文轉載於:https://dev.to/abdullah-dev0/guide-to-redux-a-robust-state-management-library-for-javascript-applications-2emj?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 如何高效合併相同類型的Go結構體? JSON編碼法
    如何高效合併相同類型的Go結構體? JSON編碼法
    在GO編程領域中合併了相同結構的字段與JSON編碼,這是同一類型的兩個結構的任務,經常出現。考慮一個場景,其中您具有默認配置,例如:類型config struct { 路徑字符串 ID字符串 鍵字符串 ADDR字符串 大小UINT64 } var DefaultConfig =...
    程式設計 發佈於2025-04-16
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-04-16
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-16
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-16
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-04-16
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-04-16
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-04-16
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    程式設計 發佈於2025-04-16
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-04-16
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 ; $ date->修改('1個月'); //前進1個月 echo $ date->...
    程式設計 發佈於2025-04-16
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-04-16
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-04-16
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-04-16
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-04-16
  • 解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    解決MySQL錯誤1153:數據包超出'max_allowed_packet'限制
    mysql錯誤1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的數據包,用於面對陰謀mysql錯誤1153,同時導入數據capase doft a Database dust?讓我們深入研究罪魁禍首並探索解決方案以糾正此問題。 理解錯誤此錯誤表明在導入過程中...
    程式設計 發佈於2025-04-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3