برنامه نویسی

تسلط بر عملکرد React: راهنمای توسعه‌دهنده برای جلوگیری از رندرهای غیرضروری

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

درک مجدد رندرها: بنیاد

قبل از بهینه سازی، باید بدانیم که چه زمانی و چرا کامپوننت های React دوباره رندر می شوند:

  • هنگامی که وضعیت یک جزء تغییر می کند
  • هنگامی که پایه های آن تغییر می کند
  • وقتی مؤلفه والد آن دوباره رندر شود

همه رندرها بد نیستند، اما موارد غیر ضروری می توانند بر عملکرد تأثیر بگذارند. بیایید نحوه جلوگیری از آنها را بررسی کنیم.

1. React.memo: اولین خط دفاع شما

const MovieCard = React.memo(({ title, rating, onLike }) => {
  console.log(`MovieCard rendered: ${title}`);
  return (
    <div className="card">
      <h3>{title}h3>
      <span>Rating: {rating}/10span>
      <button onClick={onLike}>Likebutton>
    div>
  );
});

// Usage
<MovieCard 
  title="Inception" 
  rating={9.3} 
  onLike={() => handleLike('inception')} 
/>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

💡 برای نکته: در حالی که React.memo قدرتمند است، از آن به صورت استراتژیک استفاده کنید. حفظ کردن همه چیز در واقع می تواند به عملکرد آسیب برساند.

2. useCallback: ارجاعات تابع تثبیت کننده

const MovieList = () => {
  const [movies, setMovies] = useState([]);

  const handleLike = useCallback((movieId) => {
    setMovies(prevMovies => 
      prevMovies.map(movie => 
        movie.id === movieId 
          ? { ...movie, likes: movie.likes + 1 }
          : movie
      )
    );
  }, []); // Empty deps array as it only uses setState

  return movies.map(movie => (
    <MovieCard
      key={movie.id}
      {...movie}
      onLike={() => handleLike(movie.id)}
    />
  ));
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. useMemo: Caching Complex Calculations

const MovieAnalytics = ({ movies }) => {
  const statistics = useMemo(() => ({
    averageRating: movies.reduce((acc, m) => acc + m.rating, 0) / movies.length,
    topRated: [...movies].sort((a, b) => b.rating - a.rating)[0],
    totalLikes: movies.reduce((acc, m) => acc + m.likes, 0)
  }), [movies]);

  return (
    <div>
      <h2>Analytics Dashboardh2>
      <p>Average Rating: {statistics.averageRating.toFixed(1)}p>
      <p>Most Popular: {statistics.topRated.title}p>
      <p>Total Likes: {statistics.totalLikes}p>
    div>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. بهترین شیوه های مدیریت دولتی

حالت بلند کردن (در صورت نیاز)

const MovieApp = () => {
  const [favorites, setFavorites] = useState(new Set());

  // Lifted state handler
  const toggleFavorite = useCallback((movieId) => {
    setFavorites(prev => {
      const next = new Set(prev);
      if (next.has(movieId)) next.delete(movieId);
      else next.add(movieId);
      return next;
    });
  }, []);

  return (
    <div>
      <MovieList onFavorite={toggleFavorite} />
      <FavoritesList ids={favorites} />
    div>
  );
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. تکنیک های بهینه سازی پیشرفته

قلاب های سفارشی برای منطق پیچیده

function useMovieData(movieId) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    let mounted = true;

    async function fetchMovie() {
      setLoading(true);
      try {
        const response = await fetch(`/api/movies/${movieId}`);
        const movie = await response.json();
        if (mounted) {
          setData(movie);
          setLoading(false);
        }
      } catch (error) {
        if (mounted) {
          console.error('Failed to fetch movie:', error);
          setLoading(false);
        }
      }
    }

    fetchMovie();
    return () => {
      mounted = false;
    };
  }, [movieId]);

  return { data, loading };
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6. پروفایل و اشکال زدایی

با استفاده از React Developer Tools

  • React Developer Tools Profiler را فعال کنید
  • رندرهای مؤلفه را ضبط کنید
  • رندرهای غیر ضروری را شناسایی کنید
  • مدت زمان رندر را اندازه گیری کنید

چک لیست عملکرد

✅ از React.memo برای اجزای کاربردی خالص استفاده کنید
✅ استفاده از Callback را برای کنترل‌کننده‌های رویداد که به‌عنوان پروپوزال ارسال می‌شوند، پیاده‌سازی کنید
✅استفاده از useMemo برای محاسبات گران قیمت
✅ از ایجاد شی درون خطی در رندرها خودداری کنید
✅ از ابزارهای کلیدی مناسب در لیست ها استفاده کنید
✅ به طور منظم اپلیکیشن خود را نمایه کنید

دام های متداول برای جلوگیری از

❌ بهینه سازی بیش از حد
❌ بهینه سازی زودرس
❌ حفظ کردن همه چیز
❌ ایجاد اشیا/آرایه های جدید در رندر
❌ تودرتوی اجزای عمیق

نگاه به آینده: React 19 و Performance

React 19 بهبود عملکرد خودکار را به ارمغان می آورد:

  • دسته بندی خودکار پیشرفته
  • رندر همزمان بهبود یافته
  • برنامه ریزی بهتر به روز رسانی های ایالتی

نتیجه گیری

بهینه سازی عملکرد در React تعادلی بین پیچیدگی کد و دستاوردهای عملکرد واقعی است. با اصول اولیه شروع کنید، عملکرد برنامه خود را اندازه بگیرید و در صورت نیاز بهینه سازی کنید. به یاد داشته باشید: بهینه سازی زودرس ریشه همه بدی ها است!

✨ امیدوارم این برای شما مفید بوده باشد! فراموش نکنید که برای نکات و ترفندهای بیشتر React لایک کنید و من را دنبال کنید!

🚀 من را در X (تویتر) و لینکدین برای راهنمایی ها و بینش های روزانه توسعه وب دنبال کنید!

💻 به کدنویسی ادامه دهید، به ایجاد کردن ادامه دهید و به بهبود ادامه دهید!

با آرزوی موفقیت و موفقیت برای همه شما در این روز زیبا. بیایید با هم آن را شگفت انگیز کنیم! 🌟

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا