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 cho 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 là 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
Theme của mình đã phức tạp ở việc tạo css mới để ghi đè css cũ, thay đổi layout và có tạo ra hai nhánh ở git để quản lý rồi, giờ mình chỉ muốn là laravel có hỗ trợ multiple theme ở trong thư mục resources, tạo 2 view và control nó dc k?
@cyb3reagle Nói chung là cái xóa log kia thì mình k được nhưng 2 người đồng nghiệp của mình thì xóa bt, còn mình thì xóa log bằng cái cách convert file log, vì khi đấy k có payload convert được thì nó sẽ trả về rỗng . Cơ mà bác có phải là minhnb mà em biết k nhỉ :-s.
THẢO LUẬN
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 cho 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ỉnhbạn giải thích thêm về payload ở bước 3 được k?
@Override
Mình đã thử startForceground nhưng khi kill app thì khoảng 20s sau service vẫn ngỏm là sao ạ
Theme của mình đã phức tạp ở việc tạo css mới để ghi đè css cũ, thay đổi layout và có tạo ra hai nhánh ở git để quản lý rồi, giờ mình chỉ muốn là laravel có hỗ trợ multiple theme ở trong thư mục resources, tạo 2 view và control nó dc k?
@cyb3reagle giữa dòng đời tất nập, ta vô tình đâm phầm phập vào nhau 😆
Chúng ta như những người xa lạ vô tình gặp nhau giữa dòng đời thôi bác ơi.
@cyb3reagle Nói chung là cái xóa log kia thì mình k được nhưng 2 người đồng nghiệp của mình thì xóa bt, còn mình thì xóa log bằng cái cách convert file log, vì khi đấy k có payload convert được thì nó sẽ trả về rỗng . Cơ mà bác có phải là minhnb mà em biết k nhỉ :-s.