Function Components در مقابل Class Components در React – با مثال
در React دو راه اصلی برای ایجاد کامپوننت وجود دارد: اجزای تابع و کلاس. هر کدام سینتکس و موارد استفاده خاص خود را دارند، اگرچه با معرفی React Hooks، فاصله بین آنها به میزان قابل توجهی کاهش یافته است. اما انتخاب انواع اجزای مناسب هنوز برای ساخت برنامههای React کارآمد و قابل نگهداری بسیار حیاتی است.
در این مقاله، تفاوتهای اساسی بین اجزای تابع و کلاس را تحلیل میکنیم و درک روشنی از نقاط قوت و موارد استفاده ایدهآل ارائه میکنیم.
با درک این مفاهیم، توسعهدهندگان میتوانند هنگام ساخت اجزای React تصمیمات آگاهانه بگیرند و در نهایت ساختار و عملکرد برنامههای کاربردی وب خود را بهبود بخشند.
React Components چیست؟
در React، کامپوننت ها بلوک های سازنده یک رابط کاربری هستند. آنها تکه های کد قابل استفاده مجدد و مستقلی هستند که بخشی از رابط کاربری را نشان می دهند. React به شما این امکان را می دهد که رابط کاربری خود را به اجزای کوچکتر تقسیم کنید، که مدیریت و حفظ پایگاه کد خود را آسان تر می کند.
شما می توانید اجزا را به عنوان عناصر HTML سفارشی در نظر بگیرید که منطق و ساختار UI خود را در بر می گیرند. آنها میتوانند ورودیهایی به نام props (مخفف ویژگیها) را بپذیرند و عناصر React را که توضیح میدهند چه چیزی روی صفحه نمایش داده میشود، برگردانند.
دو نوع کامپوننت اصلی در React وجود دارد:
Function Components: اینها توابع ساده جاوا اسکریپت هستند که props را به عنوان ورودی دریافت کرده و عناصر JSX را برمی گرداند. آنها اغلب برای اجزای نمایشی یا بدون حالت استفاده می شوند.
Class Components: اینها کلاسهای ES6 هستند که از React.Component
یا React.PureComponent
گسترش مییابند. آنها یک متد render()
دارند که در آن شما ساختار رابط کاربری مؤلفه خود را با استفاده از JSX تعریف می کنید. کامپوننت های کلاس برای کامپوننت هایی که نیاز به مدیریت حالت دارند یا متدهای چرخه حیات دارند استفاده می شود.
با معرفی React Hooks، اجزای تابع توانایی مدیریت حالت و استفاده از متدهای چرخه حیات را به دست آوردند و تمایز بین اجزای تابع و کلاس را محو کردند. با این حال، هر دو نوع مؤلفه هنوز به طور گسترده در برنامه های React استفاده می شوند.
عملکرد در مقابل اجزای کلاس: مروری بر سطح بالا
اجزای تابع
نحو: اجزای تابع با استفاده از کلمه کلیدی function
یا نحو تابع فلش تعریف می شوند.
import React from 'react'; // Function component using function keyword function FunctionComponent(props) { return ( <div> <h1>Hello, {props.name}!</h1> <p>This is a function component.</p> </div> ); } // Function component using arrow function syntax const FunctionComponent = (props) => { return ( <div> <h1>Hello, {props.name}!</h1> <p>This is a function component.</p> </div> ); }; export default FunctionComponent;
در قطعه کد بالا، هر دو مثال یک مؤلفه تابع به نام FunctionComponent
را تعریف می کنند که props
به عنوان ورودی می گیرد و عناصر JSX را برمی گرداند. کامپوننت به سادگی یک پیام تبریک همراه با مقداری متن ارائه می کند.
مثال اول از کلمه کلیدی function
برای تعریف مولفه تابع استفاده می کند، در حالی که مثال دوم از نحو تابع فلش استفاده می کند. هر دو نحو معتبر هستند و به یک نتیجه می رسند.
مدیریت دولتی: به طور سنتی، اجزای تابع بدون حالت بودند و نمی توانستند حالت خود را حفظ کنند. با این حال، با معرفی React Hooks (مانند useState
)، اجزای تابع اکنون می توانند وضعیت را با استفاده از Hooks مدیریت کنند.
import React, { useState } from 'react'; const FunctionComponent = () => { // Using useState Hook to manage state const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; export default FunctionComponent;
در این مثال، ما از useState
Hook برای count
متغیر حالت با مقدار اولیه 0
استفاده می کنیم. useState
Hook یک آرایه را با دو عنصر برمیگرداند: مقدار وضعیت فعلی ( count
) و یک تابع ( setCount
) برای بهروزرسانی وضعیت.
وقتی روی دکمه کلیک میشود، setCount
با مقدار جدید count
فراخوانی میشود و با نمایش مقدار وضعیت بهروز شده، یک رندر مجدد را آغاز میکند. این نشان می دهد که چگونه اجزای تابع اکنون می توانند وضعیت خود را با استفاده از React Hooks حفظ و مدیریت کنند و آنها را قدرتمندتر و همه کاره تر می کند.
روشهای چرخه حیات: اجزای تابع، روشهای چرخه عمر ندارند. با این حال، با React Hooks، میتوانید از useEffect
Hook برای تکرار رفتار چرخه زندگی (مانند componentDidMount
، componentDidUpdate
، componentWillUnmount
و غیره) استفاده کنید.
بیایید برخی از متداول ترین روش های چرخه عمر را مورد بحث قرار دهیم:
componentDidMount: این متد بلافاصله پس از نصب کامپوننت (یعنی در درخت DOM) فراخوانی می شود. معمولاً برای انجام تنظیمات اولیه، مانند واکشی دادهها از یک API یا راهاندازی شنوندگان رویداد استفاده میشود.
componentDidUpdate: این روش بلافاصله پس از بروز رسانی فراخوانی می شود. هر زمان که ویژگی یا وضعیت مولفه تغییر کند فعال می شود. معمولاً برای انجام اقدامات بر اساس وضعیت بهروز شده یا ویژگیها، مانند برقراری تماسهای API اضافی استفاده میشود.
componentWillUnmount: این متد بلافاصله قبل از اینکه کامپوننت خارج و از بین برود فراخوانی می شود. معمولاً برای انجام پاکسازی، مانند حذف شنوندگان رویداد یا لغو هر کار در حال انجام، استفاده می شود.
import React, { useState, useEffect } from 'react'; const FunctionComponent = () => { const [count, setCount] = useState(0); // useEffect Hook to replicate componentDidMount and componentDidUpdate useEffect(() => { // This code block runs after every render console.log("Component did mount or update"); // Clean-up function (replicating componentWillUnmount) return () => { console.log("Component will unmount"); }; }); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }; export default FunctionComponent;
در این مثال useEffect
Hook بدون آرایه وابستگی استفاده شده است. این بدان معناست که افکت پس از هر رندر اجرا می شود و به طور موثر هر دو رفتار componentDidMount
و componentDidUpdate
را تکرار می کند. در داخل افکت، میتوانید با بازگرداندن یک عملکرد پاکسازی، هرگونه پاکسازی لازم، مانند لغو اشتراک از اشتراکها یا حذف شنوندگان رویداد را انجام دهید. این تابع پاکسازی زمانی که کامپوننت جدا می شود اجرا می شود و به طور موثر رفتار componentWillUnmount
را تکرار می کند.
با استفاده از useEffect
Hook، اجزای تابع اکنون می توانند به همان رفتار چرخه عمر اجزای کلاس دست یابند و تمایز بین دو نوع مؤلفه را بیشتر محو می کنند.
خوانایی: اجزای تابع عموماً مختصرتر و راحتتر خوانده میشوند، به خصوص برای اجزای سادهتر.
اجزای کلاس
نحو: اجزای کلاس کلاس های ES6 هستند که از React.Component
یا React.PureComponent
گسترش می یابند. آنها یک متد render()
دارند که در آن شما ساختار رابط کاربری مؤلفه خود را با استفاده از JSX تعریف می کنید.
import React, { Component } from 'react'; // Define a class component that extends React.Component or React.PureComponent class ClassComponent extends Component { // Define constructor if necessary constructor(props) { super(props); // Initialize state if needed this.state = { count: 0 }; } // Define lifecycle methods if necessary componentDidMount() { // Code to run after the component is mounted } // Define instance methods if necessary handleClick = () => { // Update state or perform other logic this.setState({ count: this.state.count + 1 }); } // Define render() method to return JSX render() { return ( <div> <p>Count: {this.state.count}</p> <button onClick={this.handleClick}>Increment</button> </div> ); } } export default ClassComponent;
در این مثال:
ما React
و Component
از بسته "react" وارد کردیم.
ما یک جزء کلاس به نام ClassComponent
تعریف کردیم که Component
گسترش می دهد.
در داخل کامپوننت کلاس، میتوانیم سازندهای تعریف کنیم تا در صورت لزوم، کنترلکنندههای حالت را مقداردهی اولیه یا اتصال دهند.
ما میتوانیم روشهای چرخه حیات مانند componentDidMount
، componentDidUpdate
و غیره را تعریف کنیم تا به مراحل مختلف چرخه حیات کامپوننت متصل شویم.
ما متد render()
را تعریف کردیم که JSX را برای توصیف ساختار رابط کاربری مؤلفه برمی گرداند.
هر روش نمونه، کنترل کننده رویداد یا منطق دیگر را می توان در کلاس تعریف کرد.
مدیریت حالت: اجزای کلاس می توانند حالت محلی را با استفاده از ویژگی this.state
نگه دارند و مدیریت کنند. آنها همچنین می توانند با استفاده از this.setState()
وضعیت را به روز کنند.
بیایید این موضوع را با یک مثال ساده توضیح دهیم:
import React, { Component } from 'react'; class ClassComponent extends Component { constructor(props) { super(props); // Initialize state this.state = { count: 0 }; } // Define a method to update state incrementCount = () => { // Use this.setState() to update state this.setState({ count: this.state.count + 1 }); } render() { return ( <div> <p>Count: {this.state.count}</p> <button onClick={this.incrementCount}>Increment</button> </div> ); } } export default ClassComponent;
در این مثال:
ما با استفاده از this.state
حالت جزء را در سازنده مقداردهی کردیم.
متد incrementCount
در کلاس برای بهروزرسانی وضعیت count
تعریف شد. در داخل این متد، this.setState()
را فراخوانی کردیم و یک شی حاوی وضعیت جدید یا تابعی که حالت جدید را برمی گرداند ارسال کردیم. React حالت جدید را با حالت موجود ادغام می کند.
در متد render()
با استفاده از this.state.count
به حالت count
دسترسی پیدا کردیم و آن را در JSX نمایش دادیم.
هنگامی که روی دکمه کلیک می شود، متد incrementCount
فراخوانی می شود که وضعیت count
را به روز می کند و باعث رندر مجدد مولفه می شود.
این نشان میدهد که چگونه مؤلفههای کلاس در React میتوانند وضعیت محلی را مدیریت کرده و با استفاده از this.setState()
آن را بهروزرسانی کنند.
روشهای چرخه حیات: مؤلفههای کلاس به روشهای چرخه حیات مختلفی مانند componentDidMount
، componentDidUpdate
و componentWillUnmount
دسترسی دارند، که به شما امکان میدهد به مراحل مختلف چرخه حیات یک مؤلفه متصل شوید.
در اینجا مثالی برای نشان دادن استفاده از این متدهای چرخه حیات در یک جزء کلاس آورده شده است:
import React, { Component } from 'react'; class ClassComponent extends Component { constructor(props) { super(props); this.state = { data: null }; } componentDidMount() { // Fetch initial data when the component mounts this.fetchData(); } componentDidUpdate(prevProps, prevState) { // Check if the data has changed if (prevState.data !== this.state.data) { // Data has changed, perform additional actions console.log('Data has been updated:', this.state.data); } } componentWillUnmount() { // Cleanup tasks before the component is unmounted console.log('Component will unmount'); // For example, remove event listeners, cancel ongoing tasks, etc. } fetchData() { // Simulate fetching data from an API setTimeout(() => { this.setState({ data: 'Some data fetched from API' }); }, 1000); } render() { return ( <div> <p>Data: {this.state.data}</p> </div> ); } } export default ClassComponent;
در این مثال:
componentDidMount
برای واکشی داده های اولیه هنگام نصب کامپوننت استفاده می شود.
هر زمان که وضعیت داده تغییر کند componentDidUpdate
برای ثبت پیام استفاده می شود.
componentWillUnmount
برای ثبت یک پیام قبل از جداسازی کامپوننت استفاده می شود.
این روشهای چرخه عمر، قلابهایی را در مراحل مختلف چرخه عمر یک جزء فراهم میکنند و به شما امکان میدهند تا در صورت نیاز، کارهای راهاندازی، بهروزرسانی و پاکسازی را انجام دهید.
روشهای نمونه: میتوانید متدهای سفارشی را مستقیماً در کلاس تعریف کنید، که میتواند برای سازماندهی منطق مؤلفه شما مفید باشد.
import React, { Component } from 'react'; class ClassComponent extends Component { constructor(props) { super(props); this.state = { count: 0 }; } // Custom method to handle incrementing count handleIncrement = () => { this.setState({ count: this.state.count + 1 }); } // Custom method to handle decrementing count handleDecrement = () => { this.setState({ count: this.state.count - 1 }); } render() { return ( <div> <p>Count: {this.state.count}</p> <button onClick={this.handleIncrement}>Increment</button> <button onClick={this.handleDecrement}>Decrement</button> </div> ); } } export default ClassComponent;
در این مثال:
ما دو روش نمونه سفارشی handleIncrement
و handleDecrement
را در جزء کلاس تعریف کردیم. این روشها با استفاده از دستور تابع پیکان تعریف شدهاند تا اطمینان حاصل شود که آنها به this
زمینه درست دسترسی دارند.
متد handleIncrement
وضعیت count
را با افزایش 1 در هنگام فراخوانی به روز می کند.
متد handleDecrement
وضعیت count
را با کاهش 1 در هنگام فراخوانی به روز می کند.
سپس این روشهای سفارشی بهعنوان کنترلکننده رویداد برای دکمههای JSX که با روش render
برگردانده شدهاند، استفاده میشوند.
تعریف متدهای نمونه سفارشی در اجزای کلاس به سازماندهی منطق کامپوننت کمک می کند و آن را خواناتر و قابل نگهداری تر می کند. علاوه بر این، این روشها میتوانند مجدداً در بخشهای مختلف مؤلفه مورد استفاده قرار گیرند و قابلیت استفاده مجدد کد را افزایش دهند.
توجه به این نکته ضروری است که با معرفی React Hooks، بسیاری از وظایف که به طور سنتی توسط مؤلفه های کلاس انجام می شد اکنون با استفاده از مؤلفه های تابع قابل انجام است.
قلابهایی مانند useState
، useEffect
، useContext
و موارد دیگر، راه سادهتر و مختصرتری را برای مدیریت وضعیت، مدیریت عوارض جانبی و اشتراکگذاری منطق در بین اجزا ارائه میدهند. این تغییر به سمت Hooks به توسعه دهندگان این امکان را می دهد که کدهای عملکردی و ماژولار بیشتری بنویسند و وابستگی به اجزای کلاس را کاهش دهند.
در حالی که اجزای کلاس هنوز جایگاه خود را دارند، به خصوص در پایگاه های کد قدیمی، تطبیق پذیری و انعطاف پذیری Hooks، اجزای تابع را به انتخاب ارجح برای ساخت برنامه های مدرن React تبدیل می کند.
مزایای کامپوننت تابع
نحو ساده تر: اجزای تابع در مقایسه با اجزای کلاس، نحو ساده تری دارند. آنها اساساً فقط توابع جاوا اسکریپت هستند که props را به عنوان ورودی می گیرند و عناصر React را برمی گردانند. این سادگی خواندن و درک آنها را به خصوص برای مبتدیان آسان تر می کند.
توابع خالص: اجزای تابع اساساً توابع خالص هستند، به این معنی که برای تولید خروجی (UI) فقط به ورودی (props) خود وابسته هستند. آنها حالت داخلی یا عوارض جانبی ندارند، که باعث می شود استدلال و آزمایش آنها آسان تر شود. این خلوص همچنین به بهبود عملکرد کمک می کند، زیرا React می تواند فرآیند رندر را به طور موثرتری بهینه کند.
قابلیت استفاده مجدد: اجزای تابع قابلیت استفاده مجدد را با کپسوله کردن منطق UI در توابع کوچک و قابل ترکیب ارتقاء می دهند. از آنجایی که آنها فقط توابع جاوا اسکریپت هستند، می توان آنها را به راحتی در چندین بخش از برنامه شما مجددا استفاده کرد که منجر به کدهای ماژولارتر و قابل نگهداری تر می شود.
استفاده از Props در کامپوننت های تابع: اجزای تابع به طور گسترده ای از props برای انتقال داده ها از مولفه های والد به فرزند استفاده می کنند. این رویکرد مبتنی بر props یک جریان داده واضح و قابل پیش بینی را در برنامه شما ترویج می کند و درک نحوه ارسال و استفاده از داده ها در سلسله مراتب اجزای شما را آسان تر می کند.
مزایای اجزای کلاس
مدیریت وضعیت صریح: مؤلفههای کلاس روشی واضح و صریح برای مدیریت وضعیت مؤلفه با استفاده از ویژگی this.state
ارائه میکنند. این به توسعه دهندگان اجازه می دهد تا کنترل دقیقی بر مدیریت وضعیت و به روز رسانی های درون کامپوننت داشته باشند.
روشهای چرخه حیات: اجزای کلاس به طیف وسیعی از روشهای چرخه حیات مانند componentDidMount
، componentDidUpdate
و componentWillUnmount
دسترسی دارند. این روشها به توسعهدهندگان اجازه میدهد تا به مراحل مختلف چرخه عمر مؤلفه متصل شوند و کارهایی مانند واکشی دادهها، اشتراک رویدادها و عملیات پاکسازی را ممکن میسازند.
روشهای نمونه: مؤلفههای کلاس به شما امکان میدهند تا متدهای نمونه سفارشی را مستقیماً در کلاس تعریف کنید. این روشها منطق مؤلفه را در بر میگیرند و میتوانند مجدداً در سراسر مؤلفه مورد استفاده قرار گیرند. این به سازماندهی و ساختاردهی پایگاه کد مؤلفه کمک می کند.
پشتیبانی Legacy: کامپوننتهای کلاس بخش اصلی React از روزهای اولیه آن بوده و هنوز به طور گسترده در بسیاری از پایگاههای کد استفاده میشوند. آنها سازگاری و پشتیبانی از پروژه های قدیمی را ارائه می دهند که ممکن است برای استفاده از اجزای عملکرد با Hooks به روز نشده باشند.
استحکام: اجزای کلاس ساختار دقیقتری و تفکیک نگرانیها را اعمال میکنند، که میتواند منجر به پایگاههای کد قویتر و قابل نگهداریتر شود، بهویژه در برنامههای بزرگتر با منطق UI پیچیده.
بهینه سازی عملکرد: اجزای کلاس با استفاده از PureComponent
یا پیاده سازی دستی shouldComponentUpdate (روش چرخه حیات در React) فرصت های بهینه سازی را ارائه می دهند. این بهینه سازی ها می توانند به جلوگیری از رندرهای غیر ضروری و بهبود عملکرد در سناریوهای خاص کمک کنند.
نحوه کنترل وضعیت پیچیده و عوارض جانبی (قبل از قلاب)
قبل از معرفی React Hooks، کامپوننتهای کلاس راه اصلی مدیریت وضعیت پیچیده و عوارض جانبی در برنامههای React بودند. در اینجا آمده است که چگونه مؤلفه های کلاس این کار را تسهیل کردند:
مدیریت حالت: اجزای کلاس مکانیزم داخلی را برای مدیریت وضعیت مؤلفه با استفاده از ویژگی this.state
ارائه کردند. توسعه دهندگان می توانند حالت را در سازنده مقداردهی کنند و با استفاده از متد this.setState()
به روز کنند. این امکان مدیریت ساختارهای حالت پیچیده و همگام سازی حالت با رابط کاربری را فراهم کرد.
روشهای چرخه حیات: کامپوننتهای کلاس طیفی از روشهای چرخه حیات را ارائه میدهند که به توسعهدهندگان اجازه میداد تا به مراحل مختلف چرخه حیات یک جزء متصل شوند. این روشهای چرخه حیات، مانند componentDidMount
، componentDidUpdate
، و componentWillUnmount
، فرصتهایی را برای انجام کارهایی مانند واکشی داده، دستکاری DOM یا عملیات پاکسازی فراهم میکنند.
روشهای نمونه: مؤلفههای کلاس به توسعهدهندگان اجازه میدهد تا روشهای نمونه سفارشی را مستقیماً در کلاس تعریف کنند. این روشها منطق مؤلفه را محصور میکردند و امکان سازماندهی و ساختار بهتر پایگاه کد مؤلفه را فراهم میکردند. روشهای نمونه میتوانند منطق پیچیده، مدیریت رویداد یا تعامل با APIهای خارجی را مدیریت کنند.
اجزای مرتبه بالاتر (HOCs) و Render Props: قبل از استفاده گسترده از Hooks، توسعه دهندگان اغلب از کامپوننت های مرتبه بالاتر (HOCs) یا Render Props برای کپسوله کردن و به اشتراک گذاری منطق پیچیده بین اجزا استفاده می کردند. الگوهای HOC و Render Props استفاده مجدد از منطق را در چندین مؤلفه تسهیل کردند و مدیریت وضعیت پیچیده و عوارض جانبی را آسانتر کردند.
به طور کلی، مؤلفههای کلاس یک رویکرد ساختاریافته و مبتنی بر کلاس برای مدیریت وضعیت پیچیده و عوارض جانبی در برنامههای React ارائه میکنند. در حالی که Hooks از آن زمان بهعنوان جایگزین سبکتر و کاربردیتر ظاهر شده است، اجزای کلاس همچنان در بسیاری از پایگاههای کد استفاده میشوند، بهویژه در پروژههای قدیمی یا موقعیتهایی که روشها یا الگوهای چرخه حیات خاصی مورد نیاز است.
زمان استفاده از هر نوع جزء
بیایید در مورد زمان استفاده از مؤلفه های تابع و مؤلفه های کلاس در React و همچنین زمانی که مرزهای خطا ممکن است استفاده از مؤلفه های کلاس را ضروری کند، بحث کنیم:
زمان انتخاب اجزای تابع
سادگی و خوانایی: از مؤلفههای تابع برای عناصر رابط کاربری سادهتر یا مؤلفههایی که به روشهای حالت یا چرخه حیات نیاز ندارند، استفاده کنید. آنها نحو سادهتری دارند و خواندن و درک آنها آسانتر است و برای اجزای نمایشی ایدهآل هستند.
قابلیت استفاده مجدد و ترکیب: اجزای تابع قابلیت استفاده مجدد و ترکیب پذیری را با این امکان را به شما می دهد که عملکردهای کوچک و قابل ترکیبی ایجاد کنید که به راحتی در برنامه شما قابل استفاده مجدد باشد. آنها برای ساخت اجزای رابط کاربری قابل استفاده مجدد مناسب هستند.
عملکرد: اجزای تابع با React Hooks رویکرد بهینهتری را برای مدیریت حالت و عوارض جانبی ارائه میدهند که به طور بالقوه منجر به عملکرد بهتر در مقایسه با اجزای کلاس میشود. آنها از سربار نمونه سازی کلاس اجتناب می کنند و جایگزین سبک تری ارائه می دهند.
زمان انتخاب اجزای کلاس (مرزهای خطا)
روشهای چرخه حیات: از اجزای کلاس در مواقعی که نیاز به دسترسی به روشهای چرخه حیات مانند componentDidCatch
دارید، استفاده کنید. مؤلفههای کلاس راهی برای پیادهسازی مرزهای خطا ارائه میکنند، که مؤلفههایی هستند که خطاهای جاوا اسکریپت را در هر نقطه از درخت مؤلفه فرزند خود میگیرند و به جای خراب کردن کل برنامه، یک رابط کاربری بازگشتی نمایش میدهند.
مدیریت وضعیت پیچیده و اثرات جانبی (قبل از قلاب): در پایگاههای کد قدیمی یا موقعیتهایی که به روشهای چرخه حیات خاص یا بهینهسازیها نیاز است، اجزای کلاس ممکن است همچنان انتخاب ارجح باشند. آنها رویکرد ساختارمندتری را برای مدیریت وضعیت پیچیده، عوارض جانبی و رفتار چرخه زندگی ارائه می دهند.
سازگاری به عقب: اجزای کلاس هنوز به طور گسترده در بسیاری از پایگاه های کد و کتابخانه های React موجود استفاده می شود. اگر روی پروژهای کار میکنید که به شدت به مؤلفههای کلاس متکی است یا اگر نیاز به ادغام با کتابخانههایی دارید که به مؤلفههای تابع با Hooks منتقل نشدهاند، ممکن است به دلایل سازگاری نیاز به استفاده از مؤلفههای کلاس داشته باشید.
به طور خلاصه، اجزای عملکرد با Hooks به دلیل سادگی، قابلیت استفاده مجدد و مزایای عملکرد، عموماً برای اکثر موارد استفاده ترجیح داده می شوند. با این حال، اجزای کلاس هنوز مرتبط هستند، به خصوص زمانی که روشهای چرخه حیات خاص یا مرزهای خطا ضروری هستند. ضروری است که جوانب مثبت و منفی هر نوع جزء را بسنجید و یکی را انتخاب کنید که به بهترین وجه با نیازها و محدودیت های پروژه شما مطابقت دارد.
React Hooks: Bridging the Gap
React Hooks یک ویژگی معرفی شده در React 16.8 است که به اجزای تابع اجازه می دهد تا منطق حالتی داشته باشند و بدون نیاز به نوشتن یک جزء کلاس به ویژگی های چرخه حیات React دسترسی داشته باشند. هوک ها توابعی هستند که به شما امکان می دهند از ویژگی های React State و چرخه حیات از داخل اجزای تابع استفاده کنید.
استفاده از Hooks برای مدیریت دولتی (useState)
useState
Hook یکی از اساسی ترین React Hook ها است. به اجزای تابع اجازه می دهد تا بدون نیاز به تعریف کلاس، حالت را مدیریت کنند. در اینجا مثالی از نحوه استفاده از useState
آورده شده است:
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); }
در این مثال، useState
برای اعلام count
متغیر حالت و تابع setCount
برای به روز رسانی آن استفاده می شود. مقدار اولیه count
روی 0
تنظیم شده است. هر زمان که setCount
با یک مقدار جدید فراخوانی شود، React کامپوننت را با وضعیت بهروزرسانیشده دوباره رندر میکند.
سایر قلاب های مفید (useEffect، useContext و غیره)
React چندین Hook دیگر را برای مدیریت عوارض جانبی، زمینه و موارد دیگر ارائه می دهد. برخی از موارد پرکاربرد عبارتند از:
useEffect
: این قلاب به شما اجازه می دهد تا عوارض جانبی را در اجزای تابع انجام دهید. جایگزین متدهای چرخه حیات مانند componentDidMount
، componentDidUpdate
و componentWillUnmount
می شود. می توانید از آن برای واکشی داده ها، اشتراک در رویدادهای خارجی یا انجام پاکسازی استفاده کنید.
useContext
: این قلاب به شما امکان میدهد تا در اجزای تابع از متن استفاده کنید. به شما امکان می دهد از نزدیکترین Context.Provider
در درخت مؤلفه به مقادیر دسترسی داشته باشید.
useReducer
: این Hook جایگزینی برای useState
برای مدیریت منطق پیچیده تر حالت است. این بر اساس الگوی کاهنده است و برای مدیریت انتقال حالت به روشی قابل پیش بینی مفید است.
useCallback
و useMemo
: این هوک ها برای بهینه سازی عملکرد استفاده می شوند. useCallback
توابع را حفظ میکند و از رندرهای غیرضروری جلوگیری میکند، در حالی که useMemo
مقادیر را به خاطر میسپارد و از محاسبات گران قیمت در هر رندر جلوگیری میکند.
اینها تنها چند نمونه از هوک های موجود در React هستند. هر Hook هدف خاصی را دنبال میکند و به اجزای تابع اجازه میدهد تا قابلیتهای مشابهی با اجزای کلاس داشته باشند، شکاف بین دو نوع مؤلفه را پر کرده و عملکرد و رویکردی قابلترکیبتر را برای ساخت برنامههای React ایجاد میکند.
نتیجه
به طور خلاصه، React Hooks تأثیر زیادی بر نحوه ساخت اجزا در React گذاشته است. اجزای تابع واقعاً محبوب شده اند زیرا ساده تر و انعطاف پذیرتر از اجزای کلاس هستند.
با Hooks میتوانیم به راحتی حالت را مدیریت کنیم، عوارض جانبی را کنترل کنیم و نحوه رفتار اجزا را کنترل کنیم. این امر توسعه React را ساده تر و کارآمدتر کرده است.
با نگاه به آینده، اجزای تابع با Hooks احتمالاً به روش استاندارد ساخت برنامه های React تبدیل می شوند. استفاده از آنها آسانتر است و عملکرد بهتری را ارائه میدهند، که آنها را در میان توسعهدهندگان محبوب میکند.
در حالی که اجزای کلاس هنوز جایگاه خود را دارند، به خصوص در پروژه های قدیمی تر، روند به سمت اجزای تابع با Hooks در حال حرکت است. آنها یک رویکرد مدرن و کارآمد برای ایجاد رابط های کاربری ارائه می دهند و توسعه React را برای همه افراد درگیر لذت بخش تر می کنند.
در لینکدین با من ارتباط برقرار کنید.
ارسال نظر