Vì vậy, tôi đã bắt đầu học React cách đây một tuần và chắc chắn tôi đã gặp phải vấn đề về trạng thái và cách các thành phần phải giao tiếp với phần còn lại của ứng dụng. Tôi đã tìm kiếm xung quanh và Redux dường như là hương vị của tháng. Tôi đã đọc qua tất cả các tài liệu và tôi nghĩ đó thực sự là một ý tưởng mang tính cách mạng. Đây là suy nghĩ của tôi về nó:
State thường được đồng ý là khá xấu và là một nguồn lỗi lớn trong lập trình. Thay vì phân tán tất cả trong ứng dụng của bạn, Redux nói tại sao không chỉ tập trung tất cả trong một cây trạng thái toàn cục mà bạn phải thực hiện các hành động để thay đổi? Nghe có vẻ thú vị. Tất cả các chương trình đều cần trạng thái, vì vậy hãy gắn nó vào một không gian không tinh khiết và chỉ sửa đổi nó từ bên trong đó để các lỗi dễ theo dõi. Sau đó, chúng tôi cũng có thể khai báo liên kết các phần trạng thái riêng lẻ với các thành phần React và để chúng tự động vẽ lại và mọi thứ đều đẹp.
Tuy nhiên, tôi có hai câu hỏi về toàn bộ thiết kế này. Đối với một, tại sao cây trạng thái cần phải là bất biến? Giả sử tôi không quan tâm đến gỡ lỗi du hành thời gian, tải lại nóng và đã triển khai hoàn tác / làm lại trong ứng dụng của mình. Nó chỉ có vẻ rất cồng kềnh để phải làm điều này:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Thay vì điều này:
case COMPLETE_TODO:
state[action.index].completed = true;
Chưa kể tôi đang làm một bảng trắng trực tuyến chỉ để tìm hiểu và mọi thay đổi trạng thái có thể đơn giản như thêm một nét vẽ vào danh sách lệnh. Sau một thời gian (hàng trăm nét vẽ), việc sao chép toàn bộ mảng này có thể bắt đầu trở nên cực kỳ tốn kém và tốn thời gian.
Tôi ổn với cây trạng thái toàn cục độc lập với giao diện người dùng được thay đổi thông qua các hành động, nhưng nó có thực sự cần phải bất biến không? Có gì sai với một triển khai đơn giản như thế này (bản nháp rất thô. Được viết trong 1 phút)?
var store = { items: [] };
export function getState() {
return store;
}
export function addTodo(text) {
store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
store.items[index].completed = true;
}
Nó vẫn là một cây trạng thái toàn cục được biến đổi thông qua các hành động được phát ra nhưng cực kỳ đơn giản và hiệu quả.
immutablejs
và sử dụngreturn state.setIn([action.index, 'completed'], true);
để giảm bớt các tấm lò hơi.