آشنایی با React Memo و کاربردهای آن

understanding react memo
20 آبان 1403

سلام! امروز می‌خوایم درباره یکی از قابلیت‌های پرکاربرد در React صحبت کنیم که به اسم React Memo شناخته می‌شه. اگر شما توسعه‌دهنده‌ای هستید که با React کار می‌کنید، ممکنه قبلاً با مفهومی به نام optimization یا بهینه‌سازی برخورد کرده باشید. خب، React Memo یکی از ابزارهای ما برای این کار هست. من می‌خوام اینجا در چند پاراگراف براتون شرح بدم که React Memo چی هست و چرا اهمیت داره.

وقتی داریم با React کار می‌کنیم، یکی از اصول مهمی که باید در ذهن داشته باشیم، روش رندر شدن کامپوننت‌هاست. ممکنه وقتی کامپوننت‌های مختلف رو بارها و بارها رندر کنیم، عملکرد برنامه تحت تأثیر قرار بگیره، به‌خصوص وقتی تعداد کامپوننت‌هامون بالا بره. اینجا جاییه که React Memo وارد بازی می‌شه و به‌کار میاد. با استفاده از این ویژگی می‌تونیم از انجام رندرهای غیرضروری برای بعضی کامپوننت‌ها جلوگیری کنیم.

جالبه بدونین که React Memo به‌سادگی یک hoc (Higher Order Component) هست که می‌تونه دور یک کامپوننت تابعی قرار بگیره. با این کار، React می‌تونه بررسی کنه که آیا پروپس هایی که به کامپوننت گذشته شده‌اند، تغییر کرده‌اند یا خیر، و فقط در صورت وجود تغییر، کامپوننت رو دوباره رندر می‌کنه.

برای درک بهتر، بیاین یه مثال بزنیم. فرض کنیم داریم روی پروژه‌ای کار می‌کنیم که در اون نیاز داریم لیستی از داده‌ها رو نمایش بدیم. اگر این داده‌ها تغییر نکرده باشن، می‌تونیم از React Memo استفاده کنیم تا لیست دوباره رندر نشه و عملکرد برنامه بهتر بشه.

کد مثال برای React Memo


import React from 'react';

const ListItem = React.memo(({ item }) => {
  console.log('Rendering:', item);
  return <li>{item}</li>;
});

const List = ({ items }) => {
  return (
    <ul>
      {items.map(item => (
        <ListItem key={item} item={item} />
      ))}
    </ul>
  );
};

export default List;

توضیح خط به خط کد

import React from 'react';
این خط کتابخانه React رو وارد می‌کنه که برای استفاده از React Memo لازم داریم.
const ListItem = React.memo(({ item }) => {
اینجا یک کامپوننت تابعی تعریف شده که به کمک React.memo حفاظت شده است. این یعنی اگر پروپس item تغییر نکنه، کامپوننت دوباره رندر نمی‌شه.
console.log('Rendering:', item);
این دستور برای نمایش پیامی در کنسول استفاده می‌شه که متوجه بشیم چه زمانی کامپوننت رندر می‌شه.
return <li>{item}</li>;
اینجا کامپوننت واقعاً داره یک عنصر li برای هر آیتم در لیست ایجاد می‌کنه.
const List = ({ items }) => {
اینجا یک کامپوننت تابعی به نام List تعریف شده که از لیست آیتم‌ها به پروپس استفاده می‌کنه.
<ul> و </ul>
این عناصر لیست unordered رو نشان می‌دهند که در اون ها آیتم‌ها نمایش داده می‌شن.
{items.map(item => (
از map استفاده شده تا هر آیتم از لیست به یک ListItem تبدیل بشه.
<ListItem key={item} item={item} />
هر آیتم در لیست به عنوان یک ListItem جدید ایجاد و به کامپوننت داده می‌شه.

سوالات متداول

؟

React Memo چطور به بهینه‌سازی کمک می‌کنه؟

؟

آیا می‌توان از React Memo در کامپوننت‌های کلاس استفاده کرد؟

؟

آیا استفاده از React Memo همیشه ضروریه؟