Phát biểu rằng state là imutable và readonly là đúng, nhưng mới chỉ đúng một nửa câu chuyện, và ví dụ bạn lấy là sai. Cốt lõi vấn đề đó là địa chỉ. React ko phép gán biến state sang địa chỉ mới mà ko thông qua hàm setState, đồng thời React nhận biết và render lại màn hình dựa vào sự thay đổi địa chỉ ấy. Nhưng vẫn có cách làm thay đổi giá trị của biến state mà ko làm thay đổi địa chỉ của biến. Sau đây là 2 practice điển hình trong thực tế:
Nếu state là một mảng, bạn vẫn có thể push thêm phần tử vào mảng bình thường, giá trị của nó được thay đổi ngay luôn thời điểm ấy, nhưng địa chỉ của mảng vẫn thế nên React ko biết mà render lại. Khi bạn làm cho render tiếp một lần nữa, bạn sẽ thấy những phần tử mới đã được đẩy vào mảng rồi.
Nếu state ở một object, bạn vẫn có thể thực hiện gán giá trị mới cho thuộc tính của nó. Ví dụ:
const [customerData, setCustomerData] = useState({ customerId: 1 })
.....
customerData.customerId = 2;
console.log("customerId là: ", customerData.customerId); // 2
// thậm chí thêm thuộc tính mới cho state ngay và luôn cũng được
customerData.customerName = "Tèo";
console.log("customerName là: ", customerData.customerName); // Tèo
Đương nhiên ko khuyến khích làm cách này, vì rất khổ cho người fix bug. Chúng ta nên làm theo luồng logic thông thường, khi nào cần gán giá trị mới thì khởi tạo hay là chế một object, một array mới rồi dùng setState mà gán. Trong trường hợp muốn gán ngay mà ko đợi vòng đời sau mới cập nhật thay đổi, bạn có thể thay bằng dùng useRef, hoặc ok dùng cách này nếu bạn biết chắc mình đang làm cái gì và có ảnh hưởng gì ko.
Vì màn hình sẽ render lại mỗi khi state thay đổi, vậy nên bạn cần đặt câu hỏi lớn hơn, "Chỗ này có cần thiết phải render lại ko? Chỗ này có khiến chương trình bị render quá nhiều ko?". Từ đó bạn đưa ra quyết định.
@dinhmh Khi tạo payload, mình đã đệm =00 vào giữa những chữ cái để khi convert.quoted-printable-decode nó sẽ xóa hết những byte đó đi, sau đó như mình đã giải thích phía trên, sử dụng chuyển đổi bảng mã UTF-16 sang UTF-8 để loại bỏ Payload thứ 2 và decode base64 để ra đoạn mã hoàn chỉnh
DISCUSSIONS
Giỏi quá hix
Vãi nồi giật tít =))
Vậy trên môi trường production thì cần cài gì để debug bạn nhỉ?
=)) hay không
Viết đỉnh vl.
Hóng chốt 1 con đổi đời mà không có
Cảm ơn bạn đã truyển tải kiến thức
Thanks anh, hóng phần 2 quá


ok mình sẽ sớm cập nhật lên git
bài viết rất hay và dễ hiểu, mong bạn ra thêm nhiều bài nữa về js và reactjs
ồ cái này đúng nè, thanks bận
Phát biểu rằng state là imutable và readonly là đúng, nhưng mới chỉ đúng một nửa câu chuyện, và ví dụ bạn lấy là sai. Cốt lõi vấn đề đó là địa chỉ. React ko phép gán biến state sang địa chỉ mới mà ko thông qua hàm setState, đồng thời React nhận biết và render lại màn hình dựa vào sự thay đổi địa chỉ ấy. Nhưng vẫn có cách làm thay đổi giá trị của biến state mà ko làm thay đổi địa chỉ của biến. Sau đây là 2 practice điển hình trong thực tế:
Đương nhiên ko khuyến khích làm cách này, vì rất khổ cho người fix bug. Chúng ta nên làm theo luồng logic thông thường, khi nào cần gán giá trị mới thì khởi tạo hay là chế một object, một array mới rồi dùng setState mà gán. Trong trường hợp muốn gán ngay mà ko đợi vòng đời sau mới cập nhật thay đổi, bạn có thể thay bằng dùng useRef, hoặc ok dùng cách này nếu bạn biết chắc mình đang làm cái gì và có ảnh hưởng gì ko. Vì màn hình sẽ render lại mỗi khi state thay đổi, vậy nên bạn cần đặt câu hỏi lớn hơn, "Chỗ này có cần thiết phải render lại ko? Chỗ này có khiến chương trình bị render quá nhiều ko?". Từ đó bạn đưa ra quyết định.
showbiz có Trấn Thành nói câu nào là trending câu đó, viblo có Trực sa tank viết bài nào trending bài đó
Bài viết bổ ích quá, chắc bạn chịu khó tnay thì k có bạn gái đâu nhỉ
oke bạn nhé
má, cám ơn bác nhiều. nãy giờ thấy code mẫu trên gg ko hiểu tại sao phải có nginx trong khi local có cần nginx đâu
tks
tuyệt vời!
Tôi cũng đang làm theo cách này, quản lý view/css/js = thư mục đánh theo tên là đc mà.
Bác giải thích giúp e là tại sao của e luôn bị sender nốt found k ạ. e đã làm như hướng dẫn rồi
@dinhmh Khi tạo payload, mình đã đệm
=00
vào giữa những chữ cái để khiconvert.quoted-printable-decode
nó sẽ xóa hết những byte đó đi, sau đó như mình đã giải thích phía trên, sử dụng chuyển đổi bảng mã UTF-16 sang UTF-8 để loại bỏ Payload thứ 2 và decode base64 để ra đoạn mã hoàn chỉnh