React-Redux结合@Reduxjs/ToolKit使用类组件版本(二)

@Reduxjs/Toolkit 简称RTK 相对Redux 的优势是什么?

总结成一段话:
@reduxjs/toolkit 是 Redux 官方推出的工具包,旨在简化和加速 Redux 应用的开发。它提供了一组开发 Redux 应用常用功能的抽象和封装,包括 Redux 中的状态管理、中间件集成、异步操作和开发者工具等,以减少样板代码和提高开发效率。

@Reduxjs/ToolKit 主要特性和优势包括:

1.集成了 Redux 常用的功能:@reduxjs/toolkit 包含了 Redux 的核心功能,如创建 action 和 reducer 以及触发 state 更新。这使得开发者无需手动编写大量的 Redux 代码,并提供了一些额外的便利方法来简化开发流程。

2.自动化的 Redux store 配置:通过 configureStore 函数,@reduxjs/toolkit 提供了自动生成和配置 Redux store 的方式。它默认集成了常用的中间件(如 Redux Thunk),同时还可以启用 Redux DevTools Extension,并具有优化性能的功能。

3.简化的 reducer 写法:@reduxjs/toolkit 使用 createSlice 函数来定义 reducer,它会自动生成对应的 action 和 reducer 代码。这样可以极大地减少样板代码和提高代码可读性。

4.异步流程处理:@reduxjs/toolkit 内置了 Redux Thunk 中间件,这使得处理异步逻辑变得更简单。开发者可以轻松地编写异步的 action 创建函数,处理网络请求或其他副作用。

5.Immutable 更新:@reduxjs/toolkit 内置了 Immutable.js 库,可以自动处理 state 的不可变性。这消除了手动编写不可变更新代码的需要,使得状态管理更加简洁和可靠。

React-Redux 结合 Reduxjs/Toolkit 解决了什么问题?

总结成一句话:
@reduxjs/toolkit 相比,react-redux 是一个专为 React 应用开发而设计的基于 Redux 的库。它提供了一系列的 API 和组件,方便在 React 组件中使用 Redux 进行状态管理。主要区别如下:
1.范围:@reduxjs/toolkit 主要关注 Redux 的封装和工具化,而 react-redux 则是针对 React 应用的状态管理解决方案。

2.功能:@reduxjs/toolkit 包含了 Redux 的核心功能,包括 store 配置、reducer 和 action 的创建等。而 react-redux 提供了一些特定于 React 的功能,如 connect 函数和 Provider 组件,用于连接 Redux 的 store,并将状态传递给 React 组件。

3.抽象程度:@reduxjs/toolkit 提供了更高层次的抽象,通过封装和约定来简化 Redux 的使用。而 react-redux 则是在 Redux 基础上提供了一些 React 相关的实现和优化。

总结

综上所述,@reduxjs/toolkit 是一个针对 Redux 的工具包,旨在简化和加速 Redux 应用的开发。而 react-redux 是一个专为 React 应用开发而设计的基于 Redux 的库,提供了一些特定于 React 的功能和组件。两者在功能和应用范围上有所不同,但可以一起使用,以便更高效地开发 React 应用并管理状态。

实操

说明:本实操是基于React版本是18.0版本
1.安装 react-redux、@reduxjs/toolkit
2.构建store 目录且创建主文件index.js
//注意:从以前的createStore 变成了configureStore
import {configureStore} from "@reduxjs/toolkit"
//注意采用的是从切片中默认导出reducer
import countReduer from "./reducers/countSlice"
//注意采用的是从切片中默认到处reducer
import personReducer from "./reducers/personSlice"
export default configureStore({
      //配置reducer
      reducer:{
           count:countReduer,
           person:personReducer
      }
})
3.构建reducers文件夹,放各种store切片文件,里面分别有personSlice.js、countSlice.js文件
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";

const personSlice = createSlice({
  name: "person",
  initialState: {
    persons: [],
    newWorkPersons: [],
  },
  reducers: {
    //添加人员
    addPerson: (state, action) => {
      state.persons.push(action.payload);
    },
  },
  //处理异步,多个异步构建多个case
  extraReducers: (bulid) => {
    bulid.addCase(getPersonApi.fulfilled, (state, action) => {
      state.newWorkPersons.slice(0);

      state.newWorkPersons = [...action.payload];
    });
  },
});

//注意:异步直接导出,然后使用异步函数createAsyncThunk 构建异步模块
export const getPersonApi = createAsyncThunk("person/getPerson", async () => {
  //本地用Express模拟出来的接口
  const getInfo = await fetch("http://localhost:5000/persons");
  return getInfo.json();
});
export const { addPerson } = personSlice.actions;
export default personSlice.reducer;

countSlice.js代码内容如下:
import {createSlice} from "@reduxjs/toolkit"

const countSlice=createSlice({
    // 名称
     name:'count',
    // 初始化状态
     initialState:{
        //默认设置数量为10
        count:10,
     },
     reducers:{
           //添加值,state 状态和action动作
           addValue:(state,action)=>{
               state.count+=action.payload
                 
               console.log(state,action,'state,action....')
           },
           subStractValue:(state,action)=>{
               state.count-=action.payload
            console.log(state,action,'-state,action....')
           }

     }
})
//默认导出动作
export const {addValue,subStractValue}=countSlice.actions
//默认导出reducer reducer 是一个纯函数,是简化、归纳的意思
export  default countSlice.reducer

4.index.js主入口文件的配置
import ReactDOM from "react-dom/client"
import App from "./App.js"
import React from "react"
import {Provider} from "react-redux"
import store from "./store/index"
const root= ReactDOM.createRoot(document.querySelector("#root"))

root.render(
    <React.StrictMode>
         {/* react-redux 提供全局store */}
       <Provider store={store}>
        <App/>
        </Provider>
    </React.StrictMode>
)

5.person页面组件展示
import { Component } from "react";
import { connect } from "react-redux";
import { nanoid } from "nanoid";
//获取人员的接口
import { addPerson, getPersonApi } from "../../store/reducers/personSlice";
class Person extends Component {
  state = { userName: null, age: null };

  changeHandler = (e) => {
    this.setState({ [e.target.name]: e.target.value });
  };
  btnAdd = () => {
    const obj = {
      userName: this.state.userName,
      age: this.state.age,
      id: nanoid(),
    };
    this.props.addPeron(obj);
  };
  asyncGetPerson = () => {
    console.log("dffff...");
    this.props.asyncGetPerson();
  };
  render() {
    return (
      <div>
        <div>
          <label htmlFor="userName">用户名:</label>
          <input
            type="text"
            id="userName"
            name="userName"
            onChange={this.changeHandler}
          />
        </div>
        <div>
          <label htmlFor="age">年龄</label>
          <input
            type="text"
            id="age"
            name="age"
            onChange={this.changeHandler}
          />
        </div>
        <div>
          <button onClick={this.btnAdd}>添加</button>
          <button onClick={this.asyncGetPerson}>异步获取值</button>
        </div>
        <hr />
        <ul>
          {this.props.personList.map((item, index) => {
            return (
              <li key={item.id}>
                {item.userName}==={item.age}
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    personList: state.person.persons,
  };
}
function mapDispathToProps(dispatch) {
  return {
    addPeron: (data) => dispatch(addPerson(data)),
    //异步分发,分派
    asyncGetPerson: () => dispatch(getPersonApi()),
  };
}
export default connect(mapStateToProps, mapDispathToProps)(Person);



用力页面效果如下:

在这里插入图片描述

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值