首页 > 其他分享 >再谈Redux

再谈Redux

时间:2025-01-14 18:33:20浏览次数:1  
标签:状态 redux hooks nebula 再谈 note 使用 Redux

2025年再聊前端状态管理似乎是一件不必要的事,毕竟相关文章已堆积得如山如海。但在这些文章或视频内容中,我并没有找到自己喜欢的方案,准确的说是使用方式。所以这篇文章不做技术分析,主要聊聊个人对状态管理的理解,并分享独特的redux使用的方式。

状态管理

先分享一个有趣的现象。或许是小厂的缘故,经常会在一些项目中看到vuex的身影,憋屈的是它经常会被用来存用户相关的数据,并且是只存当前登陆用户的相关信息,或者再存些权限、菜单数据。经手过的项目中用到状态管理的地方其实并不多,所以很多时候也没有太在意,毕竟用是挺好用的,但写起来还是不如组件状态那么简单。直到项目上用了React,并大范围使用redux后我对状态管理有了全新,确切的说是比较正确的认知。为了描述它,我专门画了张草图:
草图
图上是一个令人痛苦的需求,点击“按钮2”点时候要将外层的“按钮1”设置为禁用状态。要求并不高,痛苦的地方在于他们间隔着好几层的嵌套(现实可能会更残酷些),如果通过事件传递,那么就涉及到所有隔着的组件调整,让它们帮忙传递这个事件。不难,但有点烦。当然,也可以换个思路,比如添加一个全局的事件管理程序,在“按钮1”所在的组件订阅一个事件,事件触发后禁用“按钮1”。当然还有很多类似的方式,如react context等。这个时候我们如果冷静的想想,控制按钮禁用的其实是一个属性,在组件中应该对应一个状态(比如:isDisable=true),如果“按钮2”点击后可以直接修改这个状态,好像会简单很多。这应该就是状态管理最基本的用法。为了方便理解,我还专门画了一张草图:
状态管理示意图
大概就这意思吧,状态管理就是将组件状态统一管理,方便组件间状态共享。状态管理是一个非常科学的设计,不仅能降低代码复杂度,还能降低组件的耦合程度。在复杂的场景下,结合中间件可以轻易的解决很多令人头疼的需求,高效、简洁,当然最重要的还是优雅!

这么好的设计为什么我就不常见呢?除了厂小的缘故,使用复杂应该是最大的障碍。遥记得java ssh架构下写一个接口需要修改很多个配置文件!好用的Redux早期管理一个状态至少也要改三个文件(action、reducer、selector),甚至更多,后来用上redux toolkit后也就少写一个action。

@nebula-note/redux-hooks

出于对编码工作的热爱,最近在写一个自己的代码笔记工具 Nebula Note,React技术栈,状态管理还是熟悉的Redux。Redux中Function Component组件化成本极低,所以我在使用React的时候几乎已完全放弃Class Component。开始并没考虑使用状态管理,但由于组件粒度越来越小,最后还是绷不住用上了。开始是reduxjs/toolkit,后来越写越觉得复杂,最后基于对Redux的熟悉,写了 @nebula-note/redux-hooks,目的是像使用hooks一样使用redux,所以将这个hooks命名useRedux。这里以最小的篇幅介绍下这个库的使用。

配置Store

Redux使用前需要做一些简单的配置,越简单的使用,配置就越简单,且这事只干一次。@nebula-note/redux-hooks是基于redux toolkit封装的,所以使用配置和redux toolkit完全一致。只不过configureStore这个函数需要从@nebula-note/redux-hooks中导入。下面是相关代码:

import { configureStore } from '@nebula-note/redux-hooks';
const store = configureStore();

使用hooks管理状态

下面是一个极度简单的使用案例,完整的。

import { useRedux } from '@nebula-note/redux-hooks';

type ExampleState = {
    isDisabled:boolean
}

export const ExampleA = () => {
     const { state, setState } = useRedux<ExampleState>('reduxKeyName', {isDisabled:false});
     
     const handleDisabled= () => {
        setState(true);
     }
        
     return(
        <div>
            <button disabled={state.isDisabled}>按钮1</button>
          
            <button onclick={handleDisabled}>按钮2</button>
        </div>
     )
}

export const ExampleB = () => {
     const { setState } = useRedux<ExampleState>('reduxKeyName', {isDisabled:false});
     
     const handleDisabled= () => {
        setState(true);
     }
        
     return(
            <button onclick={handleDisabled}>按钮2</button>
     )
}

使用心得

身为作者,完全有必要分享下自己是怎么使用这个工具的。

首先,使用@nebula-note/redux-hooks后不再需要编写reducer和action,useRedux会自动创建set和update两个action及reducer,使用中主要是应用这两个action去设置或更新状态,对应的是hooks暴露的两个函数,setState,updateState。setState是完全使用给定值,updateState则不需要提供完整的状态对象,如状态中存储的是{name, age},如果只想更新age,那么只需要传入age就可以了updateState({age:10})

兼容方面@nebula-note/redux-hooks完全兼容redux toolkit,因为早期的时候项目中使用的是redux toolkit,所以重构也不是一次性完成的,因此并不用担心@nebula-note/redux-hooks的引入会对历史代码造成影响。如果需要使用想saga这样的中间件,还是需要自己定义action,@nebula-note/redux-hooks只是一个针对状态的轻量级解决方案。

最后,如何共享状态。useRedux第一个参数是redux的状态名称,所以只要状态名相同,在任何地方使用useRedux都能获取或修改这个状态数据。useRedux的第二个参数是状态默认值,这个值只会在状态数据初始化之前有效。

最后

引入状态管理后代码逻辑变得更清晰,使用@nebula-note/redux-hooks后代码变得更简洁,目前的设计完全是基于自己的需求在做,后续的更新中应该会加入一些新内容,但范围不会太大应该还是只针对基础状态管理。以上便是我对状态管理的理解,以及Redux使用的分享,喜欢请记得点赞。

标签:状态,redux,hooks,nebula,再谈,note,使用,Redux
From: https://www.cnblogs.com/aser1989/p/18670839

相关文章

  • configureStore:Redux Toolkit 的核心
    configureStore是ReduxToolkit的核心函数,它帮我们自动设置了很多常用的Redux配置,比如:-ReduxDevTools扩展:方便我们在浏览器中调试状态。-Thunk中间件:让我们可以轻松处理异步逻辑。-Immer库:让我们可以直接修改状态,而不用手动写一堆不可变逻辑。用起来非常简......
  • 深入理解 React 中的状态管理:Context API 与 Redux 的对比
    深入理解React中的状态管理:ContextAPI与Redux的对比目录前言React状态管理概述2.1.什么是状态管理?2.2.为什么需要状态管理?React的状态管理方式3.1.组件内部状态3.2.ReactContextAPI3.3.Redux状态管理ReactContextAPI深入解析4.1.Context的基......
  • 详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管
    目录详解js柯里化原理及用法,探究柯里化在ReduxSelector的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用一、什么是柯里化?1、原理解析2、一个直观的例子二、如何实现柯里化?1、底层实现2、工作原理解析3、测试我们的实现三、柯里化的优点1.参数复......
  • 再谈日志系统
    1.面相抽象:不直接使用printf/std::cout直接使用printf或std::cout的弊端在于:不够规模化,修改起来麻烦。例如,除了想往控制台打印,还希望往文件打印;想确保每一处打印都有flush;想通过CMakeOption,用一个简单的开关来控制日志的开启和关闭。使用专门的日志库提供的宏/......
  • Redux:React状态管理工具详解
    Redux是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行作用:通过集中管理的方式管理应用的状态目录一、Redux快速体验二、Redux与React-环境准备1、配套工具2、配置基础环境3、store目录结构设计三、Redux与React-实现counter1、为Reac......
  • 使用ComfyUI下Flux Fill+Redux实现电商换装效果,电商必备工作流
    前段时间黑森林实验室发布的Flux-Tools虽然做了分享,但是一直没有仔细试一下。正好,今天有点时间,也换换脑子,一直做技术分享了,今天休闲一下,测试一下Flux-Fill+Flux-Redux的换装效果。先看完整工作流,如下:【环境采用的是Liblib】有需要comfyui整合包以及工作流,可以扫描下方,免......
  • 数据结构与算法之美:再谈单链表(进阶)
            Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!我的博客:<但凡.我的专栏:《数据结构与算法之美》、《编程之路》、《题海拾贝》欢迎点赞,关注! 目录 1、使用C++实现单链表1.1节点的声明1.2节点的初始化1.3头插和尾插1.3.1头插......
  • useContext和redux的区别
    useContext‌:主要用于解决组件间跨层级的状态共享问题。它允许组件树中的任何组件直接访问全局状态,而无需通过每层手动传递props。这适用于全局状态管理,如用户认证信息、主题设置等‌;useContext通过context的API创建的,在上层组件中使用Provider来包裹状态,并在需要访......
  • 再谈Windows消息循环
    一、什么是Windows消息循环概念介绍在Windows操作系统中,消息循环是应用程序处理消息的核心机制。消息是Windows应用程序与操作系统以及应用程序内部不同组件之间通信的基本单元。这些消息可以是由用户操作产生的,如鼠标点击、键盘按键;也可以是系统内部产生的,如窗口大小改变......
  • 【Linux】:进程信号(再谈信号保存和信号捕捉)
    ✨                         不懂就问,问了不懂,你懂问他    ......