尽管React是世界上最受欢迎,最常用的前端框架之一,但许多开发人员在重构代码以提高可重复性时仍在挣扎。如果您曾经发现自己在整个React应用程序中都重复了相同的代码段,那么您就可以使用正确的文章。
> 在本教程中,您将向您介绍三个最常见的指标,即该建立可重复使用的反应组件了。然后,我们将继续通过构建可重复使用的布局和两个令人兴奋的React挂钩来查看一些实用的演示。>您完成阅读时,当创建可重复使用的React组件是适当的时,您将能够自己弄清楚
>>如何做到。。 🎜> >本文假定对钩子的基本知识。如果您想了解这些主题,我建议您查看“启动React”指南和“ Intorduction tor React Hooks”。> 钥匙要点
可重复使用的反应组件的前三个指标
>包装器>?>? 例如,请考虑以下登录页和注册页:
>
<span>// Login.js </span><span>import './common.css'; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
<span>// SignUp.js </span><span>import './common.css'; </span> <span>function <span>Signup</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
结果,您不再需要在多个页面中导入common.css或创建相同的
<span>// Login.js </span><span>import <span>Footer</span> from "./Footer.js"; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><Wrapper</span> main<span>={{...}}</span> footer<span>={<span><span><Footer</span> /></span>}</span> /></span> </span> <span>); </span><span>} </span>
要将事件侦听器附加到元素上,您可以在usefeft()内部处理它:
>
<span>// App.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>function <span>App</span>() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span> <span>return (...); </span><span>} </span>
>
有四种可能使用事件侦听器的情况:<span>// Button.js </span><span>function <span>Button</span>() { </span> <span>return ( </span> <span><span><span><button</span> type<span>="button"</span> onClick<span>={() => { alert('Hi!')}}</span>></span> </span><span> Click me! </span><span> <span><span></button</span>></span> </span> <span>); </span><span>}; </span>
>同一事件侦听器,同一事件处理程序
同一事件侦听器,不同的活动处理程序
然后,您可以在任何组件中使用此钩子,如下所示:
<span>// useEventListener.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>export default function useKeydown() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span><span>}; </span>
<span>// Login.js </span><span>import './common.css'; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
>在使GraphQl代码重复使用时,您实际上不需要寻找符号。对于复杂的应用程序,用于查询或突变的GraphQL脚本很容易占用30-50行代码,因为有许多属性需要请求。如果您多次或两次使用相同的GraphQl脚本,我认为它值得拥有自己的自定义钩。
考虑以下示例:
<span>// SignUp.js </span><span>import './common.css'; </span> <span>function <span>Signup</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
构建三个可重复使用的反应组件
<span>// Login.js </span><span>import <span>Footer</span> from "./Footer.js"; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><Wrapper</span> main<span>={{...}}</span> footer<span>={<span><span><Footer</span> /></span>}</span> /></span> </span> <span>); </span><span>} </span>
1。布局组件 React通常用于构建复杂的Web应用程序。这意味着需要在React中开发大量页面,我怀疑应用程序的每个页面都有不同的布局。例如,由30页组成的Web应用程序通常使用少于五个不同的布局。因此,建立一个可以在许多不同页面中使用的灵活,可重复使用的布局至关重要。这将为您节省很多代码行,并因此有大量的时间。>
考虑以下反应功能组件:这是一个典型的网页,它具有
>相反,您可以创建一个布局组件,该组件像props一样,接收
<span>// App.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>function <span>App</span>() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span> <span>return (...); </span><span>} </span>
使用此布局组件,您可以将feed页面变成更复杂的代码块:
>用于创建带有粘性元素的布局的Pro提示
<span>// Button.js </span><span>function <span>Button</span>() { </span> <span>return ( </span> <span><span><span><button</span> type<span>="button"</span> onClick<span>={() => { alert('Hi!')}}</span>></span> </span><span> Click me! </span><span> <span><span></button</span>></span> </span> <span>); </span><span>}; </span>
>
>由于布局的元素将是经过的道具的父元素,因此您希望将布局元素的样式保持尽可能简单 - 因此,通过。
这是一个示例:<span>// useEventListener.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>export default function useKeydown() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span><span>}; </span>
<span>// Login.js </span><span>import './common.css'; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
现在,让我们在供稿页面上应用一些样式,看看您已经构建了什么:
<span>// SignUp.js </span><span>import './common.css'; </span> <span>function <span>Signup</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
>
这就是桌面屏幕上的外观。
2。事件听众
>您可以看到usesCrollSaver Hook需要接收两个项目:ScrollableDiv,它必须是一个可滚动容器,就像上面布局中的
步骤1:保存滚动位置
<span>// Login.js </span><span>import <span>Footer</span> from "./Footer.js"; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><Wrapper</span> main<span>={{...}}</span> footer<span>={<span><span><Footer</span> /></span>}</span> /></span> </span> <span>); </span><span>} </span>
首先,您需要将“滚动”事件侦听器绑定到可滚动容器:
<span>// Login.js </span><span>import './common.css'; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
>用户回到网页时,应将用户直接定向到他或她以前的滚动位置 - 如果有的话。该位置数据当前保存在SessionStorage中,您需要将其取出并使用它。您可以使用GetItem(ID:String)从存储中获取数据。然后,您只需要将可滚动容器的滚动滚动式设置为此获得的值:
<span>// SignUp.js </span><span>import './common.css'; </span> <span>function <span>Signup</span>() { </span> <span>return ( </span> <span><span><span><div</span> className<span>='wrapper'</span>></span> </span><span> <span><span><main</span>></span> </span><span> {...} </span><span> <span><span></main</span>></span> </span><span> <span><span><footer</span> className<span>='footer'</span>></span> </span><span> {...} </span><span> <span><span></footer</span>></span> </span><span> <span><span></div</span>></span> </span> <span>); </span><span>} </span>
scrollsaver demo
<span>// Login.js </span><span>import <span>Footer</span> from "./Footer.js"; </span> <span>function <span>Login</span>() { </span> <span>return ( </span> <span><span><span><Wrapper</span> main<span>={{...}}</span> footer<span>={<span><span><Footer</span> /></span>}</span> /></span> </span> <span>); </span><span>} </span>
,如果您喜欢像我一样将GraphQl与React一起使用,则可以通过为GraphQl查询或突变创建React Hook进一步减少代码库。
如果从后端请求越来越多的属性,则您的GraphQL脚本将占用越来越多的空间。因此,您可以创建以下React Hook:
然后,您可以使用usegetPosts()挂钩如下:
<span>// App.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>function <span>App</span>() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span> <span>return (...); </span><span>} </span>
在本文中,您已经了解了可重复使用的反应组件的三个最常见指标和三种最受欢迎的用途案例。现在,当您可以创建可重复使用的反应组件时,您已经了解了
>的知识,并且<span>// Button.js </span><span>function <span>Button</span>() { </span> <span>return ( </span> <span><span><span><button</span> type<span>="button"</span> onClick<span>={() => { alert('Hi!')}}</span>></span> </span><span> Click me! </span><span> <span><span></button</span>></span> </span> <span>); </span><span>}; </span>
>
<span>// useEventListener.js </span><span>import <span>{ useEffect }</span> from 'react'; </span> <span>export default function useKeydown() { </span> <span>const handleKeydown = () => { </span> <span>alert('key is pressed.'); </span> <span>} </span> <span>useEffect(() => { </span> <span>document.addEventListener('keydown', handleKeydown); </span> <span>return () => { </span> <span>document.removeEventListener('keydown', handleKeydown); </span> <span>} </span> <span>}, []); </span><span>}; </span>
可重用性不仅节省了时间和精力,而且还简化了测试过程。隔离和封装的组件更易于测试,您可以创建单元测试以验证其正确性和功能。通过将可重复使用的组件纳入您的反应应用程序,您可以建立可维护,模块化和一致的代码库,最终提高开发效率并提高用户界面的整体质量。
>从'react''; 在此新组件文件中,您定义了组件的行为和渲染逻辑。组件可以根据您的需求而具有功能性或基于班级的功能。在参数化组件时,您将道具接受为输入,这使您可以自定义其外观和行为。使用Proptypes或Typescript定义道具类型可确保类型的安全性和清晰度,从而更容易理解应如何使用组件。构建组件后,就可以在应用程序的其他部分中使用。您可以导入并合并它,并通过特定的道具为每个用例配置其行为。 模块化是另一个关键属性。良好的可重复使用的组件应该具有单一的目的,重点是特定功能或特定的UI元素。这种模块化设计增强了代码可维护性和调试效率。此外,易于测试至关重要。
const button =({label,onclick,style})=> { 🎜>
);
};在此示例中,
>
导出默认按钮;
在此示例中,按钮组件被构造为功能组件,该功能组件采用三个关键道具:用于按钮上显示的文本的“标签”,“ onclick”,for for for。点击事件处理程序和可选的“样式”道具,用于自定义按钮的外观。该组件封装了按钮的HTML结构和行为,使其在整个应用程序中都可以轻松地重复使用,而无需重复代码。
>使用此按钮组件的用法显示其可重复使用性和灵活性。在父组件(在这种情况下为“应用程序”)中,您可以传递特定标签文本,单击事件处理功能和样式偏好,以创建具有不同目的和外观的不同按钮。通过使用此类可重复使用的组件,您可以维护统一的用户界面样式并提高代码可维护性。这些组件可以扩展到按钮之外,以包含更复杂的UI元素,例如输入字段,卡片或导航栏,从而产生模块化和可维护的React应用程序。可重复使用的组件不仅会加快开发的速度,而且会导致更加一致,用户友好的界面,该界面遵循设计指南和最佳实践。如何在React中创建可重复使用的组件?
在React.js中创建可重复使用的组件是构建模块化和可维护应用程序的基础实践。该过程从一个明确的计划开始,您可以在其中确定要封装在组件中的特定功能或用户界面(UI)元素。定义组件的目的后,您将在React项目中创建一个新的JavaScript/JSX文件。这是一个很好的做法,可以用大写字母开始命名文件,并遵守React的命名惯例。
结果是一个更有条理的代码库,可鼓励代码可重复使用并保持一致的UI样式。可重复使用的组件可以轻松地集成到应用程序的不同部分,提高开发效率,并为用户友好和视觉上一致的用户界面做出贡献。REACT中可重复使用的组件的好处是什么?
React中可重复使用的组件可重复使用的组件提供了许多好处,可显着增强开发过程和应用质量。它们通过将复杂的用户界面分解为较小的,独立的构件来促进模块化,从而使代码库更有条理和可维护。这些组件侧重于特定功能或UI元素,使开发人员能够独立管理和更新它们,从而降低了意外副作用的风险并简化了开发过程。
是什么使React中的可重复使用的组件?
反应中精心设计的可重复使用的成分表现出多种关键特征。首先,可重复使用性是核心属性。这些组件应以在应用程序的不同部分甚至在单独的项目中使用。为了实现这一目标,必须高度参数化,使开发人员可以通过道具自定义其外观和行为。这种多功能性是使组件真正可重复使用的基本方面。
封装同样重要。可重复使用的组件应封装其内部逻辑和渲染,从而将实现详细信息从应用程序的其余部分中屏蔽。这种关注点的分离导致更清洁,更模块化的代码并简化集成。
最终,这些组件应保持清晰的API,指定他们接受的道具及其预期目的。这种清晰度可帮助其他开发人员了解如何有效使用组件。当将相同的组件用于特定的UI元素时,通过一致的用户界面做出贡献,它们可以确保具有凝聚力和用户友好的应用程序。从本质上讲,一个良好的可重复使用组件是可重新配置的,封装的,模块化的,易于测试的,并有助于代码可维护性和UI一致性。
>
以上是创建可重复使用的反应组件的实用指南的详细内容。更多信息请关注PHP中文网其他相关文章!