Setup Redux cho ứng dụng Next.js
Chuẩn bị
Trước khi bắt đầu setup Redux cho ứng dụng của mình, bạn cần phải tạo một ứng dụng mới với Next.js trên máy của mình. Bạn hãy kiểm tra lại, trước khi tiếp tục bài học này nhé.
Cài đặt các thư viện cần thiết
Cách nhanh nhất để setup Redux cho một ứng dụng Next.js là sử dụng thư viện “next-redux-wrapper”. Để cài đặt thư viện này, bạn cd
vào thư mục chứa ứng dụng của mình trên terminal và chạy câu lệnh sau:
yarn add next-redux-wrapper react-redux @reduxjs/toolkit --save
Trong câu lệnh trên:
next-redux-wrapper
là sẽ xử lý các setup phức tạp của Reduxreact-redux
là thư viện cần thiết để thích hợp Redux vào ứng dụng viết bằng React.js@redux/toolkit
là thư viên tổng hợp các API chính của redux như tạoaction
,reducer
, v/v
Setup Redux
Bước tiếp theo, ta sẽ tạo Redux store
cho ứng dụng. Trong thư mục gốc của ứng dụng, tạo một thư mục mới với tên redux
. Thư mục này sẽ phần code để xử lý các tác vụ liên quan đến Redux.
Sau đó, bạn tạo file store.js
trong thư mục ./redux
mới vừa tạo. Sau khi tạo file, bạn sẽ có các thư mục như sau:
Trong file ./redux/store.js
, bạn khởi tạo redux store với code như sau:
import { configureStore } from '@reduxjs/toolkit'
// import { createStore } from 'redux';
import {combineReducers, configureStore} from '@reduxjs/toolkit'
import { createWrapper } from 'next-redux-wrapper'
const store = configureStore({
reducer: combineReducers({}),
devTools: true,
})
export const makeStore = () => store
// export an assembled wrapper
export const wrapper = createWrapper(makeStore, { debug: true })
Sau đó, bạn vào file ./page._app.js
và tiến hành kết nối redux store với ựng dụng của minh. Trước tiên, bạn import
wrapper
từ file ./redux/store.js
vừa tạo trogn ./pages/_app.js
:
// ./pages/_app.js
import {wrapper} from "../redux/store"
Sau đó, thay đổi câu lệnh export default
trong ./pages/_app.js
thành:
// ./pages/_app.js
export default wrapper.withRedux(MyApp)
Đến đây, ứng dụng của bạn đã được kết nối thành công với một Redux store
rỗng rồi. Tiếp theo, ta cần phải tạo các Reducers
để xử lý dữ liệu được lưu trên Redux store
.
Tạo Reducer đầu tiên
Dữ liệu được lưu trong Redux dưới dạng Javascript Object
với nhiều keys
khác nhau. Trong ví dụ sau, Redux store
của chúng ta chỉ có một key
duy nhất là playlistData
:
Mỗi một key
như vậy sẽ được xử lý bằng một Reducer
, và với Redux Toolkit
việc tạo reducer đã dễ dàng hơn rất nhiều. Trong thư mục ./redux
, bạn tạo file playlistDataSlice.js
với nội dung như sau:
import { createAction } from "@reduxjs/toolkit";
import { HYDRATE } from "next-redux-wrapper";
const hydrate = createAction(HYDRATE)
const initialState = {
currentPlaylist: null,
allPlaylists: []
}
export const playlistData = createSlice({
name: 'playlistData',
initialState: initialState,
reducers: {
},
extraReducers(builder) {
builder.addCase(hydrate, (state) => {
return {
...state,
}
})
},
})
const { reducer } = playlistData
export default reducer
Đoạn code từ dòng 21 – 27 dùng để xử lý dữ liệu trong trường hợp bạn sử dụng các function “getStaticProps” hoặc “getInitialProps” của Next.js. Chúng ta sẽ có các bài học về các function này trong tương lai.
Hiện tại, ta chỉ ta chỉ có dữ liệu đầu vào của state
platlistData
(object initialState
). Ta cần thêm một vài reducer
nữa để xử lý state. Trong file ./redux/playlistDataSlice.js
, bạn thêm một số method
cho object reducers
bên trong function createSlice
:
reducers: {
setCurrentPlaylist(state, action) {
state.currentPlaylist = action.payload.currentPlaylist
},
setAllPlaylists(state, action) {
state.allPlaylists = action.payload.allPlaylists
}
},
Ta tạo thêm hai reducer cho playlistDataSlice
:
setCurrentPlaylist
: chọn playlist mà ta muốn xemsetAllPlaylists
: lưu tất cả playlist ta có vàostore
.
Các ta có thể export các action
để chạy hai reducer trên thông qua actions
được cung cấp bởi Redux Toolkit như sau:
const { actions, reducer } = playlistData
export const {setAllPlaylists, setCurrentPlaylist} = actions
Tiếp theo, ta cấn kết nối playlistDataSlice
vào store
. Trong file ./redux/store.js
, import
playlistDataSlice
và đặt vào combineReducers
:
// ./redux/store.js
...
import playlistDataSlice from "./playlistDataSlice";
...
const store = configureStore({
reducer: combineReducers({
playlistData: playlistDataSlice
}),
devTools: true,
})
Như vậy ta đã setup xong Redux store
với một key
là playlistData
Bây giờ, bạn có thể mở browser và dùng Redux DevTools Extension để kiểm tra Redux store
của mình. Bạn có thể tiếp tục công việc của mình với Redux store
đã được thiết lập. Hoặc bạn có thể tìm hiểu thêm về cách kết nối Redux vào React Component.
Tags In
Related Posts
Leave a Reply Cancel reply
Categories
- Bài viết (1)
- Blog (24)
- Code Review (3)
- Course Introduction (2)
- CSS (4)
- CSS Grid (4)
- Javascript (2)
- Lesson (11)
- Lưu dữ liệu trên trình duyệt (1)
- Network Requests (1)
- OneDirect Projects (1)
- Product Review (3)
- Stage Content (16)
- WCS Courses Content (17)