首页 > 其他分享 >ReactJS 设计模式:编写健壮且可扩展的组件

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

时间:2024-09-21 15:47:36浏览次数:1  
标签:gt const ReactJS react export 组件 import 设计模式

reactjs 中的设计模式为应用程序开发中的常见问题提供了标准化且经过验证的解决方案。使用这些模式不仅使您的代码更具可读性和可维护性,而且还增强了其可扩展性和健壮性。让我们深入研究一些最流行的 reactjs 设计模式,并通过示例来说明它们的用法。 1. 容器和表示组件模式容器和展示模式将组件分为两类:展示组件:关注事物的外观(ui)。容器组件:关注事物如何工作(逻辑和状态管理)。这种分离可以实现更好的可重用性、更容易的测试和更清晰的代码。示例:展示和容器组件// presentational component: displaying user list (userlist.js)import react from 'react';const userlist = ({ users }) =&gt; ( 登录后复制 {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 = () =&gt; { const [users, setusers] = usestate([]); useeffect(() =&gt; { const fetchusers = async () =&gt; { const response = await fetch('https://jsonplaceholder.typicode.com/users'); const data = await response.json(); setusers(data); }; fetchusers(); }, []); return <userlist users="{users}"></userlist>;};export default usercontainer;登录后复制这里,userlist 是一个展示组件,它接收用户作为 props,而 usercontainer 则处理数据获取和状态管理。 2. 高阶组件(hoc)模式a 高阶组件 (hoc) 是一个将组件作为参数并返回新组件的函数。 hoc 通常用于横切关注点,例如身份验证、日志记录或增强组件行为。示例:创建 hoc 进行授权// withauthorization.js (hoc for authorization)import react from 'react';const withauthorization = (wrappedcomponent) =&gt; { return class extends react.component { componentdidmount() { if (!localstorage.getitem('authtoken')) { // redirect to login if not authenticated window.location.href = '/login'; } } render() { return <wrappedcomponent></wrappedcomponent>; } };};export default withauthorization;登录后复制// dashboard.js (component wrapped with hoc)import react from 'react';import withauthorization from './withauthorization';const dashboard = () =&gt; <h1>welcome to the dashboard</h1>;export default withauthorization(dashboard);登录后复制通过使用 withauthorization 包装 dashboard,您可以确保只有经过身份验证的用户才能访问它。 3. 渲染道具模式render props 模式涉及使用值为函数的 prop 在组件之间共享代码。此模式对于基于特定条件或状态的动态渲染非常有用。示例:使用渲染道具进行鼠标跟踪// mousetracker.js (component with render props)import react, { usestate } from 'react';const mousetracker = ({ render }) =&gt; { const [position, setposition] = usestate({ x: 0, y: 0 }); const handlemousemove = (event) =&gt; { setposition({ x: event.clientx, y: event.clienty }); }; return <div onm ousemove="{handlemousemove}">{render(position)}</div>;};export default mousetracker;登录后复制// app.js (using render props)import react from 'react';import mousetracker from './mousetracker';const app = () =&gt; ( <mousetracker render="{({" x y> ( <h1> mouse position: ({x}, {y}) </h1> )} /&gt;);export default app;</mousetracker>登录后复制mousetracker 组件使用 render prop 将鼠标位置数据传递给任何组件,使其具有高度可重用性。 4. 自定义挂钩模式自定义 hook 允许您跨多个组件封装和重用有状态逻辑。这种模式促进了代码的可重用性和清晰的关注点分离。示例:创建用于获取数据的自定义挂钩// usefetch.js (custom hook)import { usestate, useeffect } from 'react';const usefetch = (url) =&gt; { const [data, setdata] = usestate(null); const [loading, setloading] = usestate(true); useeffect(() =&gt; { const fetchdata = async () =&gt; { 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 = () =&gt; { const { data, loading } = usefetch('https://jsonplaceholder.typicode.com/posts'); if (loading) return <div>loading...</div>; return ( 登录后复制 {data.map((post) => ( {post.title} ))} );};export default app;usefetch 自定义钩子封装了数据获取逻辑,可以在不同组件之间复用。 5. 复合组件模式复合组件模式允许组件一起工作来管理状态和行为。此模式对于构建复杂的 ui 组件(如选项卡、手风琴或下拉菜单)非常有用。示例:使用复合组件构建选项卡// tabs.js (parent component)import react, { usestate } from 'react';const tabs = ({ children }) =&gt; { const [activeindex, setactiveindex] = usestate(0); return react.children.map(children, (child, index) =&gt; react.cloneelement(child, { isactive: index === activeindex, setactiveindex, index }) );};const tab = ({ children, isactive, setactiveindex, index }) =&gt; ( <button onclick="{()"> setactiveindex(index)}&gt;{children}</button>);const tabpanel = ({ children, isactive }) =&gt; (isactive ? <div>{children}</div> : 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 = () =&gt; ( <tabs><tabs.tab>tab 1</tabs.tab><tabs.tab>tab 2</tabs.tab><tabs.tabpanel>content for tab 1</tabs.tabpanel><tabs.tabpanel>content for tab 2</tabs.tabpanel></tabs>);export default app;登录后复制tabs 组件管理状态,而 tab 和 tabpanel 组件协同显示选项卡内容。 6. 受控和非受控组件模式受控组件完全由 react 状态管理,而非受控组件则依赖 dom 来获取状态。两者都有其用途,但为了一致性和可维护性,受控组件通常是首选。示例:受控组件与不受控组件// controlled component (textinputcontrolled.js)import react, { usestate } from 'react';const textinputcontrolled = () =&gt; { const [value, setvalue] = usestate(''); return ( <input type="text" value="{value}" onchange="{(e)"> setvalue(e.target.value)} /&gt; );};export default textinputcontrolled;登录后复制// uncontrolled component (textinputuncontrolled.js)import react, { useref } from 'react';const textinputuncontrolled = () =&gt; { const inputref = useref(); const handleclick = () =&gt; { console.log(inputref.current.value); }; return ( <input type="text" ref="{inputref}"><button onclick="{handleclick}">log input value</button> &gt; );};export default textinputuncontrolled;登录后复制在受控组件中,react 完全控制表单状态,而在非受控组件中,状态由 dom 本身管理。 7. 钩子工厂模式hooks 工厂模式涉及创建动态生成和管理多个状态或行为的钩子,提供灵活的方式来管理复杂逻辑。示例:使用 hooks factory 进行动态状态管理// usedynamicstate.js (hook factory)import { usestate } from 'react';const usedynamicstate = (initialstates) =&gt; { const states = {}; const setters = {}; initialstates.foreach(([key, initialvalue]) =&gt; { 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 = () =&gt; { const [states, setters] = useDynamicState([ ['name', ''], ['age', 0], ]); return ( <div> <input type="text" value="{states.name}" onchange="{(e)"> setters.name(e.target.value)} /&gt; <input type="number" value="{states.age}" onchange="{(e)"> setters.age(parseInt(e.target.value))} /&gt; <p>Name: {states.name}</p> <p>Age: {states.age}</p> </div> );};export default App;登录后复制这个钩子工厂动态创建和管理多个状态,提供灵活性和更简洁的代码。 结论通过利用这些设计模式,您可以创建更健壮、可扩展和可维护的 react 应用程序。这些模式可帮助您编写符合最佳实践的干净、可重用的代码,确保您的应用程序随着时间的推移更容易开发和管理。您想更深入地研究这些模式或探索其他主题吗? 以上就是ReactJS 设计模式:编写健壮且可扩展的组件的详细内容,更多请关注我的其它相关文章!

标签:gt,const,ReactJS,react,export,组件,import,设计模式
From: https://www.cnblogs.com/aow054/p/18424101

相关文章

  • ReactJS + Stripe:试用期天数未按预期工作
    :试用期天数未按预期工作一、问题描述(一)预期的试用期天数该应用程序使用ReactJS和Stripe进行支付处理。试用期天数应设置为14天,但实际试用期天数并未按预期工作。用户在注册后,试用期仅持续了7天,而不是预期的14天。这导致用户在试用期结束前就被要求支付订阅费用,给用户带来......
  • Nextjs 中的客户端与服务器组件
    在此版本的next.js中,我们将探讨什么是客户端和服务器组件、它们的差异、何时使用每个组件,并提供实际示例来帮助您在项目中实现它们。next.js中的客户端和服务器组件是什么?在next.js中,客户端组件和服务器组件之间有明显的区别。这种分离使您能够更好地决定在何处以及......
  • 常见的设计模式
    单例模式(饿汉和懒汉)//饿汉式单例模式includeusingnamespacestd;classson{public:son(constson&)=delete;son&operator=(constson&)=delete;son(constson&&)=delete;son&operator=(constson&&)=delete;staticson&getinsta......
  • Js电子表格组件
    我经常使用的一件事是我们用来组织数据的Excel表格。Jspreadsheet执行的操作非常相似,但直接在浏览器中执行。您无需安装任何东西,只需打开并使用它即可。它非常适合任何需要以简单实用的方式组织信息的人。简单易用:如果您曾经使用过Excel,您将会有宾至如归的感觉。界面非常相似......
  • 浅谈在C#中调用COM组件——以文件夹选择器为例
    浅谈在C#中调用COM组件——以文件夹选择器为例【文/张赐荣】在现如今的这个时代,提到跨语言调用或者系统级操作,许多开发者第一时间会想到.NET、WebAPI等现代技术。然而,不得不说,COM组件这门技术可能在许多年轻开发者的学习清单中早已被“扫进角落”了。毕竟现如今.NET、WebAPI......
  • 23种设计模式,纯简单理解,面试必备
    文章目录创建型设计模式1.单例设计模2.工厂设计模式3.抽象工厂设计模式4.建造者设计模式5.原型设计模式结构型设计模式1.适配器设计模式2.桥接设计模式3.组合设计模式4.装饰器设计模式5.外观设计模式6.享元设计模式7.代理设计模式行为型设计模式1.访问者设计模式2.模板......
  • 组件封装有哪些注意事项—面试常问优美回答
    组件封装有哪些注意事项—面试常问优美回答关键点及回答建议与代码案例组件设计原则关键点:高内聚低耦合、接口清晰、职责单一。回答建议:“在设计组件时,我遵循高内聚低耦合的原则,确保组件内部逻辑紧密相关,同时减少与其他组件的直接依赖。”“我注重定义清晰的接口,使得......
  • 抽象工厂模式-设计模式
    抽象工厂模式(AbstractFactoryPattern)在Java中是一种非常有用的设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这个模式提供了一种创建对象的最佳方式,它封装了创建对象的细节,并允许客户依赖于抽象类型而不是具体类型。以下是一个简单的Java案例,展示了抽象工......
  • 2024-09-20 如何去除vue前端框架upload组件中的缓存 ==》v-if+setTimeout
    在很多前端框架中的upload组件,比如arco-design的a-upload组件,在遍历渲染过程中会发现上传完成后,切换到另一个a-upload组件,它的图片会显示上一个a-upload组件的缓存 正常上传,然后点击红色,红色对应的图片应该被清空,实际上却并没有,如下解决方案:给a-upload组件加一个条件判断v-if......
  • useImperativeHandle, forwardRef ,使方法和属性应暴露给父组件
    useImperativeHandle是React中的一个Hook,用于自定义组件的实例值。它通常与forwardRef一起使用,允许你在父组件中通过引用(ref)访问子组件的特定实例方法或属性。以下是对useImperativeHandle的详细解析。1、语法importReact,{useImperativeHandle,forwardRef......