位置: IT常识 - 正文

Redux的基本使用过程详解(redux入门教程)

编辑:rootadmin
Redux的基本使用过程详解 文章目录Redux的使用过程Redux测试项目的搭建Redux的基本使用步骤Redux目录的结构划分React的三大原则Redux的使用过程Redux测试项目的搭建

推荐整理分享Redux的基本使用过程详解(redux入门教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:redux-immutable,redux的使用流程,redux的使用流程,redux-form,redux-immutable,redux快速入门,redux入门教程,redux的使用流程,内容如对您有帮助,希望把文章链接给更多的朋友!

1.创建一个新的项目文件夹:learn-redux

# 执行初始化操作 npm init -y或yarn init -y

# 安装redux:npm install redux --save或yarn add redux

2.创建src目录,在src目录下创建一个store文件夹, 并且在该文件夹下创建index.js文件

3.可以修改package.json用于执行index.js, 也可以不配置, 直接使用node命令运行

"scripts": { "start": "node src/index.js"}Redux的基本使用步骤

1.创建一个对象,作为我们要保存的状态state:

// 由于测试项目在node环境下, 因此使用require方式导入const { createStore } = require("redux")// 创建的要存储的state: initialStateconst initialState = { name: "chenyq", age: 18}

2.创建Store来存储这个state

由于创建的state是不能直接放到创建的store中的, 需要通过reducer将数据添加到store中, 因此创建store时必须创建reducer;

reducer函数的返回值, 会作为store之后存储的state

// 定义reducer, 将要存储的state作为返回值返回function reducer() { return initialState}// 创建的store, 内部会自动回调reducer, 拿到initialStateconst store = createStore(reducer)// 导出storemodule.exports = store

我们可以在其他文件中通过 store.getState 来获取当前的state;

// 导入创建的storeconst store = require("./store")// 获取store中的stateconsole.log(store.getState())

3.通过action来修改state

错误演示: 直接修改store

store.getState().name = "abc"

修改store中的数据不能直接修改, 必须要通过dispatch来派发action;

通常action中都会有type属性,也可以携带其他的数据;

// 定义一个actionconst nameAction = { type: "change_name", name: "abc" }// 派发actionstore.dispatch(nameAction)

当然上面代码中, 也可以写为一行

// 派发actionstore.dispatch({ type: "change_name", name: "abc" })

4.修改reducer中的处理代码

reducer接收两个参数:

参数一: store中当前保存的state

参数二: 本次需要更新的action

只要调用dispatch就会重新执行reducer函数

这里一定要记住,reducer是一个纯函数,不可以直接修改state, 后面我会讲到直接修改state带来的问题;

// 第一次state是undefined, 因此给一个默认值将初始化数据添加到store中function reducer(state = initialState, action) { // 有数据更新时, 返回一个新的state if (action.type === "change_name") { return { ...state, name: action.name } } // 没有数据更新时, 返回之前的state return state}Redux的基本使用过程详解(redux入门教程)

5.可以在派发action之前,监听store的变化:

通过store.subscribe()函数可以监听store中的数据变化

store.subscribe()函数的参数接收一个函数, 该函数在store数据发生更新自动回调

const store = require("./store")// 例如: 监听数据的变化, 当store变化, 就获取最新的statestore.subscribe(() => { console.log(store.getState())})store.dispatch({ type: "change_name", name: "abc" })store.dispatch({ type: "change_name", name: "aaa" })

6.封装函数动态生成action

例如上面代码中, 我们修改名称多次, 只有传入的action的name属性值不相同, 那么我们可以封装一个函数, 动态的生成action, 这也是开发中一贯的做法

// 创建修改name的actionconst changeNameAction = (name) => ({ type: "change_name", name})// 创建修改age的actionconst changeAgeAction = (num) => ({ type: "change_age", num})// 在派发action时, 我们就可以调用函数即可获取actionstore.dispatch(changeNameAction("aaa"))store.dispatch(changeNameAction("bbb"))store.dispatch(changeNameAction("ccc"))store.dispatch(changeAgeAction(10))store.dispatch(changeAgeAction(20))store.dispatch(changeAgeAction(30))store.dispatch(changeAgeAction(40))Redux目录的结构划分

如果我们将所有的逻辑代码写到一起,那么当redux变得复杂时代码就难以维护。

例如上面代码中, 我们封装的动态创建action的函数, 这种动态生成action的函数在项目中可能会有很多个, 而且在其他多个文件中也可能会使用, 所以我们最好是有一个单独的文件夹存放这些动态获取action的函数

接下来,我会对代码进行拆分,将store、reducer、action、constants拆分成一个个文件。

创建store/index.js文件: index文件中, 我们只需要创建store即可

const { createStore } = require("redux")// 引入reducerconst reducer = require("./reducer")// 创建的store, 内部会自动回调reducer, 拿到initialStateconst store = createStore(reducer)// 导出storemodule.exports = store

创建store/reducer.js文件: 在真实项目中, reducer这个函数我们会越写越复杂, 造成我们index.js文件越来越大, 所以我们将reducer也抽离到一个单独的文件中

const { CHANGE_NAME, CHANGE_AGE } = require("./constants")// 创建的要存储的初始化stateconst initialState = { name: "chenyq", age: 18}// 定义reducer, 将要存储的state作为返回值返回// 第一次state是undefined, 因此给一个默认值将初始化数据添加到store中function reducer(state = initialState, action) { switch(action.type) { case CHANGE_NAME: return { ...state, name: action.name } case CHANGE_AGE: return {...state, age: state.age + action.num} } // 没有数据更新时, 返回之前的state return state}module.exports = reducer

创建store/constants.js文件: 将type的类型定义为常量(防止写错的情况), 这些常量最好也防止一个单独的文件中

// store/constants.jsconst CHANGE_NAME = "change_name"const CHANGE_AGE = "change_age"module.exports = { CHANGE_NAME, CHANGE_AGE}

创建store/actionCreators.js文件: 将封装的动态创建action的函数放在该文件中, 在需要使用的地方导入即可

const { CHANGE_NAME, CHANGE_AGE } = require("./store/constants")// 创建修改name的actionconst changeNameAction = (name) => ({ type: CHANGE_NAME, name})// 创建修改age的actionconst changeAgeAction = (num) => ({ type: CHANGE_AGE, num})module.exports = { changeNameAction, changeAgeAction}

最终形成如下目录结构, 这也是官方推荐的目录结构, 一个store中包含这四个文件夹

注意:node中对ES6模块化的支持, 建议使用CommonJS规范

React的三大原则

单一数据源

整个应用程序的state被存储在一颗object tree中,并且这个object tree只存储在一个 store 中:

Redux并没有强制让我们不能创建多个Store,但是那样做并不利于数据的维护;

单一的数据源可以让整个应用程序的state变得方便维护、追踪、修改;

State是只读的

唯一修改State的方法一定是触发action,不要试图在其他地方通过任何的方式来修改State:

这样就确保了View或网络请求都不能直接修改state,它们只能通过action来描述自己想要如何修改state;

这样可以保证所有的修改都被集中化处理,并且按照严格的顺序来执行,所以不需要担心race condition(竟态)的问题;

使用纯函数来执行修改

通过reducer将旧state和actions联系在一起,并且返回一个新的State:

随着应用程序的复杂度增加,我们可以将reducer拆分成多个小的reducers,分别操作不同state tree的一部分;

但是所有的reducer都应该是纯函数,不能产生任何的副作用;

本文链接地址:https://www.jiuchutong.com/zhishi/300655.html 转载请保留说明!

上一篇:走进小程序【六】微信小程序架构之【视图层】万字详解(进入微信小程序)

下一篇:10 OpenCV图像识别之人脸追踪(opencv图像识别特定形状)

  • vivoy53s处理器是骁龙多少(vivoy53s处理器是天玑与骁龙)

    vivoy53s处理器是骁龙多少(vivoy53s处理器是天玑与骁龙)

  • 苹果12Pro都有什么颜色的(苹果12pro都有什么内存)

    苹果12Pro都有什么颜色的(苹果12pro都有什么内存)

  • 快手怎么搜索内容视频(快手搜索东西怎么搜索)

    快手怎么搜索内容视频(快手搜索东西怎么搜索)

  • 华为nova6电池可以用多久(华为nova6电池可以不换电池吗)

    华为nova6电池可以用多久(华为nova6电池可以不换电池吗)

  • 抖音作品怎样设置不让别人下载(抖音作品怎样设置所有人可见)

    抖音作品怎样设置不让别人下载(抖音作品怎样设置所有人可见)

  • 小米10是2k屏吗(小米10是2k屏吗知乎)

    小米10是2k屏吗(小米10是2k屏吗知乎)

  • 抖音能上传多少分钟的视频(抖音能上传多少视频)

    抖音能上传多少分钟的视频(抖音能上传多少视频)

  • 秘乐短视频审核多久(秘乐发布视频需要审核多久)

    秘乐短视频审核多久(秘乐发布视频需要审核多久)

  • 拼多多退货率高对店铺有影响吗(拼多多退货率高了 会不会没有运费险)

    拼多多退货率高对店铺有影响吗(拼多多退货率高了 会不会没有运费险)

  • 微信不能网页版登录怎么办(微信不能网页版登陆)

    微信不能网页版登录怎么办(微信不能网页版登陆)

  • 苹果平板已停用连接itunes是什么意思?(苹果平板已停用连接itunes最简单办法)

    苹果平板已停用连接itunes是什么意思?(苹果平板已停用连接itunes最简单办法)

  • qq里的一起听歌怎么弄(QQ里的一起听歌谁控制)

    qq里的一起听歌怎么弄(QQ里的一起听歌谁控制)

  • 苹果lla是哪个国家(ll/a是什么版本的苹果手机)

    苹果lla是哪个国家(ll/a是什么版本的苹果手机)

  • 小米手机充电发烫是什么原因(小米手机充电发烫什么原因怎么处理)

    小米手机充电发烫是什么原因(小米手机充电发烫什么原因怎么处理)

  • 手机一冻就关机怎么办(手机一冻就关机换电池可以吗)

    手机一冻就关机怎么办(手机一冻就关机换电池可以吗)

  • 电脑键盘哪个键是转换中英文(电脑键盘哪个键是复制)

    电脑键盘哪个键是转换中英文(电脑键盘哪个键是复制)

  • 手机充电要充到100%吗(手机充电需要充满吗)

    手机充电要充到100%吗(手机充电需要充满吗)

  • 域名服务的主要功能是(购买域名的网站)

    域名服务的主要功能是(购买域名的网站)

  • 荣耀yalal10是什么型号(荣耀yal_al10)

    荣耀yalal10是什么型号(荣耀yal_al10)

  • 桌面快捷方式怎么设置(桌面快捷方式怎么恢复)

    桌面快捷方式怎么设置(桌面快捷方式怎么恢复)

  • ps怎么给照片加白边(ps怎么给照片加暗角)

    ps怎么给照片加白边(ps怎么给照片加暗角)

  • 微信运动需不需要网络(微信运动需不需要开定位)

    微信运动需不需要网络(微信运动需不需要开定位)

  • ie浏览器模式怎么设置(ie浏览器模式怎么固定)

    ie浏览器模式怎么设置(ie浏览器模式怎么固定)

  • 华为mate30和p30pro的区别(华为mate30和p30pro哪个贵)

    华为mate30和p30pro的区别(华为mate30和p30pro哪个贵)

  • 微信群链接多久失效啊(微信群链接多久自动删除)

    微信群链接多久失效啊(微信群链接多久自动删除)

  • 苹果nfc功能怎么开启门禁卡(苹果nfc功能怎么开启地铁卡)

    苹果nfc功能怎么开启门禁卡(苹果nfc功能怎么开启地铁卡)

  • 华为新闻资讯怎么关(华为取消新闻资讯)

    华为新闻资讯怎么关(华为取消新闻资讯)

  • 授予渔,从0开始搭建一个自己想要的网页(授渔计划是什么意思)

    授予渔,从0开始搭建一个自己想要的网页(授渔计划是什么意思)

  • cdparanoia命令  翻录CD文件(cd oobe是什么命令)

    cdparanoia命令 翻录CD文件(cd oobe是什么命令)

  • 可以抵扣进项税额的增值税普通发票
  • 递延收益与递延所得税负债的区别
  • 代收的水资源税收入是否计入企业所得税
  • 印花税票是什么税种
  • 计提生产车间工人和车间管理人员工资
  • 无法支付的应付账款需要交增值税吗
  • 如何自己开小公司
  • 房地产企业年报台账怎么填
  • 不能抵扣进项税额的发票类型
  • 小规模纳税人怎么变成一般纳税人
  • 在项目地预缴税款有哪些税种
  • 财政补贴交不交印花税
  • 被客户扣钱怎么办
  • 网上申报中月平均工资怎么计算
  • 委托加工直接对外销售的消费税
  • 多余的实收资本可以转到其他应付款吗
  • 企业捐赠不动产 会计分录
  • 增值税发票作废如何处理
  • 退休后兼职收入需要交税吗
  • 个体工商户申报年报
  • 期末小规模纳税人差额纳税的会计处理分析
  • 金税盘领用发票查询不到
  • 增值税进项发票网上勾选平台
  • 非盈利组织一般纳税人应交的税
  • 按季度计提利息
  • 罚款费用报销单怎么写
  • 票据再质押
  • 专票已经认证能作废吗
  • 工信部推出一键解绑怎么用
  • gif图片查看软件
  • 营运资金管理策略有哪些
  • 库存现金的主要内容有哪些
  • avsched32.exe是什么进程 avsched32进程有什么作用
  • php数组原理
  • php获取文件内容的函数
  • 小米路由器青春版r1cl参数
  • html无刷新跳转
  • 合理损耗企业所得税税率
  • 伊兰简介
  • php操作文件的常用函数
  • 经济补偿金个人所得税计算公式
  • 基建 技改
  • react组件库有哪些
  • 前端开发软件哪个最好
  • 搭建小技巧
  • 稳岗补贴怎么申请步骤
  • 加计减免的分录怎么做
  • mongodb操作数据库
  • 网购报销需要发票和什么截图
  • sql server如何删除
  • 委托加工应税消费品收回后直接销售
  • 工程施工会计如何记账
  • 房地产开发公司注册条件
  • 收到加盟费应该怎么做账
  • 购买机器的运费计入什么科目
  • 采用公允价值模式计量的投资性房地产不需要计提折旧
  • 产品销售费用是什么科目
  • 公司改名后发票怎么开
  • 损益平准金结转
  • 私人贴现利息如何交税
  • 内账咋做
  • mac怎么共享wifi密码给iphone
  • windows server 2008 r2 iis
  • deepin直接安装
  • xp电脑桌面图片显示缩略图
  • vsftpd 虚拟用户权限
  • opengl
  • cocos2dx4.0入门
  • python字符串常用方法
  • JavaScript 2048 游戏实例代码(简单易懂)
  • pyinstaller指定python2
  • 从零开始学什么好
  • axios原理和实现
  • array 和list
  • document.getElementById().src
  • jquery使用Cookie和JSON记录用户最近浏览历史
  • 安卓数据储存方式有哪些
  • python中的文件
  • 文化事业建设费是什么税
  • 电子发票是什么格式的文件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设