react中使用redux最简单最方便的方式,配合rematch简化操作,5分钟学会

react中使用状态管理的方式也很多,比如redux和mobx等,今天这一片就讲一下redux的入门到熟练使用,主要是要理解它redux的组成有哪些,到怎么创建,和组建中怎么使用三个问题。这里先放上官网文档,不理解的地方可以看看官方文档:

redux官方文档:Redux 中文文档 · Redux

rematch文档:Installation | Rematch

第一步,创建一个简单的react项目

我这里使用vite直接创建了一个最简单的react项目,vite相比webpack还是简单了,vite官网:开始 | Vite 官方中文文档。 使用命令:

复制代码
npm create vite

然后输入项目名和选择的框架等就可以了:

开始 | Vite 官方中文文档。 使用命令:

第二步,安装redux和相关依赖

安装redux和react-redux:

复制代码
npm install --save redux

// 依赖包
npm install --save react-redux

安装@rematch/corn:

复制代码
npm install @rematch/core

第三步,创建store和使用store

在项目目录下面创建一个store文件夹,然后管理状态:

创建store的前提是先创建有model,model是管理不同的数据状态的最小模块 ,比如user,game,good等不同的模块存储不同的数据状态。model长什么样呢?里面的name,state,reducers,effets都是干什么的呢?

  • state:

    • 存放模块状态的地方。
  • reducers:

    • 改变store状态的地方,每个reducers函数都会返回一个对象作为模块最新的state。

    • reducers中的函数必须为同步函数,如果要异步处理数据需要在effects中处理。

    • 注意:只能通过在reducers的函数中通过返回一个新的对象来改变模块中state的值,直接通过修改state的方式是是不能改变模块的state的值。例:

      复制代码
          increment(state, num1) {  
              state.num = num1  // 这样的写法是错误的
          },
  • effects:

    • 处理异步数据的地方,比如:异步从服务端获取数据。
    • 注意:在effects中是不能修改模块的state,需要在异步处理完数据后调用reducers中的函数修改模块的state。
  • rematch的state、reducers、effects和vuex的state、mutaition、action用法非常相似,在vuex中mutation修改model的state的值,action进行异步处理数据。

下面是一个我写的用户模块:

javascript 复制代码
export default {
  // model名字
  name: 'user',
  // 默认初始状态
  state: {
    userName: '用户名',
    age: 0
  },
  reducers: {
    setUser(state: any, name: any, age: any) {
      return {
        ...state,
        userName: name,
        age: age
      }
    }
  },
  effects: (dispatch: any) => ({
    async getInfoAsync(userId: any, rootState: any) {
      //   模拟调用服务器数据
      console.log('用户信息', userId, rootState)
      //   模拟服务器请求两秒后
      await new Promise((resolve) => setTimeout(resolve, 2000))
      // 使用this.调用的方式:ts会报错的,所以推荐使用下面的dispatch调用
      // this.increment()
      // 使用dispatch调用
      dispatch.user.setUser('王思聪', 38)
    }
  })
}

有了model,就可以创建store了,store怎么创建呢?里面的models是干什么的呢?

初始化store的时候rematch支持传入多个模块,在中、大型项目中可以根据业务的需要,拆分成多个模块,这样项目的结果就会变得清晰明了,所以store里面的models可以存储好多个模块:

javascript 复制代码
import { init } from '@rematch/core'
import user from './user'

const store = init({
  models: {
    user
  }
})

export default store

最后还需要将store挂载到App根节点上:这样下面的所有子组件就可以使用store了

第四步,组建中使用和修改store状态

在子组件中使用store的方式:使用hooks的方式会很方便

javascript 复制代码
import { useSelector, useDispatch } from 'react-redux'
import './App.css'

function App() {
  // 使用hooks的方式引用数据和修改数据:user就是不同的模块
  const userStore = useSelector((state: any) => state.user)
  const dispatch = useDispatch().user

  const setUser = () => {
    console.log('修改用户名', dispatch)
    // 调用异步函数修改
    dispatch.getInfoAsync('123')
  }

  return (
    <>
      <div className='app-main'>
        <div>
          <span>用户名:</span>
          {userStore.userName}
        </div>
        <div>
          <span>年龄:</span>
          {userStore.age}
        </div>
        {/* 点击修改年龄 */}
        <div>
          <button onClick={setUser}>修改store信息</button>
        </div>
      </div>
    </>
  )
}

export default App

第五步,安装redux-devtools协助开发

使用redux-devtools可以很方便的管理和查看redux里面的数据结构和状态:

redux总结

省略了action types

不必再多次写字符串,使用model/method代替

省略了action creators

直接调用方法,不必再生产action type(原版dispatch方法返回{type, payload}),使用dispatch.model.method代替

省略了switch语句

调用model.method方法,不必判断action type ( 原本reduces中)

集中书写状态,同步和异步方法

在一个model中使用state,reducers和effects来写状态,同步和异步方法

相关推荐
奈斯先生Vector7 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频
海带紫菜菠萝汤7 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
名字还没想好☜7 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件7 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
10share7 小时前
React 新一代样式隔离方案 —— 编译时、零运行时、原生写法
前端·react.js
upgrador7 小时前
桌面应用开发:Electron 与 NSIS 的关系、打包流程及 Windows 本地构建实战
javascript·windows·electron
Revolution618 小时前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
我要两颗404西柚8 小时前
Stage three:VUE工程化与实战工具
前端·javascript·vue.js
光影少年8 小时前
RN 的EventEmitter 双向通信
前端·react native·react.js
布鲁飞丝9 小时前
从零实现富文本编辑器#-浏览器选区与编辑器选区模型同步
java·前端·编辑器