构建企业级React应用的进阶实践

构建企业级React应用的进阶实践

在当今前端开发领域,React凭借其组件化架构和声明式编程范式,已成为构建复杂用户界面的首选方案。本文将深入探讨React的高级应用场景,通过一系列精心设计的代码示例,展示如何打造高性能、可维护的现代化前端应用。

一、状态管理的艺术

1.1 原子化状态管理

typescript

复制

// lib/recoil/atoms.ts
import { atom, selector } from 'recoil';export const userState = atom<User>({key: 'userState',default: async () => {const response = await fetch('/api/current-user');return response.json();},
});export const userPermissions = selector({key: 'userPermissions',get: ({ get }) => {const user = get(userState);return new Set(user.roles.flatMap(getRolePermissions));}
});

1.2 状态机驱动交互

typescript

复制

// components/PaymentForm.tsx
import { useMachine } from '@xstate/react';
import paymentMachine from './machines/payment';const PaymentForm = () => {const [state, send] = useMachine(paymentMachine);return (<div data-state={state.value}>{state.matches('idle') && (<button onClick={() => send('INIT')}>开始支付</button>)}{state.matches('processing') && <ProcessingIndicator />}{state.matches('success') && <ConfettiAnimation />}{state.hasTag('error') && <ErrorRetry onRetry={() => send('RETRY')}/>}</div>);
};

二、性能优化策略

2.1 虚拟化长列表

typescript

复制

// components/VirtualList.tsx
import { FixedSizeList } from 'react-window';
import AutoSizer from 'react-virtualized-auto-sizer';const VirtualList = ({ items }) => (<AutoSizer>{({ height, width }) => (<FixedSizeListheight={height}width={width}itemSize={80}itemCount={items.length}overscanCount={5}>{({ index, style }) => (<div style={style}><ListItem data={items[index]}measure={measureCache[index]}/></div>)}</FixedSizeList>)}</AutoSizer>
);

2.2 并发模式实践

typescript

复制

// components/SearchInput.tsx
import { useTransition } from 'react';const SearchInput = () => {const [query, setQuery] = useState('');const [results, setResults] = useState([]);const [isPending, startTransition] = useTransition();const handleChange = (e) => {setQuery(e.target.value);startTransition(() => {searchAPI(e.target.value).then(setResults);});};return (<div><input value={query} onChange={handleChange}className={isPending ? 'pending' : ''}/>{isPending ? <SkeletonResults /> : <ResultList items={results} />}</div>);
};

三、高级组件模式

3.1 复合组件设计

typescript

复制

// components/DataTable.tsx
const DataTable = ({ children }) => {const [sortConfig, setSortConfig] = useState(null);const contextValue = useMemo(() => ({sortConfig,onSort: setSortConfig}), [sortConfig]);return (<TableContext.Provider value={contextValue}><table className="advanced-table">{children}</table></TableContext.Provider>);
};const Column = ({ field, children }) => {const { sortConfig, onSort } = useContext(TableContext);return (<th onClick={() => onSort(field)}>{children}{sortConfig?.field === field && (<SortIndicator direction={sortConfig.direction} />)}</th>);
};// 使用方式
<DataTable><thead><tr><Column field="name">姓名</Column><Column field="age">年龄</Column></tr></thead>
</DataTable>

四、类型驱动开发

4.1 高级类型工具

typescript

复制

// types/utils.ts
type DeepPartial<T> = T extends object ? {[P in keyof T]?: DeepPartial<T[P]>;
} : T;type APIResponse<T> = {data: T;error?: {code: number;message: string;details?: Record<string, string[]>;};meta: {pagination?: {page: number;pageSize: number;total: number;};};
};// 组件Props类型推导
type Props<T extends React.ElementType> = {as?: T;theme?: 'light' | 'dark';
} & React.ComponentPropsWithoutRef<T>;

五、现代化工程实践

5.1 模块联邦架构

javascript

复制

// webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;module.exports = {plugins: [new ModuleFederationPlugin({name: 'appShell',remotes: {auth: 'auth@http://localhost:3001/remoteEntry.js',dashboard: 'dashboard@http://localhost:3002/remoteEntry.js'},shared: {react: { singleton: true },'react-dom': { singleton: true },'react-router-dom': { singleton: true }}})]
};

六、测试策略

6.1 可视化测试

typescript

复制

// tests/Button.stories.tsx
export default {title: 'Components/Button',component: Button,parameters: {chromatic: { viewports: [320, 768, 1200] },},
} as ComponentMeta<typeof Button>;const Template: ComponentStory<typeof Button> = (args) => (<Button {...args} />
);export const Primary = Template.bind({});
Primary.args = {variant: 'primary',children: 'Submit'
};// Storybook + Chromatic 实现视觉回归测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术总结:FPGA基于GTX+RIFFA架构实现多功能SDI视频转PCIE采集卡设计方案

目录 1、前言工程概述免责声明 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Block for PCI ExpressRIFFA驱动及其安装QT上位机HDMI输出RGB转BT…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊…

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…

鸿蒙next 自定义日历组件

效果图预览 20250124-113957 使用说明 1.选择日期左右箭头&#xff0c;实现每月日历切换&#xff0c;示例中超出当前月份&#xff0c;禁止进入下一月&#xff0c;可在代码更改 2.日历中显示当前选择的日期&#xff0c;选中的日期颜色可自定义 3.日历中可展示历史记录作为数据…

Linux 部署 Java 项目:Tomcat、Redis、MySQL 教程

在 Linux 服务器上部署 Java 项目通常需要配置应用服务器&#xff08;如 Tomcat&#xff09;、数据库&#xff08;如 MySQL&#xff09;和缓存服务器&#xff08;如 Redis&#xff09;。本文将详细介绍如何在 Linux 环境中部署一个 Java 项目&#xff0c;涵盖 Tomcat、Redis 和…

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章&#xff0c;用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别&#xff0c;突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”&#xff0c;刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

uniapp 在线更新应用

在线更新应用及进度条显示 1.比较现安装手机中的apk 与线上apk的版本 getVersion(){var newVersionuni.getStorageSync("newVersion").split(".")var versionplus.runtime.version.split(".") // 获取手机安装的版本var versionNum""…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…

华为 Ascend 平台 YOLOv5 目标检测推理教程

1. 背景介绍 随着人工智能技术的快速发展&#xff0c;目标检测在智能安防、自动驾驶、工业检测等领域中扮演了重要角色。YOLOv5 是一种高效的目标检测模型&#xff0c;凭借其速度和精度的平衡广受欢迎。 华为 Ascend 推理框架&#xff08;ACL&#xff09;是 Ascend CANN 软件…

Linux MySQL离线安装

一、准备工作 1. 下载MySQL安装包 访问MySQL官方网站&#xff0c;选择适合您Linux系统的MySQL版本进行下载。通常推荐下载Generic Linux (glibc 2.12)版本的.tar.gz压缩包&#xff0c;例如mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz。将下载好的安装包拷贝到Linux服务器的某…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

CAPL自动化测试

CAPL自动化测试 目录 CAPL自动化测试1. 引言2. 测试用例设计与实现2.1 测试用例设计2.2 测试用例实现3. 测试报告生成与分析3.1 测试报告生成3.2 测试报告分析4. 自动化测试框架搭建4.1 自动化测试框架设计4.2 自动化测试框架实现5. 案例说明5.1 案例1:测试用例设计与实现5.2 …

【go语言】map 和 list

一、map map 是一种无序的键值对的集合。 无序 &#xff1a;map[key]键值对&#xff1a;key - value map 最重要的一点是通过 key 来快速检索数据&#xff0c;key 类似于索引&#xff0c;指向数据的值。map 是一种集合&#xff0c;所以我们可以像迭代数组和切片那样迭代他。…