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

news2024/9/29 9:32:00

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>
      <Counter
        render={(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.coloradmin.cn/o/1283844.html

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

相关文章

面试官:说说synchronized与ReentrantLock的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

python pyaudio 录取语音数据

python pyaudio 录取语音数据 pyaudio安装方法&#xff1a; pip install pyaudio如果这个不行&#xff0c;可以尝试&#xff1a; pip install pipwin pipwin install pyaudio代码如下&#xff1a; import pyaudio import waveRESPEAKER_RATE 44100 # 采样率&#xff0c;每…

LoadBalancer将服务暴露到外部实现负载均衡purelb-layer2模式配置介绍

目录 一.purelb简介 1.简介 2.purelb的layer2工作模式特点 二.layer2的配置演示 1.首先准备ipvs和arp配置环境 2.purelb部署开始 &#xff08;1&#xff09;下载purelb-complete.yaml文件并应用 &#xff08;2&#xff09;查看该有的资源是否创建完成并运行 &#xff…

数字化转型浪潮中,施耐德电气如何用技术革新引领未来?

作为一家187年的老牌企业&#xff0c;施耐德电气不仅见证了科技的演进&#xff0c;也是数字化转型潮流中的先行者。在近日的施耐德电气数字化战略暨软件创新沟通会上&#xff0c;施耐德电气全球执行副总裁&#xff0c;首席数字官Peter Weckesser&#xff1b;施耐德电气副总裁、…

MySQL笔记-第03章_基本的SELECT语句

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第03章_基本的SELECT语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 …

PoE技术详解

标准的五类网线有四对双绞线&#xff0c;IEEE 802.3af和IEEE 802.3at允许两种用法&#xff1a;通过空闲线对供电或者数据线对供电。IEEE 802.3bt允许通过空闲线对供电、通过数据线对供电或者空闲线对和数据线对一起供电&#xff0c;如图16.1所示。 图 16.1 PoE供电线对 当在一…

2023年12月4日:多继承

代码 #include <iostream>using namespace std;class Sofa { private:string sit;int *len; public:Sofa(){cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int len):sit(sit),len(new int(len)){cout << "Sofa::有参构造函数…

力扣124. 二叉树中的最大路径和(java DFS解法)

Problem: 124. 二叉树中的最大路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

Python流程控制【侯小啾python基础领航计划 系列(十)】

Python流程控制【侯小啾python基础领航计划 系列(十)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

Redis——某马点评day03

全局唯一ID 创建一个工具类 Component public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN_TIME_STAMP1672531200L;/*** 序列号的位数*/private static final int COUNT_BITS32;private StringRedisTemplate stringRedisTemplate;public RedisIdW…

判断是否存在重复的数

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

2023年哪些行业的offer发的最多?智能制造、AIGC、AI大模型位居前三

口罩过后&#xff0c;职场现状如何&#xff1f;为何211,985毕业生也找不到工作&#xff1f;哪些行业offer多多&#xff1f; 今天我以猎聘大数据《2023届高校毕业生就业数据报告》为基础&#xff0c;带大家一起来看2023年高校毕业生就业形势。热门行业岗位、18个新赛道机会、就业…

关于使用百度开发者平台处理语音朗读问题排查

错误信息&#xff1a;"convert_offline": false, "err_detail": "16: Open api characters limit reach 需要领取完 识别和合成都要有

堆排序详细解读

简介 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;它的特点是不同于传统的比较排序算法&#xff0c;它是通过建立一个堆结构来实现的。堆排序分为两个阶段&#xff0c;首先建立堆&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换并调整堆&#xff0c;使得最大…

YOLOv3 快速上手:Windows 10上的训练环境搭建

文章目录 前言一、前期准备二、基础环境准备1. 创建虚拟环境2. 打开Terminal3. 下载YOLOv3运行环境 三、PyCharm关联3.1 运行PyCharm3.2 关联Anaconda虚拟环境 四、运行环境检查1. 检查requirements.txt文件2. 安装依赖 五、运行代码5.1 运行检测代码5.2 运行训练代码 六、常见…

Python中的类(Class)和对象(Object)

目录 一、引言 二、类&#xff08;Class&#xff09; 1、类的定义 2、类的实例化 三、对象&#xff08;Object&#xff09; 1、对象的属性 2、对象的方法 四、类和对象的继承和多态性 1、继承 2、多态性 五、类与对象的封装性 1、封装的概念 2、Python中的封装实现…

cmd查看进程信息 终止进程

cmd查看进程信息 终止进程 1、cmd查看进程信息2、终止进程 1、cmd查看进程信息 tasklist命令 描述: 该工具显示在本地或远程机器上当前运行的进程列表。 tasklist /?查看本机所有进程列表 tasklist /V根据进程名 查看jmeter进程 tasklist /V |findstr /i jmeter2、终止进程…

操作系统·设备管理

I/O系统是计算机系统的重要组成部分&#xff0c;是OS中最复杂且与硬件密切相关的部分 I/O系统的基本任务是完成用户提出的I/O请求&#xff0c;提高I/O速率以及改善I/O设备的利用率&#xff0c;方便高层进程对IO设备的使用 I/O系统包括用于实现信息输入、输出和存储功能的设备和…

C++ 系列 第四篇 C++ 数据类型上篇—基本类型

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 前言 面向对象编程(OOP)的…

[多线程]阻塞队列和生产者消费者模型

目录 1.阻塞队列 1.1引言 1.2Java标准库中的阻塞队列 1.3自主通过Java代码实现一个阻塞队列(泛型实现) 2.生产者消费者模型 1.阻塞队列 1.1引言 阻塞队列是多线程部分一个重要的概念,它相比于一般队列,有两个特点: 1.线程是安全的 2.带有阻塞功能 1) 队列为空,出队列就会阻…