ที่ดีที่สุดคือเปรียบเทียบ React (เชิงประกาศ) และ JQuery (จำเป็น) เพื่อแสดงความแตกต่าง
ในการตอบสนองคุณจะต้องอธิบายสถานะสุดท้ายของ UI ในrender()
วิธีการเท่านั้นโดยไม่ต้องกังวลเกี่ยวกับวิธีการเปลี่ยนจากสถานะ UI ก่อนหน้าไปเป็นสถานะ UI ใหม่ เช่น,
render() {
const { price, volume } = this.state;
const totalPrice = price * volume;
return (
<div>
<Label value={price} className={price > 100 ? 'expensive' : 'cheap'} ... />
<Label value={volume} className={volume > 1000 ? 'high' : 'low'} ... />
<Label value={totalPrice} ... />
...
</div>
)
}
ในทางกลับกัน JQuery ต้องการให้คุณเปลี่ยนสถานะ UI ของคุณโดยจำเป็นเช่นการเลือกองค์ประกอบป้ายกำกับและอัปเดตข้อความและ CSS:
updatePrice(price) {
$("#price-label").val(price);
$("#price-label").toggleClass('expansive', price > 100);
$("#price-label").toggleClass('cheap', price < 100);
updateTotalPrice();
...
}
updateVolume(volume) {
$("#volume-label").val(volume);
$("#volume-label").toggleClass('high', volume > 1000);
$("#volume-label").toggleClass('low', volume < 1000);
updateTotalPrice();
...
}
updateTotalPrice() {
const totalPrice = price * volume;
$("#total-price-label").val(totalPrice);
...
}
ในสถานการณ์จริงจะมีการอัปเดตองค์ประกอบ UI อื่น ๆ อีกมากมายรวมถึงคุณสมบัติ (เช่นสไตล์ CSS และตัวฟังเหตุการณ์) เป็นต้นหากคุณใช้ JQuery โดยจำเป็นมันจะซับซ้อนและน่าเบื่อ เป็นเรื่องง่ายที่จะลืมอัปเดตบางส่วนของ UI หรือลืมที่จะลบตัวจัดการเหตุการณ์เก่า (ทำให้หน่วยความจำรั่วหรือตัวจัดการทำงานหลายครั้ง) เป็นต้นนี่คือจุดที่เกิดข้อบกพร่องเช่นสถานะ UI และสถานะแบบจำลองไม่อยู่ ซิงค์.
สถานะไม่ซิงค์จะไม่เกิดขึ้นกับวิธีการประกาศของ React เนื่องจากเราจำเป็นต้องอัปเดตสถานะของโมเดลเท่านั้นและ React มีหน้าที่รับผิดชอบในการซิงค์ UI และสถานะของโมเดล
- ภายใต้เบ็ด React จะอัปเดตองค์ประกอบ DOM ที่เปลี่ยนแปลงทั้งหมดโดยใช้รหัสที่จำเป็น
คุณยังสามารถอ่านคำตอบของฉันสำหรับอะไรคือความแตกต่างระหว่างการเขียนโปรแกรมเชิงประกาศและแบบจำเป็น?.
PS: จากตัวอย่าง jQuery ด้านบนคุณอาจคิดว่าถ้าเราใส่การปรับแต่ง DOM ทั้งหมดในupdateAll()
เมธอดและเรียกมันทุกครั้งเมื่อสถานะแบบจำลองใด ๆ ของเราเปลี่ยนไปและ UI จะไม่ซิงค์กัน คุณถูกต้องและนี่คือสิ่งที่ React ทำได้อย่างมีประสิทธิภาพความแตกต่างเพียงอย่างเดียวคือ jQuery updateAll()
จะทำให้เกิดการปรับแต่ง DOM ที่ไม่จำเป็นมากมาย แต่ React จะอัปเดตองค์ประกอบ DOM ที่เปลี่ยนแปลงโดยใช้อัลกอริธึมเสมือน DOM Diffingเท่านั้น
Imperative programming: telling the "machine" how to do something, and as a result what you want to happen will happen. Declarative programming: telling the "machine"1 what you would like to happen, and let the computer figure out how to do it.