React低代码项目:Redux 状态管理

基于React低代码平台开发:构建高效、灵活的应用新范式 本书由三部分组成,第 一部分介绍基础理论知识,第二部分介绍如何构建低代码系统,先进行需求分析,涉及列表页、详情页和表单页的布局需求和逻辑需求,可视化编辑器、应用管理、组件市场和用户管理的需求等内容,然后介绍设计思路,包含架构设计、Schema 设计、组件库市场和 MongoDB Document 设计等,z后介绍详细的编码过程,包括可视化编辑器的实现、渲染 SDK 的实现、版本控制,以及如何将其集成到其他系统。秦小倩(网名何遇) 阅读详情

吐司问卷:Redux 状态管理

Date: February 18, 2025 5:37 PM (GMT+8)


Redux 管理用户信息

命名规范:

以 Info 结尾表示获取Reudx信息,比如 useGetUserInfo.ts

以 data 结尾表示获取服务端信息,比如 useLoadQuestionData



采用 Redux 管理用户信息

Redux store 设计:

src/store/index.ts

import { configureStore } from '@reduxjs/toolkit'
import userReducer, { UserStateType } from './userReducer'

export type StateType = {
  user: UserStateType
}

export default configureStore({
  reducer: {
    user: userReducer,
  },
})

userReducer 开发:

src/store/userReducer.ts

import { createSlice, PayloadAction } from '@reduxjs/toolkit'

export type UserStateType = {
  username: string
  nickname: string
}

const INIT_STATE: UserStateType = {
  username: '',
  nickname: '',
}

export const userSlice = createSlice({
  name: 'user',
  initialState: INIT_STATE,
  reducers: {
    loginReducer: (
      state: UserStateType,
      action: PayloadAction<UserStateType>
    ) => {
      return action.payload
    },
    logoutReducer: () => {
      return INIT_STATE
    },
  },
})

export const { loginReducer, logoutReducer } = userSlice.actions
export default userSlice.reducer

src/index.ts

 import React from 'react'
 import ReactDOM from 'react-dom/client'
+import { Provider } from 'react-redux'
+import store from './store'
 import App from './App'
 
 const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement)
 root.render(
   <React.StrictMode>
-    <App />
+    <Provider store={store}>
+      <App />
+    </Provider>
   </React.StrictMode>
 )


点击Logo跳转优化

**需求:**原本点击 Logo 会跳转到 home 页。现在需要根据是否有用户信息,进行区分判断。

如果有用户信息,点击 Logo 则跳转到管理页面。没有则到 home 页面。

src/component/Logo.tsx

-import React, { FC } from 'react'
+import React, { FC, useState, useEffect } from 'react'
 import { Space, Typography } from 'antd'
 import { BlockOutlined } from '@ant-design/icons'
 import { Link } from 'react-router-dom'
+import useGetUserInfo from '../hooks/useGetUserInfo'
+import { HOME_PATHNAME, MANAGE_INDEX_PATHNAME } from '../router/index'
 import styles from './Logo.module.scss'
 
 const { Title } = Typography
 
 const Logo: FC = () => {
+  const { username } = useGetUserInfo()
+  const [pathname, setPathname] = useState<string>(HOME_PATHNAME)
+  useEffect(() => {
+    if (username) {
+      setPathname(MANAGE_INDEX_PATHNAME)
+    }
+  }, [username])
   return (
     <div className={styles.container}>
-      <Link to="/">
+      <Link to={pathname}>
         <Space>
           <Title>
             <BlockOutlined />


自定义 Hook 统一加载用户信息

思路:

  • 开发获取 Redux 中用户信息
  • 开发获取 服务端 用户信息,并与 Redux 联动
  • 设计页面加载状态(根据用户信息获取与否进行判断)
    • 有用户信息,则停止加载。没有则进行加载。

useGetUserInfo.tsx

import { useSelector } from 'react-redux'
import { StateType } from '../store'
import { UserStateType } from '../store/userReducer'

function useGetUserInfo() {
  const { username, nickname } = useSelector<StateType>(
    (state: StateType) => state.user
  ) as UserStateType
  return { username, nickname }
}

export default useGetUserInfo

useLoadUserData.ts

import { useEffect, useState } from 'react'
import { useRequest } from 'ahooks'
import { getUserInfoService } from '../services/user'
import { useDispatch } from 'react-redux'
import useGetUserInfo from './useGetUserInfo'
import { loginReducer } from '../store/userReducer'

function useLoadUserData() {
  const [waitingUserData, setWaitingUserData] = useState<boolean>(false)
  const dispatch = useDispatch()

  // 加载用户信息
  const { run } = useRequest(getUserInfoService, {
    manual: true,
    onSuccess: res => {
      const { username, nickname } = res
      // 存储到 Redux 中
      dispatch(loginReducer({ username, nickname }))
    },
    onFinally() {
      setWaitingUserData(false)
    },
  })

  // Redux 中数据
  const { username } = useGetUserInfo()
  useEffect(() => {
    if (username) {
      setWaitingUserData(false)
    }
    run()
  }, [username])

  return { waitingUserData }
}

export default useLoadUserData


用户退出功能优化

**思路:**用户退出不仅需要清空 Redux 信息,还要清空本地 token 信息

src/component/userInfo.tsx

 import { LOGIN_PATHNAME } from '../router'
 import { Button, message } from 'antd'
 import { UserOutlined } from '@ant-design/icons'
-import { getUserInfoService } from '../services/user'
 import { removeToken } from '../utils/user-token'
-import { useRequest } from 'ahooks'
+import useGetUserInfo from '../hooks/useGetUserInfo'
+import { useDispatch } from 'react-redux'
+import { logoutReducer } from '../store/userReducer'
 
 const UserInfo: FC = () => {
   const nav = useNavigate()
-  const { data } = useRequest(getUserInfoService)
-  const { username, nickname } = data || {}
+  const { username, nickname } = useGetUserInfo()
+  const dispatch = useDispatch()
   const logout = () => {
-    removeToken()
+    dispatch(logoutReducer()) // 清空 redux user 中的数据
+    removeToken() // 清空 token 的存储
     message.success('退出成功')
     nav(LOGIN_PATHNAME)
   }



根据用户登录状态动态跳转页面

需求:

  • 当用户已经登陆,在问卷管理页面时,URL中输 /login,会自动返回问卷管理页面,而非再登陆

实现思路:

  • 设计 useNavPage 钩子函数:获取用户状态与URL,根据用户状态判断是否页面跳转走向。

useNavPage.ts

import { useEffect } from 'react'
import { useNavigate, useLocation } from 'react-router-dom'
import {
  isLoginOrRegister,
  isNoNeedUserInfo,
  MANAGE_INDEX_PATHNAME,
  LOGIN_PATHNAME,
} from '../router'
import useGetUserInfo from './useGetUserInfo'

function useNavPage(waitingUserData: boolean) {
  const { username } = useGetUserInfo()
  const { pathname } = useLocation()
  const nav = useNavigate()

  useEffect(() => {
    if (waitingUserData) return
    if (username) {
      if (isLoginOrRegister(pathname)) {
        nav(MANAGE_INDEX_PATHNAME)
      }
      return
    }
    if (isNoNeedUserInfo(pathname)) {
      return
    } else {
      nav(LOGIN_PATHNAME)
    }
  }, [waitingUserData, username, pathname])
}

export default useNavPage

src/router/index.ts


export function isLoginOrRegister(pathname: string) {
  return [LOGIN_PATHNAME, REGISTER_PATHNAME].includes(pathname)
}

export function isNoNeedUserInfo(pathname: string) {
  return [HOME_PATHNAME, LOGIN_PATHNAME, REGISTER_PATHNAME].includes(pathname)
}




Bugfix

Q:请求不断发送

项目中有一处 请求会不断发送,在 Chrome Network 中可以看出。

useLoadUserData.ts

useEffect(() => {
  if (username) {
    setWaitingUserData(false)
  }
  run() // 这里可能造成循环调用
}, [username])

问题原因:

  • 当Redux中的username为空时,run()会执行获取用户信息
  • 获取成功后通过dispatch(loginReducer)更新username
  • username更新触发useEffect再次执行
  • 形成「获取数据 → 更新username → 触发请求」的循环

解决方案:

修改useLoadUserData.ts中的useEffect:

useEffect(() => {
  // 当已有用户信息时不再请求
  if (username) {
    setWaitingUserData(false)
    return
  }
  run()
}, [username]) // 保持原有依赖



Q:页面刷新自动弹回登陆界面

问题原因分析:

  1. 在useLoadUserData hook中,用户信息加载完成后才会设置waitingUserData为false
  2. useNavPage hook中会在用户信息未加载完成时判断路由权限
  3. 页面刷新时会清空Redux状态,导致需要重新加载用户信息
  4. 用户信息加载是异步操作,在加载完成前路由守卫已执行跳转判断

解决方案: 修改useLoadUserData.ts文件,在组件挂载时立即触发用户信息加载:

useLoadUserData.ts

function useLoadUserData() {
  const [waitingUserData, setWaitingUserData] = useState<boolean>(true) // 初始值改为 true
  const dispatch = useDispatch()

  // 加载用户信息
  const { run } = useRequest(getUserInfoService, {
    manual: true,
    onSuccess: res => {
      const { username, nickname } = res
      dispatch(loginReducer({ username, nickname }))
    },
    onFinally() {
      setWaitingUserData(false)
    },
  })

  // 添加 useEffect 立即执行数据加载
  useEffect(() => {
    run()
  }, [])

  // Redux 中数据
  const { username } = useGetUserInfo()
  useEffect(() => {
    if (username) {
      setWaitingUserData(false)
    }
  }, [username])

  return { waitingUserData }
}

修改说明:

  1. 将waitingUserData初始值设为true,确保加载状态初始正确
  2. 添加立即执行的useEffect触发用户信息加载
  3. 保留原有的username依赖检查作为双重保障

同时需要确保在utils/user-token.ts中正确实现了token的持久化存储(根据代码片段推断应已实现)。

这个修改可以保证:

  1. 页面刷新时立即触发用户信息加载
  2. 在用户信息加载完成前保持等待状态
  3. 路由守卫(useNavPage)会等待用户信息加载完成后再进行跳转判断
  4. 避免在异步加载过程中误判未登录状态
告别样板代码:Zustand——React状态管理的未来 React状态管理一直是开发者面临的痛点,从prop drilling到Redux的样板代码,再到Context API的性能问题。Zustand作为pmndrs团队开发的轻量级状态管理库,以其极简API(仅需1KB)、高性能渲染优化(精确选择器订阅)和模块化Store设计脱颖而出。 核心优势包括: 创建Store简单直观,无需繁琐配置 组件只订阅相关状态变化,避免不必要的重渲染 原生支持TypeScript,集成Redux DevTools 提供持久化、不可变更新等实用中间件 框架无关性,尤其适合Reac 阅读详情

相关推荐

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8289

react 低代码图编辑探索

基于react的低代码可拖拽实现,低代码JsonSchema渲染实现,图可编辑实现

weixin_43783814的博客 1512

scGPT-spatial 复现

文章摘要:Spatial scGPT项目复现流程 本文详细介绍了复现Spatial scGPT项目的完整流程,包含数据预处理、模型训练等关键步骤。首先需要使用scanpy加载H5AD文件并进行归一化、对数变换等预处理。然后构建基因词汇表(vocab),提取基因表达值和空间坐标信息。接着使用DataCollator进行数据分箱、掩码和填充处理。最后搭建TransformerModel进行训练。文章特别指出了需要自行补全的缺失部分,包括基因词汇表构建、空间坐标提取、数据集类定义和训练主循环脚本等。作者还提供了详

victory0431的博客 1683

React 极简低代码实现

这篇文章讲解如何使用 React 开发一个简易的低代码生成器,实现拖拽生成页面的功能。作者使用 Next.js 搭建项目,并详细介绍了项目需求、组件设计以及核心功能的实现方式。文章中重点阐述了如何利用 react-dnd 和 react-moveable 这两个库来实现拖拽和元素移动,并分享了开发过程中遇到的难点和解决方案。最后,作者公开了项目的 GitHub 源码地址,方便读者学习和参考。

weixin_48191864的博客 1777

2024年全国大学生电子设计竞赛H题_自动行驶小车

自动行驶小车(H题)【本科组/高职高专组】

qq_74395263的博客 1万+

增量编码器资讯大全

增量编码器是什么 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小,按照工作原理编码器可分为增量式和绝对式两类。 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。 编码器是把角位移或直线位移转换成电信号的一种装置。前者称为码盘,后者称码尺.按照读出方式编码器可以分为接触式和非接触式两种.接触式采...

kindele的博客 6008

基于React的低代码开发:探索应用构建的新模式

基于React的低代码开发:探索应用构建的新模式

“路漫漫其修远兮,吾将上下求索。” 2887

芯片硅前验证技术与驱动工程师实战指南

硅前验证是芯片开发流程中的关键环节,通过pre-silicon simulation等技术手段在流片前验证设计正确性。其核心技术包括软件仿真、FPGA原型验证和硬件仿真器解决方案,涉及Linux驱动开发、芯片架构理解和波形分析等核心技能。作为连接芯片设计与系统集成的桥梁,硅前验证能早期发现设计缺陷,节省数百万美元流片成本。以Cadence Palladium为代表的硬件仿真器,通过专用服务器系统实现比纯软件方案快100-1000倍的仿真速度,为驱动工程师提供完整的外设模型验证环境。掌握硅前验证技术可显著提升

weixin_42522857的博客 323

React低代码开发——React Dnd

react dnd 低代码开发

weixin_43506403的博客 1683

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4653

SAP Build Work Zone standard edition 订阅报错 OIDC trust missing 的成因与完整解决路径

摘要:用户订阅SAP Build Work Zone时遇到422错误,提示未配置OpenID Connect信任。该错误表明业务用户需通过SAP Cloud Identity Services的OIDC协议认证,而当前子账户仅配置了SAML信任或未配置信任。解决方法是进入子账户的Trust Configuration页面,使用Establish Trust功能建立与SAP Cloud Identity Services的OIDC信任关系。这是SAP新版服务的强制要求,SAML协议已不被支持。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 197

0902Redux_状态管理-react-仿低代码平台项目

0902Redux_状态管理-react-仿低代码平台项目

gaogzhen的博客 1197

6.14华为OD机试真题 新系统 - 字符串格式调整 (Java/Py/C/C++/Js/Go)

# **字符串格式调整** > 2026 华为OD机试真题 6月14日华为OD上机新系统考试真题 100 分题型 点击查看华为 OD 机试真题完整目录:[2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解](https://blog.csdn.net/banxia_frontend/article/details/160346662) # 题目描述 输入一个字符串,字符串中只包含大写字母和数字。要求将字符串中的所有数字提取出来,按出现的顺序组

算法大师! 947

从零实现一套低代码(保姆级教程) --- 【6】在项目中使用redux状态管理

在上一篇文章中的末尾,我们也完成了Input组件的属性面板配置。现在我们的低代码项目已经小有成就了。但是后面的内容还是不少的。如果你是第一次看到这篇文章,那么请移步到第一节: 从零实现一套低代码(保姆级教程) — 【1】初始化项目,实现左侧组件列表 来到本系列的第六节,我们回顾一下之前的实现内容。前两点,我们目前是通过window,来实现组件的信息传递的。那既然有很多地方用,所以我们需要有一个全局的状态管理,管理组件的信息。所以,这时候我们就要引入redux了,用redux我们可以统一管理组件相关的信息。这

weixin_46726346的博客 1369

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

React低代码平台开发reactjs-interview-questions:可视化搭建系统

在当今快速迭代的软件开发环境中,传统的手工编码方式已经难以满足业务快速变化的需求。React低代码平台(Low-Code Development Platform, LCDP)通过可视化界面和配置化方式,让开发者能够快速构建应用程序,大幅提升开发效率。 本文将深入探讨如何基于React技术栈构建一个专业的低代码平台,特别针对reactjs-interview-questions项目,展示如何将传...

gitblog_00042的博客 889

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

推荐书籍《低代码平台开发实践:基于React》—— 提升开发效率,构建优质应用

随着数字化转型的深入,企业对应用开发效率和灵活性的要求不断提高。低代码平台作为新兴的软件开发方式,通过可视化界面和预构建组件,极大简化了应用开发流程,降低了技术门槛。基于React的低代码平台以其组件化、响应式和数据驱动等特性,成为当前流行的低代码开发选择。

唯有努力,方可自信! 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何使用React-Slingshot构建灵活的低代码平台集成方案

React-Slingshot是一个功能全面的React + Redux开发框架,它提供了完整的开发环境和最佳实践,让开发者能够快速构建现代化的Web应用。本文将介绍如何利用React-Slingshot的灵活性和可扩展性,实现与低代码平台的无缝集成,同时保留项目的定制化能力。 ## 为什么选择React-Slingshot进行低代码集成? React-Slingshot作为一个成熟的Reac

gitblog_01038的博客 1015

0901context_useReducer_状态管理-react-仿低代码平台项目

0901context_useReducer_状态管理-react-仿低代码平台项目

gaogzhen的博客 1275

0903Redux改造项目_用户信息_状态管理-react-仿低代码平台项目

0903Redux改造项目_用户信息_状态管理-react-仿低代码平台项目

gaogzhen的博客 752

终极指南:如何在React项目中快速集成amis低代码框架

还在为重复编写表单、表格而烦恼吗?amis前端低代码框架通过JSON配置就能生成各种页面,让你告别繁琐的前端开发!想知道如何在现有React项目中无缝集成amis,享受低代码开发的高效体验吗?让我们一起探索这个简单又强大的解决方案! ## 为什么选择amis?低代码开发的核心价值 你是否经常遇到这些开发痛点? - 重复编写相似的表单和表格组件 - 前后端联调耗费大量时间 - UI一致性难以保证

gitblog_00420的博客 554

5分钟上手!react-slingshot与低代码平台集成实战:从0到1搭建企业级应用

你是否还在为企业应用开发中的重复劳动而烦恼?面对复杂的业务逻辑和紧张的交付周期,如何快速搭建稳定可靠的前端架构?本文将通过一个真实案例,展示如何将react-slingshot与低代码平台无缝集成,帮助你在30天内完成原本需要3个月的企业级应用开发。 读完本文,你将获得: - 一套完整的react-slingshot与低代码平台集成方案 - 5个可直接复用的企业级组件模板 - 3个核心性能优化技

gitblog_00630的博客 904

React 状态管理:状态分类、架构设计与工程选型

本文系统梳理现代 React 状态管理的核心理念与技术选型逻辑,强调应基于数据所有权、作用范围与生命周期而非项目规模选择方案。从局部状态(useState)、共享状态(Context/Zustand/Jotai)到服务器状态(TanStack Query),明确区分本地、客户端与服务端数据的职责边界。提出“单一事实来源”原则,避免多份状态竞争,并结合 AI Agent Chat Workbench 案例,指导开发者构建可演进的状态架构。

青蛙king的博客 936

如何把 amis 塞进现有 React 工程:一份完整的 JSON 低代码集成指南

amis 是百度开源的前端低代码框架,核心能力是通过 JSON 配置生成表单、表格、弹窗等各类页面。如果你的团队正在为重复编写增删改查页面、前后端联调耗时、UI 风格不统一而头疼,那么把 amis 接入现有 React 工程就是性价比最高的一条路。本文带你走完"从零跑通 → 深度打通 → 进阶扩展 → 避坑"的完整闭环,全部代码可直接复制运行。 ## 先花 10 秒判断:该不该引入 amis

gitblog_01001的博客 454

Webcodesk:3分钟学会的可视化React开发神器,告别Redux样板代码时代

还在为React项目中的Redux样板代码而烦恼吗?还在手动编写繁琐的组件通信逻辑吗?今天要介绍的Webcodesk,正是解决这些痛点的革命性工具。这款基于npm模块的应用,通过可视化编辑器让你在浏览器中就能构建完整的React应用,真正实现了"所见即所得"的开发体验。 ## 项目速览:React开发的"降维打击"工具 Webcodesk的核心价值在于**将复杂的Redux配置可视化**。传统

gitblog_00945的博客 714

从零开始:如何用amis低代码框架在React项目中实现80%开发效率提升

你是不是还在为重复编写表单、表格、弹窗这些基础组件而烦恼?每次开发后台管理系统时,是不是总在CRUD页面中消耗大量时间?想象一下,如果有一种方法能让这些重复性工作减少80%,你会不会心动? 今天我要介绍的amis前端低代码框架,正是解决这些痛点的利器。作为一个基于JSON配置就能生成各种页面的框架,amis已经在百度内部广泛应用,现在开源出来让更多开发者受益。你会发现,通过amis与React的

gitblog_00943的博客 391
上一篇: React 低代码项目:网络请求与问卷基础实现
下一篇: 吐司问卷(React低代码):问卷编辑器 I
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值