0Pricing
React Academy · บทเรียน

ยกสถานะขึ้น: หลักการและตัวอย่าง

ย้ายสถานะที่ใช้ร่วมกันไปยังบรรพบุรุษร่วมที่ใกล้ที่สุด และส่งต่อผ่านพร็อพส์

ยกสถานะขึ้น: หลักการและตัวอย่าง เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะเรียนรู้รูปแบบการยกสถานะขึ้น โดยย้ายสถานะที่ใช้ร่วมกันไปยังบรรพบุรุษร่วมที่ใกล้ที่สุด เพื่อให้คอมโพเนนต์พี่น้องทำงานสอดคล้องกัน

ปัญหา: คอมโพเนนต์พี่น้องไม่สอดคล้องกัน

เมื่อคอมโพเนนต์พี่น้องสองรายการต้องใช้ข้อมูลเดียวกัน การแยกสถานะไว้ในแต่ละคอมโพเนนต์อาจทำให้เกิดข้อผิดพลาดจากข้อมูลไม่สอดคล้องกัน วิธีแก้คือย้ายสถานะไปไว้ที่คอมโพเนนต์แม่ร่วมกัน

การระบุบรรพบุรุษร่วม

ค้นหาคอมโพเนนต์ที่ใกล้ที่สุดซึ่งเป็นคอมโพเนนต์แม่ของคอมโพเนนต์ **ทั้งสอง** ที่ต้องใช้ข้อมูลร่วมกัน จากนั้นย้ายสถานะไปไว้ที่นั่นและส่งต่อเป็นพร็อพ
function Parent() {
  const [value, setValue] = useState('');
  return (
    <>
      <InputA value={value} onChange={setValue} />
      <PreviewB value={value} />
    </>
  );
}

ตัวอย่างการยกสถานะตัวนับขึ้น

สมมติว่าคอมโพเนนต์สองรายการแสดงตัวนับเดียวกัน แทนที่จะจัดการ count ในแต่ละคอมโพเนนต์ ให้ยกสถานะขึ้นไปไว้ที่คอมโพเนนต์แม่ ทั้งสองคอมโพเนนต์จะได้รับ count เป็นพร็อพ และเรียกการเรียกกลับ onChange เพื่ออัปเดตค่า
function App() {
  const [count, setCount] = useState(0);
  return (
    <>
      <CounterDisplay count={count} />
      <CounterControl count={count} onIncrement={() => setCount(c => c + 1)} />
    </>
  );
}

พร็อพการเรียกกลับสำหรับการอัปเดต

องค์ประกอบลูกไม่สามารถแก้ไขสถานะของคอมโพเนนต์แม่ได้โดยตรง คอมโพเนนต์แม่จะส่งฟังก์ชันเรียกกลับ เช่น `onChange` เป็นพร็อพ เมื่อองค์ประกอบลูกต้องการขอให้เปลี่ยนสถานะ ก็จะเรียกฟังก์ชันเรียกกลับนั้น

แบบควบคุมเทียบกับแบบไม่ควบคุมหลังการยกสถานะ

หลังจากยกสถานะขึ้น องค์ประกอบลูกที่เคยเป็นเจ้าของสถานะจะกลายเป็น **คอมโพเนนต์แบบควบคุม** โดยได้รับค่าปัจจุบันและ onChange จากคอมโพเนนต์แม่ คอมโพเนนต์แม่จึงเป็นแหล่งความจริงเดียว

การยกสถานะขึ้นหลายระดับ

บางครั้งคุณจำเป็นต้องยกสถานะขึ้นไปหลายระดับในต้นไม้ หากต้องยกสถานะผ่านคอมโพเนนต์ตัวกลางหลายรายการ ควรพิจารณาใช้ Context แทน เพื่อหลีกเลี่ยงการส่งต่อพร็อพผ่านคอมโพเนนต์หลายชั้น

ประโยชน์ของการยกสถานะขึ้น

การยกสถานะขึ้นทำให้มีแหล่งความจริงเพียงหนึ่งเดียว ทำให้การไหลของข้อมูลคาดเดาได้ โดยไหลจากบนลงล่างเสมอ ช่วยให้แก้ไขข้อผิดพลาดได้ง่ายขึ้น และทำให้เพิ่มผู้ใช้สถานะเดียวกันในภายหลังได้สะดวก

ค่าที่คำนวณต่อยอดจากสถานะที่ยกขึ้น

คำนวณค่าที่ได้จากสถานะที่ยกขึ้นภายในคอมโพเนนต์แม่ แล้วส่งค่าเหล่านั้นเป็นพร็อพเพิ่มเติม อย้าสร้างสถานะซ้ำ แต่ให้คำนวณต่อยอดจากสถานะเดิม
const [items, setItems] = useState([]);
const filteredItems = items.filter(i => i.done); // derived, not separate state

เมื่อการยกสถานะขึ้นมากเกินไป

หากคุณพบว่าต้องยกสถานะผ่าน 4 ระดับขึ้นไป โครงสร้างต้นไม้คอมโพเนนต์อาจไม่เหมาะสม หรืออาจถึงเวลาที่ควรใช้ Context หรือไลบรารีจัดการสถานะ

ตรวจสอบความเข้าใจ

แนวทางที่ถูกต้องคืออะไรเมื่อคอมโพเนนต์พี่น้องสองรายการต้องใช้สถานะเดียวกันร่วมกัน

สรุปทบทวน

ยกสถานะขึ้นไปยังบรรพบุรุษร่วมที่ใกล้ที่สุดเมื่อคอมโพเนนต์พี่น้องต้องใช้สถานะร่วมกัน ส่งค่าปัจจุบันลงไป และส่งการเรียกกลับสำหรับการเปลี่ยนแปลงขึ้นมา คำนวณค่าต่อยอดแทนการสร้างสถานะซ้ำ

ถัดไป

บทเรียนถัดไป: **การส่งพร็อพผ่านลำดับชั้น: เมื่อใดจึงเป็นปัญหาและเมื่อใดจึงเหมาะสม** — คุณจะได้ระบุห่วงโซ่การส่งพร็อพที่เป็นปัญหา และตัดสินใจว่าเมื่อใดจำเป็นต้องแก้ไข

คำถามที่พบบ่อย

บทเรียน “ยกสถานะขึ้น: หลักการและตัวอย่าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ยกสถานะขึ้น: หลักการและตัวอย่าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ยกสถานะขึ้น: หลักการและตัวอย่าง”

ย้ายสถานะที่ใช้ร่วมกันไปยังบรรพบุรุษร่วมที่ใกล้ที่สุด และส่งต่อผ่านพร็อพส์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ยกสถานะขึ้น: หลักการและตัวอย่าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ยกสถานะขึ้น: หลักการและตัวอย่าง
  2. การส่งพร็อพส์ต่อหลายชั้น: เมื่อใดจึงเป็นปัญหาและเมื่อใดจึงเหมาะสม
  3. รูปแบบการสื่อสารระหว่างคอมโพเนนต์พี่น้อง
  4. การเลือกตำแหน่งจัดเก็บสถานะที่เหมาะสม
← กลับไปที่ React Academy