A React Hooks Challenge สำหรับนักพัฒนา React อาวุโส

คุณสามารถแก้ปัญหานี้ได้หรือไม่?

เมื่อไม่นานมานี้ เพื่อนคนหนึ่งส่งเดโม React มาให้ฉันเพื่อทดสอบความเข้าใจของฉันเกี่ยวกับ React

ฉันได้ดูการสาธิตนี้อย่างละเอียดยิ่งขึ้น แม้ว่าโค้ดจะมีขนาดเล็กมาก แต่ก็มีข้อมูลต่อไปนี้:

  • ปัญหาการปิดตะขอ
  • หลักการของรัฐ

การสาธิต

โครงสร้างของเดโมนั้นเรียบง่าย ประกอบด้วยปุ่มและรายการ

และเมื่อคลิกปุ่ม จะเพิ่มบางอย่างลงในรายการดังที่คุณเห็นด้านล่าง:

ดูเหมือนว่านี้:

จนถึงตอนนี้มันค่อนข้างง่ายใช่มั้ย

ส่วนที่ตลกและซับซ้อนคือเมื่อคุณคลิกAddปุ่ม ปุ่มใหม่จะมีonClick={add}กิจกรรมอยู่ในรายการด้วย

ดังนั้น หากคุณคลิกAddเจ็ดครั้ง หน้าจะมีลักษณะดังนี้:

คุณเข้าใจไหม? นี่คือการสาธิตออนไลน์:

ความท้าทาย

นี่คือคำถาม: หากเราคลิกตัวเลขเหล่านี้ จะเกิดอะไรขึ้น?

  • หากเราคลิกปุ่ม0รายการจะเป็นอย่างไร
  • หากเราคลิกปุ่ม6รายการจะเป็นอย่างไร

คำตอบ

นักพัฒนาบางคนอาจคิดว่าปุ่มใหม่จะถูกผลักไปที่รายการหลังจากคลิกหมายเลข

แต่คำตอบนี้ผิด เมื่อเราคลิกที่ตัวเลข ความยาวของรายการจะกลายเป็น [ the number+ 1] และหมายเลขสุดท้ายในรายการจะกลายเป็น[ the largest number before the click+ 1]

ฉันรู้ว่าข้อความนี้พูดได้คำเดียว แต่ให้ฉันอธิบายด้วยตัวอย่างบางส่วน

สมมติว่ารายการปัจจุบันคือ:

หากเราคลิก0ความยาวของรายการจะเปลี่ยนเป็น0 + 1 = 1และตัวเลขสุดท้ายจะกลาย6 + 1 = 7เป็น

ตอนนี้ หากเราคลิก2ความยาวของรายการจะเปลี่ยนเป็น2 + 1 = 3และตัวเลขสุดท้ายจะกลาย6 + 1 = 7เป็น

คุณสามารถทดลองใช้ได้โดยการจัดเตรียมการสาธิตที่ฝังไว้

แต่คุณรู้หรือไม่ว่าทำไมปรากฏการณ์นี้จึงเกิดขึ้น?

สถานะและการปิดบัญชี

ซึ่งเป็นผลมาจากสองปัจจัยที่ทำงานร่วมกัน:

  • ปัญหาการปิดด้วยขอเกี่ยว
  • รัฐประกอบอย่างไร

เมื่อคลิกปุ่มaddฟังก์ชันจะถูกเรียก จากนั้นการปิดจะถูกสร้างขึ้นตามบริบท

การปิดประกอบด้วย:

  • addการทำงาน
  • list
  • setList

นี่เป็นความเข้าใจผิดที่พบบ่อย: การlistส่งคืนโดยการโทรหลายครั้งuseStateเป็นวัตถุเดียวกันกับที่อยู่เดียวกันในหน่วยความจำ

อันที่จริง การlistส่งคืนโดยการโทรแต่ละครั้งจะuseStateคำนวณตามสูตรต่อไปนี้:

base state + update1 + update2 + … = current state

สิ่งนี้นำไปสู่ปรากฏการณ์ที่สำคัญมาก: addฟังก์ชันที่สอดคล้องกับตัวเลขแต่ละตัวอยู่ในการปิดที่แตกต่างกัน และlistมีค่าต่างกัน

iเป็นตัวแปรระดับโมดูล พวกมันเหมือนกันในแต่ละการปิด

เมื่อคุณคลิก0สิ่งต่อไปนี้จะเกิดขึ้น:

  • iเป็นตัวแปรระดับโมดูล 6
  • listในการปิดนี้คือ[]

setList(
  [].concat(
    <button key={7} onClick={add}>{7}</button>
  )
);

เมื่อคุณคลิก2สิ่งนี้จะเกิดขึ้น:

  • iเป็นตัวแปรระดับโมดูล 6
  • listในการปิดนี้คือ[0, 1]

setList(
  [0, 1].concat(
    <button key={7} onClick={add}>{7}</button>
  )
);

คุณเข้าใจไหม?

บทสรุป

เนื่องจากหลักการประกอบของรัฐคือ:

base state + update1 + update2 + … = current state

และเนื่องจากการปิดlistปุ่มตัวเลขแต่ละปุ่มจึงบันทึกค่าที่ แตกต่างกัน

ในที่สุดสิ่งนี้นำไปสู่ปรากฏการณ์ที่อธิบายไว้ในตอนต้นของบทความ

ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับคุณ

สารละลาย

หากคุณไม่ต้องการปรากฏการณ์การปิดนี้ คุณสามารถแก้ไขพารามิเตอร์ของsetListto function form

Suggested posts

วิธีช่วยโลกและสร้างรายได้

วิธีช่วยโลกและสร้างรายได้

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

ศิลปะเคยไม่ฝักใฝ่ฝ่ายใดหรือไม่?

ศิลปะเคยไม่ฝักใฝ่ฝ่ายใดหรือไม่?

เมื่อวานนี้ เราปิดการแข่งขัน Eurovision Song Contest ปีนี้ด้วยตอนจบที่สดใสและวุ่นวาย โดย Loreen นักร้องชาวสวีเดนคว้าถ้วยรางวัลกลับบ้าน กลายเป็นผู้หญิงคนแรกที่ชนะสองครั้งและนำมงกุฎกลับมายังสวีเดน 50 ปีหลังจาก ABBA ชนะการแข่งขัน กับ “วอเตอร์ลู” พวกเขากลายเป็นหนึ่งในการแสดงที่ยิ่งใหญ่ที่สุดในวงการเพลงป๊อป

Related posts

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

“หวัดดี Siri เล่น Me Dive โดย Olivia Dean” ในเดือนพฤษภาคม 2021 ฉันเริ่มฝึกงานที่ Future Academy Africa ในเมือง Akure ประเทศไนจีเรีย

การสร้างสภาพแวดล้อมการทำงานที่ปลอดภัย

การสร้างสภาพแวดล้อมการทำงานที่ปลอดภัย

“เขาจะปกป้องฉันเมื่อฉันตกอยู่ในอันตราย เขาจะซ่อนฉันไว้ในเต็นท์ของเขา

เครือข่ายทีวีทวิตเตอร์

เครือข่ายทีวีทวิตเตอร์

ของเก่ากลายเป็นของใหม่อีกครั้ง และของที่เคยเป็นประกายระยิบระยับกลับดูจืดชืด ฉันไม่ได้กำลังพูดถึงกางเกงยีนส์ JNCO ที่กลับมาเป็นที่นิยมในหมู่เด็กเท่ๆ ในตัวเมืองพร้อมกับแฟชั่นอื่นๆ ในช่วงปลายทศวรรษ 1990

คาวบอยโกหก

บรรษัทขนาดใหญ่ขายคนอเมริกันด้วยความเท็จได้อย่างไร

คาวบอยโกหก

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