Menguasai Re-render React: Cara Mengelak Kesalahan Biasa

DDD
Lepaskan: 2024-09-26 06:41:42
asal
734 orang telah melayarinya

Mastering React Re-renders: How to Avoid Common Pitfalls

1. Pengenalan

Bayangkan ini: anda baru sahaja membina apl React yang anggun dan kaya dengan ciri, tetapi tiba-tiba, prestasi mula meningkat. Butang terasa lembap, kemas kini data mengambil masa terlalu lama dan anda tidak dapat mengetahui sebabnya. Jika ini terdengar biasa, anda tidak bersendirian. Paparan semula bertindak balas, apabila dikendalikan secara tidak wajar, selalunya menjadi punca senyap di sebalik isu prestasi.

Menguasai pemaparan semula dalam React adalah penting untuk pembangun web yang bertujuan membina aplikasi yang cekap dan berskala. Mari kita mendalami cara pemaparan semula React berfungsi dan temui strategi praktikal untuk mengoptimumkan prestasi, mengelakkan perangkap biasa dan mengubah apl React anda menjadi pengalaman yang sangat pantas.

2. Bagaimana React Re-render Berfungsi?

Mekanisme pemaparan semula React ialah salah satu ciri yang paling berkuasa. Ia membolehkan apl anda mengemas kini UI secara dinamik berdasarkan keadaan atau prop yang berubah. Walau bagaimanapun, jika tidak dioptimumkan, proses ini boleh menyebabkan pemaparan semula yang tidak perlu, menyebabkan kemerosotan prestasi.

Secara ringkasnya, React memaparkan semula setiap kali:

  1. Keadaan komponen berubah.
  2. Satu komponen menerima prop baharu.
  3. Komponen induk dipaparkan semula.

Tetapi apakah yang berlaku apabila komponen dipaparkan semula terlalu kerap? Penyemak imbas perlu mengecat semula skrin, menghasilkan animasi janky, interaksi perlahan dan pengguna yang kecewa. Sekarang, tanya diri anda: berapa kali apl anda berasa perlahan dan anda tidak dapat menjelaskan sebabnya?

3. Mengapa Paparan Semula Berlebihan Mencederakan Prestasi

Paparan semula yang berlebihan menghasilkan kesan domino, menjadikan keseluruhan apl anda lembap. Setiap kali pemaparan semula berlaku:

  1. React menyelaraskan perubahan dengan DOM maya.
  2. Ia mengira kemas kini minimum yang perlu dibuat pada DOM sebenar.
  3. Pelayar mengecat semula skrin.

Dalam apl kecil, ini mungkin tidak dapat dilihat. Tetapi dalam aplikasi yang besar, dengan komponen bersarang dalam dan pengurusan keadaan yang kompleks, pemaparan semula yang paling kecil yang tidak perlu boleh menyebabkan kesesakan prestasi.

Berikut ialah contoh mudah:

const UserList = ({ users }) => {
  return users.map(user => <div key={user.id}>{user.name}</div>);
};

// Inside a parent component:
<UserList users={users} />
Salin selepas log masuk

Sekarang bayangkan Senarai Pengguna ini dipaparkan semula setiap kali komponen induk mengemas kini, walaupun pengguna tidak berubah. Di sinilah letak masalahnya. Bagaimanakah kita boleh menghalang pemaparan semula yang tidak perlu itu?

4. Perangkap Biasa (Dan Cara Mengelakkannya)

Perangkap 1: Tidak Menghafal Fungsi dan Objek

Setiap kali komponen induk memaparkan semula, ia mencipta fungsi baharu dan rujukan objek, walaupun jika nilai sebenar tidak berubah. Ini menyebabkan komponen kanak-kanak dipaparkan semula secara tidak perlu.

Tindakan: Gunakan useCallback dan gunakan cangkuk Memo untuk menghafal fungsi dan objek.

const ParentComponent = () => {
  const handleClick = useCallback(() => {
    // some function logic
  }, []);

  const userDetails = useMemo(() => ({ name: "Rajesh", age: 30 }), []);

  return <ChildComponent onClick={handleClick} details={userDetails} />;
};
Salin selepas log masuk

Mengapa ia berfungsi: Memoisasi menghalang penciptaan fungsi baharu dan rujukan objek pada setiap pemaparan semula, mengurangkan pemaparan yang tidak perlu dalam komponen kanak-kanak.

Pitfall 2: Melepasi Fungsi Sebaris atau Objek sebagai Props

Fungsi atau objek sebaris dibuat setiap kali komponen dipaparkan, menyebabkan komponen penerima dipaparkan semula, walaupun nilai sebenar tidak berubah.

Tindakan: Isytihar fungsi dan objek di luar komponen atau gunakan cangkuk memoisasi.

// Avoid this:
<ChildComponent onClick={() => console.log("clicked")} />

// Instead:
const handleClick = useCallback(() => console.log("clicked"), []);
<ChildComponent onClick={handleClick} />
Salin selepas log masuk

Pitfall 3: Gagal Menggunakan React.memo

Sesetengah komponen bersifat tulen—ia sentiasa menghasilkan output yang sama dengan prop yang sama. Namun, tanpa React.memo, mereka masih akan memaparkan semula apabila komponen induknya melakukannya.

Tindakan: Balut komponen berfungsi dengan React.memo untuk mengelakkan pemaparan semula yang tidak perlu.

const ChildComponent = React.memo(({ data }) => {
  return <div>{data.name}</div>;
});
Salin selepas log masuk

Mengapa ia berfungsi: React.memo memastikan komponen hanya dipaparkan semula apabila propnya berubah, mengelakkan pemaparan berlebihan.

5. Cara Mengesan dan Nyahpepijat React Re-render

Pernah tertanya-tanya, "Mengapa komponen saya dipaparkan semula?" React DevTools menyediakan cara terbaik untuk menjejak pemaparan dan memahami di mana masalah berlaku.

  1. Dayakan 'Kemas Kini Serlahkan': Ini menunjukkan kepada anda komponen mana yang dipaparkan semula.
  2. Gunakan tab 'Profiler': Ia menunjukkan pemasaan pemaparan dan membantu mengenal pasti kesesakan.

Anda juga boleh menggunakan cangkuk tersuai seperti ini untuk log pemaparan semula:

const useWhyDidYouRender = (componentName, props) => {
  const previousProps = useRef(props);

  useEffect(() => {
    if (previousProps.current !== props) {
      console.log(`${componentName} re-rendered`);
      previousProps.current = props;
    }
  });
};
Salin selepas log masuk

6. Amalan Terbaik untuk Mengoptimumkan Paparan Semula Reaksi

1. Angkat Keadaan Apabila Perlu, Bukan Sentiasa

Kadangkala keadaan mengangkat ke komponen yang lebih tinggi menyebabkan pemaparan semula komponen kanak-kanak yang tidak perlu. Sebaliknya, uruskan negeri secara tempatan apabila boleh.

2. Use Key Wisely

When rendering lists, ensure each item has a stable, unique key prop. This helps React optimize re-renders by identifying which items have changed.

3. Avoid Re-rendering Unmounted Components

This can cause memory leaks and performance issues. Use the useEffect cleanup function to avoid re-renders in unmounted components.

useEffect(() => {
  return () => {
    // cleanup logic here
  };
}, []);
Salin selepas log masuk

7. Summary: Master React Re-renders

In short, React re-renders can be a hidden source of performance issues, but with the right techniques, you can prevent unnecessary re-renders, keep your app fast, and ensure smooth user experiences.

  • Memoize functions and objects to avoid re-rendering child components.
  • Use React.memo to stop unnecessary re-renders in pure components.
  • Leverage React DevTools to track, understand, and debug performance bottlenecks.

8. Practical Application: Improving Performance with Intentional Re-renders

Next time you're optimizing a React app, think critically about each re-render. Are they necessary? What happens if you memoize this function? By applying these strategies, you’ll be writing leaner, faster React code and avoiding the common pitfalls that trip up even the most experienced developers.


Final Thought: Now that you've learned the ins and outs of React re-renders, go ahead and apply these optimizations to your own apps. You'll not only see better performance but also gain confidence in writing scalable, maintainable React code!


Atas ialah kandungan terperinci Menguasai Re-render React: Cara Mengelak Kesalahan Biasa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!