Langkau ke kandungan
WANCODE
EN

Membaca Komponen React yang Dijana

18 minitPertengahanReact

Dalam pelajaran ini

  • Baca komponen mengikut susunan tetap: state, effect, handler, JSX
  • Kenal pasti tiga bug yang sering dihasilkan pembantu AI: mutasi state, key yang hilang, stale closure
  • Sahkan setiap pembaikan melalui tingkah lakunya, bukan sekadar rupa kod

Idea utama

Kod React yang dijana biasanya dipaparkan dengan baik pada kali pertama. Bug-nya bersembunyi dalam apa yang berlaku seterusnya: kemas kini yang tidak re-render, senarai yang guna semula baris yang salah, effect yang mengingati nilai lama.

Komponen dalam editor "dijana" untuk prompt ringkas: perancang belajar dengan senarai topik dan pemasa sesi. Ia nampak kemas dan boleh dipaparkan. Sebelum teruskan membaca, cuba dulu: tanda satu kotak, buang satu topik, perhatikan pemasa.

Baca mengikut susunan tetap

  1. State — apa yang komponen ini ingat? (topics, draft, seconds)
  2. Effect — apa yang berjalan selepas render, dan nilai apa yang ditangkapnya?
  3. Handler — adakah setiap kemas kini mencipta data baharu, atau mengubah data lama di tempatnya?
  4. JSX — adakah senarai ada key yang stabil? Adakah apa-apa dipaparkan daripada data yang mungkin tiada?
React re-render bila state berubah kepada nilai baharu. Objek yang sama dimasukkan → tiada re-render.

Tanda bahaya 1: mutasi state

Apa yang ditulis pembantu AI

JSX
topics.splice(index, 1); // changes the old array
setTopics(topics);        // same array → React skips the update

Apa yang dihantar oleh penyemak

JSX
setTopics(topics.filter((t) => t.id !== id)); // new array

push, splice, sort, reverse dan obj.x = … semuanya mengubah data di tempatnya. React membandingkan state lama dan baharu melalui rujukan, jadi kemas kini itu diabaikan — sehingga sesuatu yang lain re-render dan perubahan itu muncul "secara rawak".

Tanda bahaya 2: key yang hilang atau tidak stabil

Tanpa key, React memadankan item senarai mengikut kedudukan. Buang topik pertama dan topik kedua akan dilukis ke dalam DOM baris pertama — termasuk kotak semaknya. Console memberi amaran (Each child in a list should have a unique "key" prop), tetapi kod jana AI selalunya dihantar dengan amaran itu diabaikan. Guna index array sebagai key pun ada masalah yang sama. Guna id yang stabil daripada data.

Tanda bahaya 3: stale closure dalam effect

Apa yang ditulis pembantu AI

JSX
useEffect(() => {
  const timer = setInterval(() => {
    setSeconds(seconds + 1); // "seconds" is always 0 here
  }, 1000);
  return () => clearInterval(timer);
}, []);

Apa yang dihantar oleh penyemak

JSX
useEffect(() => {
  const timer = setInterval(() => {
    setSeconds((s) => s + 1); // always uses the latest value
  }, 1000);
  return () => clearInterval(timer);
}, []);

Effect itu berjalan sekali sahaja ([]), jadi callback-nya menangkap seconds daripada render pertama selama-lamanya. Functional update meminta nilai semasa daripada React.

Berita baik: kod jana AI itu juga buat beberapa perkara dengan betul — preventDefault() semasa submit, trim input, spread untuk menambah, dan fungsi cleanup untuk interval. Menyemak bermaksud perasan kedua-duanya.

Klik Remove pada satu topik. Tiada apa berlaku — kemudian, sekejap lagi, pemasa berdetik dan senarai tiba-tiba berubah. Kelewatan itu ialah tanda klasik state yang dimutasi. Tulis semula removeTopic supaya ia mencipta array baharu dan bukannya mengubah array lama.

Semakan

  • Klik Remove mengemas kini senarai serta-merta
  • Kiraan topik juga dikemas kini

Uji kefahaman

Q1

Handler yang dijana melakukan todo.done = true; setTodos(todos);. Apa yang berlaku?

Q2

Yang manakah key terbaik untuk senarai topik yang dimuat daripada pangkalan data?

Q3

Kenapa setSeconds(seconds + 1) di dalam setInterval berhenti pada 1?

Apa yang anda pelajari

  • Baca komponen mengikut susunan: state → effect → handler → JSX.
  • Jangan mutasi state; bina array/objek baharu dengan filter, map dan spread.
  • Senarai perlukan key yang stabil daripada data — dan amaran console ialah dapatan semakan.
  • Callback dalam effect menangkap nilai lama; guna functional update atau dependency yang betul.
Pratonton

Output konsol daripada kod anda akan dipaparkan di sini.

Langkah 1 daripada 3