redux的使用

redux是跟vue中的vuex和pinia类似的一个状态管理库,可以跟任一一个框架进行结合,包括vue、react以及angular。不过在与redux结合这一方面,显然react要做的更好。接下来我会详细介绍在不结合react时,redux是怎么使用的,我们用到的环境是nodeJS环境,因此我们需要用到CommonJS规范。

redux最核心的三个部分包括storeactionreducerstore 就是redux中最核心的类似于CPU的东西,一切的行为都有store发起。action ,见名知意就是行为的意思,在redux中action就是一个普通的对象({type: 'xxx', payload: 'xxx'}),type这个属性表示此次action的含义,payload就是此次行为所携带的数据。reducer 是数据中心(一个普通的函数),action携带的数据统一在reducer这里进行处理,所有的数据在reducer这里有一个统一的名称:**state,然后reducer是一个 纯函数(简而言之就是确定的输入有确定的输出)。**下面就开始介绍redux的使用。

首先我们需要安装相关的依赖,这里用的包管理器是pnpm,在安装依赖之前,我们先使用pnpm init这个命令生成package.json文件,然后就可以安装依赖(pnpm add redux)了。安装完依赖之后,我们就可以正式开始redux的使用了。

首先我们需要引入store,我们用到的是redux这个库中createStore这个函数,目前这个函数已经废弃了,因为有更好的工具可以代替,但是核心还是不变的,所以理解了这一流程之后,用其他的api也是一样的。

javascript 复制代码
const { createStore } = require('redux')

const store = createStore()

module.exports = store
perl 复制代码
createStore这个函数接收一个reducer,以下代码就是reducer,只是一个普通的函数,这个函数接收两个参数,state表示数据,payload表示action所携带的普通对象,在reducer中我们根据不同的action中携带的type不一样,来对state进行处理,由于reducer是一个纯函数,因此我们不能直接修改state中的数据(比如 state.name = 'xxx')
javascript 复制代码
// 初始化数据
const initialState = {
  name: 'coder',
  age: 20,
  count: 100
}

/**
 * 
 * @param {*} state store中目前保存的state
 * @param {*} payload 本次需要更新的action(dispatch传入的action)
 * @returns 作为store之后存储的state
 */
const reducer = (state = initialState, payload) => {
  const { type } = payload
  switch(type) {
    case CHANGE_COUNT: {
      return { ...state, count: state.count + payload.count}
    }
    default:
      return state
  }
}
module.exports = reducer

写了store和reducer之后,就是行为的发起了,这也是我们使用redux的守门员,想要获取reudx中的数据,我们首先需要store派发一个action,然后才能进行下面一系列的操作。

javascript 复制代码
const countAction = {
  type: 'change_count',
  count: 110
}

以上就是一个改变数字的action,但是由于我们可能会发起多个action,因此我们可以将其改造成一个函数,然后在发起的时候去调用。

javascript 复制代码
const addCountAction = (num) => ({
  type: CHANGE_COUNT,
  count: num
})

module.exports = {
  addCountAction
}

以上准备工作都做完之后,我们就可以正式来使用redux了。我们需要使用时,只需要引入store,并发起action就可以了。

javascript 复制代码
const store = require('./store')
const { addCountAction } = require('./actionCreators')
store.dispatch(addCountAction(10))

写完以上代码,我们就可以使用store的getState()这个方法查看更新后的保存在reducer的数据了,但是由于我们并不能每一次调用dispatch都去调用一次getState()这个方法,因此,我们可以对行为的派发进行订阅,这样每一次行为的派发,都会监听到。

javascript 复制代码
store.subscribe(() => {
  console.log(store.getState())
})

以上就是redux的基本使用。每一个概念(store、action、reducer)都可以单独写一个文件,比如所有action可以写在actionCreators.js这个文件里。

相关推荐
摘星编程1 小时前
React Native + OpenHarmony:UniversalLink通用链接
javascript·react native·react.js
qq_177767372 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88212 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
2601_949593654 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos
qq_177767375 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767375 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
烬头88216 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
qq_177767376 小时前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
●VON7 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
qq_177767377 小时前
React Native鸿蒙跨平台实现消息列表用于存储所有消息数据,筛选状态用于控制消息筛选结果
javascript·react native·react.js·ecmascript·harmonyos