Mọi người thường chọn Redux trước khi họ cần nó. "Nhỡ app chúng ta không thể mở rộng mà không có Redux thì sao?". Sau đó, dev lại cau mày khi nhìn vào code của họ khi dùng Redux. "Sao lại phải chạm vào 3 file chỉ để chạy 1 feature đơn giản?".
Mọi người đổ lỗi cho Redux, React, lập trình hàm (functional programming), tính bất biến (immutability) và rất nhiều thứ khác vì họ thường so sánh với cách tiếp cận không yêu cầu "boilerplate" để cập nhật state, rồi họ kết luận luôn Redux là phức tạp. Redux bản chất thực sự là phức tạp mà, thiết kế từ đầu đã phức tạp rồi.
Redux yêu cầu:
- Mô tả state của application như những plain object và array.
- Mô tả những thay đổi trong hệ thống như những plain object.
- Mô tả logic xử lý những thay đổi như những function thuần.
Tất cả những hạn chế trên đều không bắt buộc khi xây dựng app (kể cả dùng hay không dùng React). Chúng thậm chí còn là những hạn chế rất lớn, nên bạn phải suy nghĩ thật kĩ trước khi áp dụng Redux dù chỉ một phần trong app của bạn.
Bạn có lý do thật sự tốt để áp dụng chúng không?
Tôi thì lại thấy chúng rất hay vì chúng giúp tạo app:
- Bắt local storage duy trì state rồi khởi động thẳng từ đó.
- Tạo đủ state trước trên server, gửi cho người dùng dưới định dạng HTML và chạy luôn.
- Sắp xếp hoạt động của người dùng rồi gắn vào phần thông báo bug cùng với snapshot của state, để dev tiện kiểm tra bug.
- Đưa những object action qua network để tạo môi trường làm việc theo nhóm mà không cần thay đổi quá nhiều code.
- Duy trì history để có thể undo hoặc áp dụng thay đổi khác mà không cần sửa kiểu viết code.
- Kiểm tra history của state trong quá trình phát triển và đánh giá lại state hiện tại từ history action khi code thay đổi.
- Cho khả năng giám sát và kiểm soát thông qua devtool, dev có thể tạo tool riêng cho app của họ.
- Cho dev sự lựa chọn về UI mà vẫn tái sử dụng được business logic.
Nếu bạn làm việc với extensible terminal, Javascript debugger, hoặc một số loại webapp khác, bạn có thể lựa chọn Redux, hoặc ít nhất cân nhắc một trong những ý tưởng của nó (chúng không hề mới).
Nếu bạn mới bắt đầu học React, đừng chọn Redux đầu tiên.
Thay vào đó hãy học nghĩ theo hướng React. Quay lại Redux khi bạn thực sự cần nó, hoặc bạn muốn thử thứ gì đó mới. Nhưng nên tiếp cận nó một cách cẩn thận.
Nếu bạn buộc phải làm việc theo cách của Redux, đó là dấu hiệu của đồng nghiệp coi trọng nó quá mức. Redux chỉ là một tool thôi, một thử nghiệm vượt giới hạn.
Tóm lại, bạn đừng quên là bạn có thể tận dụng ý tưởng của Redux mà không cần sử dụng nó. Ví dụ, xem thử React component với local state sau:
import React, { Component } from 'react';
class Counter extends Component {
state = { value: 0 };
increment = () => {
this.setState(prevState => ({
value: prevState.value + 1
}));
};
decrement = () => {
this.setState(prevState => ({
value: prevState.value - 1
}));
};
render() {
return (
<div>
{this.state.value}
<button onClick={this.increment}>+</button>
<button onClick={this.decrement}>-</button>
</div>
)
}
}
Để như vậy là quá đẹp rồi. Bạn thậm chí có thể tái sử dụng component trên.
Sử dụng Redux, bạn sẽ phải thêm indirection vào để phân biệt "cái gì đã xảy ra" với "mọi thứ thay đổi như nào".
Lúc nào cũng làm như vậy là tốt? KHÔNG. Đó là thứ bạn phải đánh đổi khi dùng Redux.
Ví dụ, chúng ta có thể thu được reducer từ component:
import React, { Component } from 'react';
const counter = (state = { value: 0 }, action) => {
switch (action.type) {
case 'INCREMENT':
return { value: state.value + 1 };
case 'DECREMENT':
return { value: state.value - 1 };
default:
return state;
}
}
class Counter extends Component {
state = counter(undefined, {});
dispatch(action) {
this.setState(prevState => counter(prevState, action));
}
increment = () => {
this.dispatch({ type: 'INCREMENT' });
};
decrement = () => {
this.dispatch({ type: 'DECREMENT' });
};
render() {
return (
<div>
{this.state.value}
<button onClick={this.increment}>+</button>
<button onClick={this.decrement}>-</button>
</div>
)
}
}
Nhận thấy việc chúng ta sử dụng Redux mà không cần npm install không? Tuyệt vời.
Bạn có nên làm như trên với stateful component không? Chắc là không nếu bạn không lên kế hoạch để thực sự tận dụng được nó. Lên kế hoạch trước luôn là chìa khóa để thành công đấy.
Thư viện Redux chỉ là công cụ giúp đỡ để gắn reducer vào object store global duy nhất. Bạn có thể sử dụng Redux bao nhiêu cũng được.
Nhưng nhớ là phải lên chiến lược tận dụng tối đa sức mạnh của nó trước khi áp dụng nhé.
Bài viết được dịch từ nguồn: https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367#.4wglzpgpp
Bình luận