【React设计】React企业级设计模式

https://bugfender.com

Image Source : https://bugfender.com

React是一个强大的JavaScript库,用于构建用户界面。其基于组件的体系结构和构建可重用组件的能力使其成为许多企业级应用程序的首选。然而,随着应用程序的规模和复杂性的增长,维护和扩展变得更加困难。这就是设计模式发挥作用的地方。在这篇博客文章中,我们将探讨一些最常用的React企业设计模式,以及TypeScript中的代码示例。

容器和呈现组件模式

React中使用最广泛的模式之一是容器和表示组件模式。这种模式将表示逻辑与业务逻辑分离,使代码更加模块化,更易于测试。容器组件负责从服务器获取数据,并将其作为prop 传递给表示组件。表示组件负责呈现UI。

// Container Component
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchUsers } from './userActions';
import { RootState } from './rootReducer';
import UserList from './UserList';const UserListContainer: React.FC = () => {const dispatch = useDispatch();const { loading, users } = useSelector((state: RootState) => state.users);useEffect(() => {dispatch(fetchUsers());}, [dispatch]);return <UserList loading={loading} users={users} />;
};export default UserListContainer;// Presentational Component
import React from 'react';
import { User } from './userTypes';interface Props {loading: boolean;users: User[];
}const UserList: React.FC<Props> = ({ loading, users }) => {if (loading) return <div>Loading...</div>;if (!users) return null;return (<ul>{users.map((user) => (<li key={user.id}>{user.name}</li>))}</ul>);
};export default UserList;

渲染Props 图案

“渲染prop ”模式是一种使用值为函数的prop 在组件之间共享代码的技术。当组件具有相似的功能但具有不同的渲染要求时,此模式非常有用。

import React from 'react';interface Props {render: (count: number, increment: () => void) => JSX.Element;
}const Counter: React.FC<Props> = ({ render }) => {const [count, setCount] = React.useState(0);const increment = () => {setCount(count + 1);};return render(count, increment);
};export default Counter;// Usage
import React from 'react';
import Counter from './Counter';const App: React.FC = () => {return (<div><h1>Render Props Pattern</h1><Counterrender={(count, increment) => (<div><p>Count: {count}</p><button onClick={increment}>Increment</button></div>)}/></div>);
};export default App;

高阶组件模式。

高阶组件(HOC)模式是React中的一种设计模式,它通过提供一种增强或修改组件功能的方法来实现组件的可重用性和代码共享。

简单地说,HOC是一个函数,它接受一个组件作为参数,并返回一个具有附加功能的新组件。然后,可以像React中的任何其他组件一样渲染新组件。原始组件由HOC包裹,HOC为包裹的组件提供额外的行为或prop 

HOC可用于广泛的任务,如提供上下文、处理错误、获取数据或强制身份验证。它们可以帮助减少代码重复,提高代码可维护性,并促进代码重用。

import React from 'react';// Define a higher-order component
const withName = (WrappedComponent) => {return class extends React.Component {state = {name: 'John Doe'}render() {return (<WrappedComponent name={this.state.name} {...this.props} />)}}
}// Define a regular component
const MyComponent = (props) => {return (<div><p>Hello, my name is {props.name}.</p><p>I am a {props.role}.</p></div>)
}// Wrap MyComponent with the withName HOC
const MyComponentWithName = withName(MyComponent);// Render MyComponentWithName
const App = () => {return (<div><MyComponentWithName role="developer" /></div>)
}export default App;

禁用prop 模式

禁用prop模式是React中使用的一种设计模式,它通过提供一种方法来禁用按钮、链接和表单字段等交互元素(当它们不可用或不适用时),从而能够创建可访问的用户界面。

该模式包括向组件中的交互式元素添加一个禁用的prop ,当设置为true时,将禁用该元素并阻止其接收用户输入。这对于由于特定条件(例如表单不完整或用户权限不足)导致交互式元素不适用的情况尤其有用。

import React from 'react';const App = () => {return (<div><SomeComponent disabled /></div>);
};const SomeComponent = ({ disabled = false }) => {return (!disabled && (<div><h2>Disable SomeComponent to see magic happen!</h2></div>));
};

受控和非受控组件模式

受控组件是一个表单元素,其值由React控制。换句话说,组件的值总是通过props显式设置,并通过回调进行更新。这意味着组件的状态始终与输入数据同步,允许React控制组件的行为,并允许开发人员轻松处理用户输入。

import React, { useState } from 'react';function ControlledInput() {const [value, setValue] = useState('');const handleChange = (event) => {setValue(event.target.value);};return (<input type="text" value={value} onChange={handleChange} />);
}

不受控制的零部件是由浏览器管理其值的形状元素。换句话说,组件的值由用户设置,React不控制其行为。这会使处理复杂表单中的用户输入变得更加困难,但在简单表单中使用也会更快、更容易。

import React, { useRef } from 'react';function UncontrolledInput() {const inputRef = useRef(null);const handleSubmit = (event) => {event.preventDefault();console.log(inputRef.current.value);};return (<form onSubmit={handleSubmit}><input type="text" ref={inputRef} /><button type="submit">Submit</button></form>);
}

复合部件模式

复合组件模式是React中用于管理由多个子组件组成的组件的设计模式。这种模式包括将父组件的关注点分离为较小的组件,然后使用prop 、上下文和其他技术的组合来管理这些较小组件之间的关系。

复合组件模式背后的理念是为开发人员提供一种方法,以创建由较小构建块组成的可重复使用、灵活和易于使用的组件。这使开发人员能够创建复杂的UI组件,这些组件可以很容易地进行自定义和扩展,同时仍然保持清晰易懂的代码结构

import React, { createContext, useState } from 'react';const ToggleContext = createContext();function Toggle({ children }) {const [on, setOn] = useState(false);const toggle = () => setOn(!on);return (<ToggleContext.Provider value={{ on, toggle }}>{children}</ToggleContext.Provider>);
}function ToggleOn({ children }) {const { on } = useContext(ToggleContext);return on ? children : null;
}function ToggleOff({ children }) {const { on } = useContext(ToggleContext);return on ? null : children;
}function ToggleButton(props) {const { on, toggle } = useContext(ToggleContext);return <button onClick={toggle} {...props} />;
}function App() {return (<Toggle><ToggleOn>The button is on</ToggleOn><ToggleOff>The button is off</ToggleOff><ToggleButton>Toggle</ToggleButton></Toggle>);
}

prop 集合模式

prop 集合模式是React中用于将prop 集合传递给组件的设计模式。它包括将多个相关prop 组合成一个对象,然后将其作为一个prop 传递给组件。

当我们想将大量相关的prop 传递给组件时,这种模式特别有用,因为它可以减少代码中的混乱,并使prop 的管理变得更容易。

import React from 'react';function Button(props) {const { label, color, size, ...rest } = props;return (<button style={{ color, fontSize: size }} {...rest}>{label}</button>);
}function App() {const buttonProps = {label: "Click Me",color: "red",size: "20px",onClick: () => console.log("Button clicked!")};return <Button {...buttonProps} />;
}

函数作为子模式

Function as Child模式是React中使用的一种设计模式,它涉及将函数作为子级传递给组件,然后在组件内部调用该组件来呈现实际内容。

import React from 'react';function Toggle(props) {const [on, setOn] = useState(false);const handleToggle = () => {setOn(!on);};return props.children({on: on,toggle: handleToggle});
}function App() {return (<Toggle>{({ on, toggle }) => (<div>{on ? "The button is on" : "The button is off"}<button onClick={toggle}>Toggle</button></div>)}</Toggle>);
}

受控输入模式

受控输入模式是React中用于管理输入字段的模式。它包括将输入字段的当前值存储在组件状态中,并在输入值更改时使用事件处理程序更新状态。

import React, { useState } from "react";function ControlledInput() {const [inputValue, setInputValue] = useState("");const handleInputChange = (event) => {setInputValue(event.target.value);};return (<div><input type="text" value={inputValue} onChange={handleInputChange} /><p>The input value is: {inputValue}</p></div>);
}

不可变模式

不可变模式通常用于管理组件的状态。我们不直接修改状态,而是使用更新的值创建一个新的状态对象,然后将其传递给组件进行渲染。

Immutable.js库可用于创建不可变的数据结构,这些数据结构可用于React状态管理。以下是如何在React组件中使用不可变模式的示例:

import React, { Component } from 'react';
import { Map } from 'immutable';class MyComponent extends Component {state = {data: Map({name: 'John',age: 30,email: 'john@example.com'})};handleNameChange = (event) => {const name = event.target.value;const newData = this.state.data.set('name', name);this.setState({ data: newData });};render() {const { data } = this.state;return (<div><label>Name:</label><input type="text" value={data.get('name')} onChange={this.handleNameChange} /><label>Age:</label><span>{data.get('age')}</span><label>Email:</label><span>{data.get('email')}</span></div>);}
}

在这篇博客文章中,我们讨论了一些最常用的React企业设计模式,包括高阶组件、渲染prop 、容器表示组件模式、复合组件、受控组件等等。通过在React项目中应用这些设计模式和最佳实践,您可以提高代码质量,增加团队协作,并使您的应用程序更具可扩展性、灵活性和可维护性。然而,重要的是要记住,这些模式不是一刀切的解决方案,可能需要根据项目的具体要求进行调整。

总的来说,React企业设计模式是一套有价值的工具和技术,可以帮助您构建更好的React应用程序,提高开发生产力和效率,并提供满足用户和利益相关者需求的高质量软件。

编码快乐!

文章链接

【React设计】React企业设计模式 | 程序员云开发,云时代的程序员.

欢迎收藏【架构师酒馆】和【开发者开聊】

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

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

相关文章

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…

SSM项目实战-前端-添加分页控件-调正页面布局

1、Index.vue <template><div class"common-layout"><el-container><el-header><el-row><el-col :span"24"><el-button type"primary" plain click"toAdd">新增</el-button></el-…

JavaScript新特性

JavaScript新特性 紧接上文&#xff0c;JS入门手册&#x1f4af; 这篇文章介绍了&#xff0c;JavaScript的基本语法&#xff0c;而随着时代发展&#xff0c;JS早已今非昔比&#xff0c;推荐一个大佬的文章&#xff1a;阮一峰老师 ECMAScript ECMAScript&#xff08;简称“E…

锂电池包膜机通过设备管理系统做好预测性维护的作用

在现代工业生产中&#xff0c;包膜机在锂电产业链中处于电池制造环节&#xff0c;是锂电池生产线上的关键设备之一。然而&#xff0c;随着生产规模的扩大和工作环境的复杂化&#xff0c;锂电池包膜机也面临着常见故障和维护需求。为了更好地管理和维护锂电池包膜机&#xff0c;…

新加坡社区领袖卓顺发的荣誉与大爱精神

2023年11月24日,善济医社义务执行主席卓顺发太平绅士JP, BBM(L), PVPA受邀出席内政部主办的答谢活动2023,主宾为内政部长兼律政部长尚穆根先生(Mr. K Shanmugam)。 2018年起,卓顺发受委为太平绅士后,应内政部邀请,担任纪律咨询委员会委员和巡狱太平绅士及视察团委员。他在颁奖…

Java并发模式和设计策略

引言 小伙伴们&#xff0c;今天小黑要和咱们聊聊Java并发编程的那些事儿。在现代软件开发中&#xff0c;高效地处理多任务是一个不可或缺的能力。特别是对于服务成千上万用户的应用&#xff0c;能够同时处理多个操作不仅是一个加分项&#xff0c;简直是必备技能了&#xff01;…

【openssl】RSA 生成公钥私钥 |通过私钥获取公钥

通过博客&#xff1a;Window系统如何编译openssl 编译出openssl.exe&#xff08;位于apps文件夹下&#xff09;。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明&#xff01;&#xff01;&#xff01; 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 …

IDEA 下载mysql驱动下载在不下来

结合一下 https://www.cnblogs.com/dadian/p/11936056.htmlhttps://www.cnblogs.com/dadian/p/11936056.html并且下载的 在idea改名 加入 加入到库 等待一会就要你输入sql的root和密码了,就OK

冰酒为什么贵?一篇给你讲清楚

冰酒因为昂贵被定义为&#xff1a;颜色和价格都如同黄金的奢侈品。那么&#xff0c;号称液体黄金的冰酒为什么这么贵呢&#xff1f;云仓酒庄给大家讲讲清楚。 云仓酒庄多品牌多代言运营模式&#xff0c;邀请当红明星来出席或代言自身产品&#xff0c;找到与品牌自身形象、调性相…

C语言 操作符详解

C语言学习 目录 文章目录 前言 一、算术操作符 二、移位操作符 2.1 左移操作符 2.2 右移操作符 三、位操作符 3.1 按位与操作符 & 3.2 按位或操作符 | 3.3 按位异或操作符 ^ 四、赋值操作符 五、单目操作符 5.1 逻辑反操作符&#xff01; 5.2 正值、负值-操作符 5.3 取地址…

vscode中使用luaide-lite插件断点调试cocos2dx-lua

使用quick-cocos2dx-lua&#xff0c;用了众多插件&#xff0c;包括免费的BabeLua,VS调试太慢&#xff0c;vscode上的免费的EmmyLua, 还有收费的luaide&#xff0c;都没搞出来&#xff0c;唯独这个免费luaide-lite用成功了&#xff0c;步骤也简单&#xff0c;可以断点调试&#…

Linux(14):进程管理

一个程序被加载到内存当中运作&#xff0c;那么在内存内的那个数据就被称为进程(process)。 进程是操作系统上非常重要的概念&#xff0c;所有系统上面跑的数据都会以进程的型态存在。 进程 在 Linux底下所有的指令与能够进行的动作都与权限有关&#xff0c;而系统如何判定权…

JDK 历史版本下载以及指定版本应用

参考&#xff1a; 官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载-CSDN博客 Gradle&#xff1a;执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里&#xff0c;但是我们要下载历史版本 选…

vue3 + TS 项目中使用pinia-plugin-persistedstate持久化缓存

Vue 3和Pinia是一对非常好的组合&#xff0c;可以帮助你构建现代化的Vue应用程序。而pinia-plugin-persistedstate是一个用于在Pinia存储中实现状态持久化的插件。下面我将详细介绍如何在Vue 3应用程序中使用Pinia和pinia-plugin-persistedstate模块。 首先&#xff0c;确保你…

[C++]priority_queue的介绍及模拟实现

目录 priority_queue的介绍及模拟实现&#xff1a;&#xff1a; priority_queue的介绍 priority_queue的定义方式 priority_queue各个接口的使用 堆的向上调整算法 堆的向下调整算法 仿函数 priority_queue的模拟实现 反向迭代器的底层原理 反向迭代器的模拟实现 priority_que…

SWD和JTAG

1、调试接口概念 1&#xff09;SWD&#xff1a;Serial Wire Debug&#xff0c;代表串行线调试&#xff0c;是ARM设计的协议&#xff0c;用于对其微控制器进行编程和调试。 SWD 引脚&#xff1a; SWDIO–串行数据线&#xff0c;用于数据的读出和写入SWDCLK–串行时钟线&#…

前端开发_CSS

CSS定义 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签里面书…

内外网转换NAT

目录 分类 内核参数配置文件 SNAT 网关服务器配置 配置内网主机 配置外网主机 配置SNAT 内网主机测试 DNAT 配置网关服务器 支持的规则链&#xff1a;INPUT、OUTPUT、PREROUTING、POSTROUTING 分类 SNAT&#xff08;将外网设备共享给内网&#xff09; source NAT &a…

关于rocketMQ踩坑的那些事

在最近&#xff0c;我所写的这个项目需要使用到rocketMQ&#xff0c;为了图方便我便使用的是Windows版本的&#xff0c;但是在使用的过程中首先是发现无法发送消息出去&#xff0c;报错信息为 org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still …

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…