Là một hàm có hai đối số: stateaction. Giá trị trả về của hàm này là một state mới. Mô tả ngắn gọn như sau:

reducer = (state, action) => newState

Có thể xem reducer giống như event listener (xem thêm JS Event).

Rules of Reducer

Reducer cần tuân thủ các quy tắc sau:

  • Chỉ tính toán state mới dựa trên stateaction truyền vào.
  • Không được mutate state hiện tại (tính immutability).
  • Không thực hiện các tác vụ bất đồng bộ hoặc tính toán các giá trị ngẫu nhiên.

Mục tiêu chính của Redux là làm code trở nên có thể dự đoán được. Khi giá trị đầu ra được tính toán dựa trên giá trị đầu vào, output sẽ có thể dự đoán một cách dễ dàng. Điều này làm cho code dễ hiểu và dễ test hơn

Nếu reducer phụ thuộc vào các biến bên ngoài, output của nó sẽ trở nên bất định, dẫn đến việc chúng ta sẽ không kiểm soát được luồng thực thi của chương trình.

Seealso

Xem thêm Keeping Components Pure.

The Logic Inside Reducer

Khi có một sự kiện xảy ra, reducer sẽ kiểm tra xem nó có lắng nghe sự kiện đó hay không.

  • Nếu có, tạo ra một bản sao của state, đồng thời cập nhật giá trị cho bản sao này và trả về bản sao như là một state mới.
  • Nếu không, trả về state hiện tại.

Ví dụ minh họa:

const initialState = { count: 0 }
 
function counterReducer(state = initialState, action) {
	switch (action.type) {
		case "counter/increment":
			return {
				...state,
				count: state.count + action.payload,
			}
		case "counter/decrement":
			return {
				...state,
				count: state.count - action.payload,
			}
		default:
			return state
	}
}

Why Are They Called ‘Reducers?‘

Cái tên “reducer” có ý nghĩa tương tự với phương thức reduce của mảng (xem thêm Higher Order Array Methods).

Nhóm phát triển thư viện sử dụng tên này là vì giữa reducer và reduce có một số điểm tương đồng nhất định:

  • Đều trả về một giá trị từ một hoặc nhiều giá trị.
  • Đều tính toán giá trị mới dựa trên kết quả trước đó và giá trị hiện tại.
list
from [[Redux Reducer]]
sort file.ctime asc

Resources