Copy Link

React Learning Day 5: React Redux Part 1

Redux是一個完整的js狀態管理解決方案。Redux與context相比,redux在狀態管理方面更加精細,性能更占優勢。

本文以Modern Redux的角度了解狀態切片、減速器的基本使用。

Installation

npm install @reduxjs/toolkit react-redux

createSlice

createSlice用於創建狀態切片。在狀態層面可以存在多個切片,例如themeSlider、userSlider、fileSlider等。

createSlice接受的參數包括:

type ListState = {
    items: Array<string>
}

export const listSlice = createSlice({
    name: 'list',
    initialState: {
        items: [],
    } as ListState,
    reducers: {
        add: (state, action: PayloadAction<string>) => {
            state.items.push(action.payload)
        },
    }
})

export const { add } = listSlice.actions

configureStore

定義應用級別的狀態倉庫,通常且最佳實踐是一個App只存在一個store

export const store = configureStore({
    reducer: {
        list: listSlice.reducer,
    }
})

export type AppRootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch

useSelector和useDispatch用於獲取和修改狀態,默認不提供類型。創建附帶類型的hooks(可選的):

export const useAppSelector = useSelector.withTypes<AppRootState>()
export const useAppDispatch = useDispatch.withTypes<AppDispatch>()

在應用級別的DOM層中提供數據:

<Provider store={store}>
    <App></App>
</Provider>

useSelector

useSelector用於獲取store中的狀態。

// 推薦在hooks中創建附帶類型的useAppSelector來代替useSelector
export const useAppSelector = useSelector.withTypes<AppRootState>()

// App Component
const items = useAppSelector((s) => s.list.items)
return (
    <div>
        <ul>
            {items.map(item => <li>{item}</li>)}
        </ul>
    </div>
)

useDispatch

useDispatch用於發送action以觸發狀態更新。

// 推薦在hooks中創建附帶類型的useAppDispatch來代替useDispatch
export const useAppDispatch = useDispatch.withTypes<AppDispatch>()

// App Component
const dispatch = useAppDispatch()
return <button onClick={() => dispatch(add('new item'))}>Add</button>