Actions, reducers, action creators, middleware, pure functions, immutability, những ngoại ngữ làm rối bất kỳ ai nếu chưa biết redux
Nếu chưa biết tại sao lại sinh ra thằng Redux này, có thể xem ở tuts trước của mình.
Chỉ sử dụng State của React
Component sẽ build
Counter
Giải thích ngắn gọn cho dễ theo dõi
- Giá trịcountđược lưu trongstatecủa componentCounter
- Khi user click +, hàmincrementsẽ tăng giá trịcountlên
- Khi state bị thay đổi, React sẽ render lạiCountervà những component bên trong của nó, giá trị mới sẽ hiển thị
Thêm Redux
Như đã đề cập trong tuts trước, Redux lưustatelại trong 1 cáistore, tranh lẫn lộn,storelà nơi lưustate, vàstatedữ liệu.
Cài redux và react-redux package
Tại sao phải 2 cái package?, cái redux chỉ cho ta cáistore, để lấy được cáistatera, sử dụng hàmconnecttrongreact-redux, vì redux không phải chỉ làm việc chung được với React thôi không, nó có thể chơi với Vue, Angular không chừng.
Bỏ state đi
Counter
connectnó với store thôi
Ok vậy là xong phần connect component với các state ở trongstore, chúng ta cần khai báo Store!
Bọc toàn bộ cáiAppbên trong componentProvidercủareact-reduxđể tất cả component bên trongAppcó thể sử dụng hàmconnectđể gọi đếnstore
Chưa xong, chúng ta phải setup cái store để đưa vào cho Provider
Vẫn chưa đủ, thật sự Redux không được thông minh như chúng ta tưởng tượng, lúc đầu mình đã nghĩ rằng khi create store như vậy nó sẽ cho mình những giá trị default bên trong store. Nhưng không chúng ta phải làm tay tất cả. Chúng ta phải cung cấp cho nó 1 hàm gọi làreducer, cái hàmreducernày phảireturnvề một giá trị cho state, luôn phải return state nhé. Bên trongreducerta sẽ xào nấu state theo yêu cầu, nó sẽ nhận state hiện tại và trả về state mới.
Action
Action là gì, nó đóng vai trò như thế nào và nó đến từ đâu? Làm thế nào mà ta đổi giá trịcounter?
actionlà 1 JS object nó sẽ cho biết bạn đang muốnordermón nào, như tờ giấy ghiordertrong nhà hàng ấy mà, nó sẽ chưa thông tin món bạn order, đầu bếpreducersẽ dựa vào đó mà xào nấu ra món bạn order
Reducer sẽ căn cứ vàoaction.typeđể thực hiện thay đổi và trả về state mới, nên nhớ chúng ta phải LUÔN LUÔN trả về state trongreducer, nếu có hay không có thay đổi cũng phải trả vềstate
Không bao giờ được phép thay đổi State trực tiếp
State là một immutable object, tuyệt đốiKHÔNGthay đổi state như sau
Làm như vậy cũng cấm tuyệt đối nhé:
- state.foo = 7
- state.items.push[newItem]
- delete state.something
Action từ đâu mà có
Action không tự sinh ra, nó đượcdispatchra từ hàmdispatch. Hàmdispatchthì đặc biệt là nó không được import, mình có thể gọistore.dispatch[someAction], nhưng cái store này thì nó năm ở trong 1 file thôi, Vậy hàmdispatchnày làm sao có đây?
Thật ra lúc chúng ta gọiconnectthì hàmconnectcũng đãmapcái hàmdispatchvào trong props của component luôn.
Counter
TopDev via Vuilaptrinh