Flux
FLUX 是一种架构思想,是一种模式
Redux-toolkit
Quick Start
- 通过 createSlice 创建状态分片, 配置: initialState, action; 导出 actions 以及需要用的状态
1 | import { createSlice } from '@reduxjs/toolkit' |
- 通过
configureStore
以及配置的 reducer 创建 store 对象
1 | import { configureStore } from '@reduxjs/toolkit' |
- 引入 store 对象, 包装组件
1 | import { store } from './05-router/redux/store' |
- 消费者中可以通过 dispatch 发出 action
1 | import { useDispatch } from 'react-redux' |
- 消费者可以通过 useSelector 获得状态
import { useSelector } from 'react-redux' |
异步 Trunk 创建
涉及到异步请求时, 我们要管理异步请求的状态并更新 store 中的状态
通过 createAsyncThunk 创建异步 Trunk 并导出: 名字方便管理, 将处理正常时的结果进行返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14import axios from "axios";
import { createAsyncThunk } from "@reduxjs/toolkit";
export const loadCinemaList = createAsyncThunk('cinema/loadCinemaList', async () => {
const response = await axios({
url: "https://m.maizuo.com/gateway?cityId=110100&ticketFlag=1&k=1237115",
method: "get",
headers: {
'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.0","e":"1649749646626811822145537"}',
'X-Host': 'mall.film-ticket.cinema.list'
}
})
return response.data.data.cinemas
})在状态切片的
extraReducers
属性中配置 asyncThunk 的状态管理:fulfilled
会获取处理结果
1 | export const cinemaSlice = createSlice({ |
Redux
仅仅是 Flux 的一种实现, 用于应用状态的管理, 用一个单独的状态向量树(State), 维护一整个应用的状态
主要有三大原则:
- state 以单一对象存储在 store 对象中
- state 只读, 每次都返回一个新的对象
- 使用纯函数(对外界没有副作用的函数) reducer 执行 state 更新
Quick Start
store
对象用于统一接口, 然后 reducer
负责处理状态变化
Installation:
npm i redux
Create
store
Object and actions:
1 | import {createStore} from 'redux' |
actions
1 | function setHeaderNameAction(headerName) { |
- 订阅与发布
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import {setHeaderNameAction} from '../../../redux/actionCreator/HeaderAction'
import headerStore from '../../../redux/HeaderStore'
const setHeaderName = useCallback((headerName) => {
return () => {
headerStore.dispatch(setHeaderNameAction(headerName))
}
}, [])
import headerStore from '../../redux/HeaderStore'
useEffect(() => {
headerStore.subscribe(() => {
setHeaderName(headerStore.getState().headerName)
})
}, [])
CombineReducers
如果不同的 action 所处理的属性之间没有联系, 我们可以把 Reducer 函数拆分, 不同的函数负责处理不同属性, 最终把它们合并成一个大的 Reducer 即可
1 | import {createStore, combineReducers} from 'redux' |
异步请求的处理
redux-trunk
通过 action 与 中间件 进行异步请求处理, 然后下发 action
中间件: 是用于处理异步请求的
1 | export default function thunkMiddleware({ dispatch, getState }) { |
这时如果 action
是一个函数的话, 那么就会执行, 并将 dispatch
与 getState
函数接口给出, 供异步函数处理完成后回调使用
Quick Start
Installation:
npm i redux-thunk
应用中间件
import reduxTrunk from 'redux-trunk'
import {applyMiddleware, combineReducers, createStore} from 'redux'
const store = createStore(reducer, applyMiddleware(reduxThunk));获取
dispatch
与getState
接口
1 | function getCinemaListAction() { |
redux-promise
Installation:
npm i redux-promise
应用中间件
import reduxPromise from 'redux-promise'
import {applyMiddleware, combineReducers, createStore} from 'redux'
const store = createStore(reducer, applyMiddleware(reduxThunk, reduxPromise)); // 支持多个中间件这时支持在
dispatch
时传入函数并支持promise
返回
1 | function getCinemaListAction() { |