赞
踩
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 (
- <div>
- Category:
- <h2>userInfo: name: {userInfo.name} age: {userInfo.age}</h2>
- <h2>category: name: {category}</h2>
- <button onClick={ e => this.changeCategoryName('你好 世界')}>修改</button>
- <div>
- <h2>banners数据:</h2>
- <ul>
- {
- banners.map((item, index) => {
- return <li key={index}>{item.title}</li>
- })
- }
- </ul>
- </div>
- <div>
- <h2>recommends数据:</h2>
- <ul>
- {
- recommends.map((item, index) => {
- return <li key={index}>{item.title}</li>
- })
- }
- </ul>
- </div>
- </div>
- )
- }
- }
-
- 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)

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。