Tốt nhất là so sánh React (khai báo) và JQuery (bắt buộc) để cho bạn thấy sự khác biệt.
Trong React, bạn chỉ cần mô tả trạng thái cuối cùng của giao diện người dùng của mình trong render()
phương thức mà không cần lo lắng về cách chuyển từ trạng thái giao diện người dùng trước đó sang trạng thái giao diện người dùng mới. Ví dụ,
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>
)
}
Mặt khác, JQuery yêu cầu bạn chuyển đổi trạng thái giao diện người dùng của mình theo thứ bậc, ví dụ: chọn các phần tử nhãn và cập nhật văn bản và CSS của chúng:
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);
...
}
Trong kịch bản thế giới thực, sẽ có nhiều phần tử giao diện người dùng được cập nhật, cộng với các thuộc tính của chúng (ví dụ: kiểu CSS và trình xử lý sự kiện), v.v. Nếu bạn thực hiện điều này một cách chủ quan bằng JQuery, nó sẽ trở nên phức tạp và tẻ nhạt; rất dễ quên cập nhật một số phần của giao diện người dùng hoặc quên xóa trình xử lý sự kiện cũ (gây rò rỉ bộ nhớ hoặc kích hoạt trình xử lý nhiều lần), v.v. Đây là nơi lỗi xảy ra, tức là trạng thái giao diện người dùng và trạng thái mô hình đã hết đồng bộ hóa.
Các trạng thái không đồng bộ sẽ không bao giờ xảy ra với cách tiếp cận khai báo của React, bởi vì chúng ta chỉ cần cập nhật trạng thái mô hình và React có trách nhiệm giữ cho giao diện người dùng và trạng thái mô hình được đồng bộ.
- Dưới móc, React sẽ cập nhật tất cả các phần tử DOM đã thay đổi bằng cách sử dụng mã mệnh lệnh.
Bạn cũng có thể đọc câu trả lời của tôi cho Sự khác biệt giữa lập trình khai báo và lập trình mệnh lệnh là gì?.
Tái bút: từ ví dụ jQuery ở trên, bạn có thể nghĩ điều gì sẽ xảy ra nếu chúng ta đặt tất cả các thao tác DOM trong một updateAll()
phương thức và gọi nó mỗi khi có bất kỳ trạng thái mô hình nào của chúng ta thay đổi và giao diện người dùng sẽ không bao giờ bị mất đồng bộ. Bạn nói đúng, và đây là những gì React làm hiệu quả, sự khác biệt duy nhất là jQuery updateAll()
sẽ gây ra nhiều thao tác DOM không cần thiết, nhưng React sẽ chỉ cập nhật các phần tử DOM đã thay đổi bằng cách sử dụng Thuật toán khác biệt DOM ảo của nó .
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.