npm install @reduxjs/toolkit
const categorySlice = createSlice({
name: "category",
initialState: {
category: "hello world",
banners: [],
recommends: []
},
reducers: {
changeCategory(state, action) {
state.category = action.payload
}
}
})
export const { changeCategory } = categorySlice.actions
export default categorySlice.reducer
import { configureStore } from "@reduxjs/toolkit"
import counterReducer from './features/counter'
import homeReducer from './features/home'
import userInfoReducer from './features/userInfo'
import categoryReducer from './features/category/category'
// react-toolkit工具包使用方式
const store = configureStore({
reducer: {
counter: counterReducer,
home: homeReducer,
userInfo: userInfoReducer,
category: categoryReducer
}
})
export default store
以往对于redux中的异步操作,通过redux-thunk中间件让dispatch中可以进行异步操作。
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"
import axios from "axios"
export const fetchHomeMultidataActions = createAsyncThunk("fetch/homeMultidata", async () => {
const res = await axios.get('http://123.207.32.32:8000/home/multidata')
return res.data
})
类似于promise, 参考promise的执行状态
Redux Toolkit在createSlice中通过extraReducer参数可以监听这些状态的过程:
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"
import axios from "axios"
export const fetchHomeMultidataActions = createAsyncThunk("fetch/homeMultidata", async () => {
const res = await axios.get('http://123.207.32.32:8000/home/multidata')
return res.data
})
const categorySlice = createSlice({
name: "category",
initialState: {
category: "hello world",
banners: [],
recommends: []
},
reducers: {
changeCategory(state, action) {
state.category = action.payload
}
},
extraReducers: {
[fetchHomeMultidataActions.pending](state, action) {
console.log("pending");
},
[fetchHomeMultidataActions.fulfilled](state, {payload}) {
state.banners = payload.data.banner.list
state.recommends = payload.data.recommend.list
},
[fetchHomeMultidataActions.rejected](state, action) {
console.log("rejected");
}
}
})
export const { changeCategory } = categorySlice.actions
export default categorySlice.reducer
通过Redux Toolkit创建store,对于store的数据使用,与传统的store数据获取方式一样,Redux Toolkit只是在store的初始化与逻辑编写进行了封装。
category.jsx
import React, { PureComponent } from 'react'
// import { fetchHomeMultidataActions} from '../../store/features/home'
import { changeCategory, fetchHomeMultidataActions } from '../../store/features/category/category'
import { connect } from 'react-redux'
export class Category extends PureComponent {
componentDidMount() {
// 抽离axios到redux
this.props.fetchHomeMultidata()
}
changeCategoryName(name) {
this.props.changeCategory(name)
}
render() {
const { userInfo, category, banners, recommends } = this.props
return (
Category:
userInfo: name: {userInfo.name} age: {userInfo.age}
category: name: {category}
banners数据:
{
banners.map((item, index) => {
return - {item.title}
})
}
recommends数据:
{
recommends.map((item, index) => {
return - {item.title}
})
}
)
}
}
const mapStateToProps = (state) => ({
userInfo: state.userInfo.userInfo,
category: state.category.category,
banners: state.category.banners,
recommends: state.category.recommends
})
const mapDispatchToProps = (dispatch) => ({
// changeBanners(banners) {
// dispatch(changeBannersActions(banners))
// },
// changeRecommends(recommends) {
// dispatch(changeRecommendsActions(recommends))
// }
fetchHomeMultidata() {
dispatch(fetchHomeMultidataActions())
},
changeCategory(name) {
dispatch(changeCategory(name))
}
})
export default connect(mapStateToProps, mapDispatchToProps)(Category)