ReactJS 设计模式:编写健壮且可扩展的组件

reactjs 设计模式:编写健壮且可扩展的组件

reactjs 中的设计模式为应用程序开发中的常见问题提供了标准化且经过验证的解决方案。使用这些模式不仅使您的代码更具可读性和可维护性,而且还增强了其可扩展性和健壮性。让我们深入研究一些最流行的 reactjs 设计模式,并通过示例来说明它们的用法。

1. 容器和表示组件模式

容器和展示模式将组件分为两类:

展示组件:关注事物的外观(ui)。容器组件:关注事物如何工作(逻辑和状态管理)。

这种分离可以实现更好的可重用性、更容易的测试和更清晰的代码。

示例:展示和容器组件

// presentational component: displaying user list (userlist.js)import react from 'react';const userlist = ({ users }) => (  
    {users.map((user) => (
  • {user.name}
  • ))}
);export default userlist;
// container component: fetching user data (usercontainer.js)import react, { usestate, useeffect } from 'react';import userlist from './userlist';const usercontainer = () => {  const [users, setusers] = usestate([]);  useeffect(() => {    const fetchusers = async () => {      const response = await fetch('https://jsonplaceholder.typicode.com/users');      const data = await response.json();      setusers(data);    };    fetchusers();  }, []);  return ;};export default usercontainer;

这里,userlist 是一个展示组件,它接收用户作为 props,而 usercontainer 则处理数据获取和状态管理。

2. 高阶组件(hoc)模式

a 高阶组件 (hoc) 是一个将组件作为参数并返回新组件的函数。 hoc 通常用于横切关注点,例如身份验证、日志记录或增强组件行为。

示例:创建 hoc 进行授权

// withauthorization.js (hoc for authorization)import react from 'react';const withauthorization = (wrappedcomponent) => {  return class extends react.component {    componentdidmount() {      if (!localstorage.getitem('authtoken')) {        // redirect to login if not authenticated        window.location.href = '/login';      }    }    render() {      return ;    }  };};export default withauthorization;
// dashboard.js (component wrapped with hoc)import react from 'react';import withauthorization from './withauthorization';const dashboard = () => 

welcome to the dashboard

;export default withauthorization(dashboard);

通过使用 withauthorization 包装 dashboard,您可以确保只有经过身份验证的用户才能访问它。

3. 渲染道具模式

render props 模式涉及使用值为函数的 prop 在组件之间共享代码。此模式对于基于特定条件或状态的动态渲染非常有用。

示例:使用渲染道具进行鼠标跟踪

// mousetracker.js (component with render props)import react, { usestate } from 'react';const mousetracker = ({ render }) => {  const [position, setposition] = usestate({ x: 0, y: 0 });  const handlemousemove = (event) => {    setposition({ x: event.clientx, y: event.clienty });  };  return 
{render(position)}
;};export default mousetracker;
// app.js (using render props)import react from 'react';import mousetracker from './mousetracker';const app = () => (   (      

mouse position: ({x}, {y})

)} />);export default app;

mousetracker 组件使用 render prop 将鼠标位置数据传递给任何组件,使其具有高度可重用性。

4. 自定义挂钩模式

自定义 hook 允许您跨多个组件封装和重用有状态逻辑。这种模式促进了代码的可重用性和清晰的关注点分离。

示例:创建用于获取数据的自定义挂钩

// usefetch.js (custom hook)import { usestate, useeffect } from 'react';const usefetch = (url) => {  const [data, setdata] = usestate(null);  const [loading, setloading] = usestate(true);  useeffect(() => {    const fetchdata = async () => {      const response = await fetch(url);      const result = await response.json();      setdata(result);      setloading(false);    };    fetchdata();  }, [url]);  return { data, loading };};export default usefetch;
// app.js (using the custom hook)import react from 'react';import usefetch from './usefetch';const app = () => {  const { data, loading } = usefetch('https://jsonplaceholder.typicode.com/posts');  if (loading) return 
loading...
; return (
    {data.map((post) => (
  • {post.title}
  • ))}
);};export default app;

usefetch 自定义钩子封装了数据获取逻辑,可以在不同组件之间复用。

5. 复合组件模式

复合组件模式允许组件一起工作来管理状态和行为。此模式对于构建复杂的 ui 组件(如选项卡、手风琴或下拉菜单)非常有用。

示例:使用复合组件构建选项卡

// tabs.js (parent component)import react, { usestate } from 'react';const tabs = ({ children }) => {  const [activeindex, setactiveindex] = usestate(0);  return react.children.map(children, (child, index) =>    react.cloneelement(child, { isactive: index === activeindex, setactiveindex, index })  );};const tab = ({ children, isactive, setactiveindex, index }) => (  );const tabpanel = ({ children, isactive }) => (isactive ? 
{children}
: null);tabs.tab = tab;tabs.tabpanel = tabpanel;export default tabs;
// app.js (using compound components)import react from 'react';import tabs from './tabs';const app = () => (      tab 1    tab 2    content for tab 1    content for tab 2  );export default app;

tabs 组件管理状态,而 tab 和 tabpanel 组件协同显示选项卡内容。

6. 受控和非受控组件模式

受控组件完全由 react 状态管理,而非受控组件则依赖 dom 来获取状态。两者都有其用途,但为了一致性和可维护性,受控组件通常是首选。

示例:受控组件与不受控组件

// controlled component (textinputcontrolled.js)import react, { usestate } from 'react';const textinputcontrolled = () => {  const [value, setvalue] = usestate('');  return (     setvalue(e.target.value)} />  );};export default textinputcontrolled;
// uncontrolled component (textinputuncontrolled.js)import react, { useref } from 'react';const textinputuncontrolled = () => {  const inputref = useref();  const handleclick = () => {    console.log(inputref.current.value);  };  return (                    

在受控组件中,react 完全控制表单状态,而在非受控组件中,状态由 dom 本身管理。

7. 钩子工厂模式

hooks 工厂模式涉及创建动态生成和管理多个状态或行为的钩子,提供灵活的方式来管理复杂逻辑。

示例:使用 hooks factory 进行动态状态管理

// usedynamicstate.js (hook factory)import { usestate } from 'react';const usedynamicstate = (initialstates) => {  const states = {};  const setters = {};  initialstates.foreach(([key, initialvalue]) => {    const [state, setstate] = usestate(initialvalue);    states[key] = state;    setters[key] = setstate;  });  return [states, setters];};export default usedynamicstate;
// App.js (Using the Hooks Factory)import React from 'react';import useDynamicState from './useDynamicState';const App = () => {  const [states, setters] = useDynamicState([    ['name', ''],    ['age', 0],  ]);  return (    
setters.name(e.target.value)} /> setters.age(parseInt(e.target.value))} />

Name: {states.name}

Age: {states.age}

);};export default App;

这个钩子工厂动态创建和管理多个状态,提供灵活性和更简洁的代码。

结论

通过利用这些设计模式,您可以创建更健壮、可扩展和可维护的 react 应用程序。这些模式可帮助您编写符合最佳实践的干净、可重用的代码,确保您的应用程序随着时间的推移更容易开发和管理。

您想更深入地研究这些模式或探索其他主题吗?

以上就是ReactJS 设计模式:编写健壮且可扩展的组件的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 13:49:47
下一篇 2025年12月15日 16:01:40

相关推荐

  • JavaScript 的新增功能:ECMAScript 版本

    tl;dr: 探索 javascript ecmascript 2024 的突破性功能。本指南探讨了旨在改变您的编码体验的最新创新。从用于轻松数据分组的新 groupby 方法到简化日期和时间管理的改变游戏规则的 temporal api,ecmascript 2024 配备了可提高效率和精度的工具…

    2025年12月19日
    000
  • 管理成功的金融科技面临的挑战:R$ 的日收入

    运营一家在短短 30 天内创收超过 960 万雷亚尔的金融科技公司面临着一系列复杂的挑战。从高级开发人员的角度来看,每一天都有可能对业务产生深远影响的决策。当使用由 NestJS、Redis、PostgreSQL 和 NextJS 组成的技术堆栈时,重点是确保系统可扩展、高性能且安全。然而,现实远远…

    2025年12月19日
    000
  • 完整的 Redux 工具包 – 异步逻辑(第 -2 部分)

    1。 redux toolkit 中的异步逻辑简介 在 redux 中处理异步逻辑通常涉及大量样板代码,例如创建操作类型、操作创建者和减速器来处理不同的状态(加载、成功、错误)。 redux toolkit 使用 createasyncthunk 简化了这一过程,它允许您以最少的设置为异步操作定义“…

    2025年12月19日
    000
  • Tom and Jerry Light code

    Hut Light Effect /* Internal CSS */ body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: #333; } …

    2025年12月19日
    000
  • 开发人员人工智能入门:揭秘基础知识部分

    开发者们大家好! 人工智能不再只是一个梦想。它就在这里并改变我们构建软件的方式。它可以使应用程序更好、更有用。但如何开始在项目中使用人工智能呢? 本系列旨在为您提供踏上人工智能开发之旅的基础知识。在第一部分中,我们将深入研究核心概念并提供使用 langchain 和 openai 的实践示例。 揭秘…

    2025年12月19日
    000
  • 使用所见即所得 HTML 编辑器简化大学内容管理

    华雷斯城自治大学 (UACJ) 是墨西哥一所备受尊敬的公立大学,最近解决了一些常见的内容管理挑战。他们的解决方案?实施 Froala,一个强大的企业级 WYSIWYG HTML 编辑器。让我们看看这个选择如何影响他们的数字工作流程。 简介 与许多大型机构一样,UACJ 正在处理不一致的格式、集成问题…

    2025年12月19日
    000
  • 推出用于 AI 搜索和 RAG 的 JS/TS SDK

    如果您在 javascript 应用程序中使用过 trieve,您可能知道您需要使用 fetch 对 trieve 进行大部分调用。虽然这种方法很好,但并不理想,我们希望为用户提供一种更简单的方法来使用我们的 api。 嗯,在幕后,我们一直致力于让 trieve 在 javascript 应用程序中…

    2025年12月19日
    000
  • 异步编程回调、Promise 和异步等待

    JavaScript 中的异步编程允许您执行 API 调用、读取文件或查询数据库等任务,而不会阻塞其他代码的执行。这在 JavaScript 中至关重要,尤其是在 Web 开发中,响应能力和性能是关键。 关键概念 1。回调: 作为参数传递给另一个函数的函数,该函数在异步操作完成后执行。 示例: 函数…

    2025年12月19日
    000
  • 加密货币 API 中实时数据对开发人员的重要性

    如果您正在开发使用加密货币数据的应用程序,您可能知道实时数据有多么重要。加密货币价格变化非常快,因此掌握最新信息至关重要。本文主要介绍为什么加密货币 API 中的实时数据如此重要以及它如何为开发人员提供帮助。为什么实时数据在加密货币 API 中很重要当您处理加密货币时,实时数据非常重要。加密货币市场…

    2025年12月19日
    000
  • JavaScript 微观性能测试、历史和局限性

    我认为性能优化对许多开发人员感兴趣,因为他们更多地了解完成任务的不同方法。一些内心的声音问道:“哪种方式最好?”虽然“最佳”指标有很多变化,例如 douglas crockford 的 2008 年 javascript:the good parts,但性能是容易获得的,因为我们可以自己测试它。 然…

    2025年12月19日
    000
  • 自定义 Babel 插件简介

    我们最新的博客是“自定义 Babel 插件简介”。 Babel 是一个工具,它允许我们编写现代 JavaScript,同时确保它可以在旧版浏览器上运行。 Babel 不是像传统编译器那样生成二进制代码,而是执行源到源的转换。 探索有关插件、预设、AST 以及如何创建您自己的自定义 Babel 插件的…

    2025年12月19日
    000
  • FiveM x TypeScript

    fivem 是 grand theft auto v 的修改版,使您能够在由 cfx.re 提供支持的定制专用服务器上玩多人游戏。 当您开发 fivem 服务器时,您可以创建资源。这些资源可以用多种语言编写:lua、c# 和 javascript。在本文中,我们将了解如何使用 typescript …

    2025年12月19日
    000
  • 高级 GraphQL 查询和突变

    介绍 graphql 是一种用于 api 开发的开源查询语言。与传统的 restful api 相比,它提供了一种更有效的从服务器获取数据的方法。凭借其先进的功能,它允许开发人员编写复杂的查询和突变,以更灵活的方式检索和操作数据。在本文中,我们将讨论高级 graphql 查询和突变的优点、缺点和特性…

    2025年12月19日
    000
  • 掌握 JavaScript 的数学对象:内置数学函数和属性的综合指南

    javascript 数学对象:概述 javascript math 对象是一个内置对象,提供数学函数和常量的集合。它不是构造函数,因此您无法创建它的实例;相反,它是通过其静态方法和属性直接使用的。 1.常数 math 对象包含几个对数学计算有用的常量: math.e:自然对数的底数,约等于 2.7…

    2025年12月19日
    000
  • 什么是打字稿?

    TypeScript 是 JavaScript 的超集,为该语言添加了可选的静态类型。它为大型 JavaScript 项目提供了更好的工具、改进的代码组织和增强的可扩展性。 TypeScript 代码最终被编译为纯 JavaScript,然后可以在任何 JavaScript 运行时环境中执行。 学习…

    2025年12月19日
    000
  • 掌握 React 中的 useImperativeHandle(使用 TypeScript)

    使用 typescript 构建 react 应用程序时,开发人员经常遇到需要创建具有高级功能的自定义、可重用组件的场景。本文将探讨两个强大的概念:用于对引用管理进行细粒度控制的 useimperativehandle 挂钩,以及创建表单验证和模态组件等自定义组件。 我们将深入探讨: useimpe…

    2025年12月19日
    000
  • JavaScript 中平滑动画的秘密!

    想要在您的网络应用程序中创建黄油般平滑的动画吗?尝试 requestanimationframe——javascript 的内置优化动画方法! requestanimationframe 不使用 settimeout 或 setinterval(这可能会因帧速率不一致而导致动画卡顿),而是将动画与浏…

    2025年12月19日
    000
  • ejs模板引擎分页CDN设置指南

    要在 ejs 模板引擎中实现分页,请按照以下步骤操作。 第 1 步:包含分页 cdn在 ejs 文件底部添加以下脚本: 第 2 步:向模板添加分页控件在您希望显示分页按钮的位置添加以下代码: Previous <% for(let i=1; i <li class="page-…

    2025年12月19日
    000
  • 日间用 JavaScript 破解数字和数学

    在今天对 javascript 的探索中,我们深入研究数字和数学运算的世界。从理解 javascript 如何自动处理数字到利用数学函数的力量,这篇文章将提高您处理数字数据的技能。 1. 理解数字 javascript 足够聪明,可以识别变量何时是数字,而无需我们显式定义它。例如: const ba…

    2025年12月19日
    000
  • JavaScript 中的五种作用域:开发人员深入探讨

    javascript 对变量的行为是由它的作用域决定的。理解范围是编写健壮、可维护的代码的基础。本文将探讨 javascript 中的五种主要作用域类型——全局、局部、块、函数作用域(和闭包)和作用域链。最后,您将清楚地掌握 javascript 如何跨不同上下文处理变量。 目录 1. 全球范围 解…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信