Redux 是 JavaScript 状态容器,提供可预测化的状态管理。但是同时它也让状态管理变得很冗长,大量的action、actionCreator、reducer让人不断在写重复的代码。

redux-actions是一个实用的库,让编写redux状态管理变得简单起来。redux-action产生的动作是FSA标准的。

计数器例子

createAction

首先先来写action和actionCreator:

// action.js
import { createAction } from "redux-actions"export const INCREMENT = 'INCREMENT'
export const increment = createAction(INCREMENT)
复制代码

上边代码定义一个动作INCREMENT, 然后通过createAction创建了对应actionCreator。调用increment()就会返回{ type: 'INCREMENT' }, 调用increment(10)返回{ type: 'INCREMENT', payload: 10 }

createAction是用来创建动作创建器的函数。

createAction(type, // 动作名payloadCreator = Identity, // 用来创建动作对象中的payload值,默认使用lodash的Identity?metaCreator // 用来创建动作对象中元数据
)const increment = createAction('INCREMENT',mount => mount,() => ({ admin: true })
);
increment(20);
// {//   type: 'INCREMENT',
//   payload: 20,
//   meta: { admin: true },
// }
复制代码

handleAction

接着用handleAction来处理动作

// reducer.js
import {handleAction} from 'redux-actions'
import {INCREMENT} from './action'const defaultState = { count: 1 }
const reducer = handleAction(INCREMENT,(state, action) => ({count: state.count + action.payload}),defaultState
)export default reducer
复制代码

handleAction会返回一个reducer,后续用这个reducer来创建store。

// type为动作类型, reducer为动作处理, defaultState为默认状态
handleAction(type, reducer, defaultState)// 上面的createAction效果就等同下面
const reducer = (state = defaultState, action) {switch(action.type) {case 'INCREMENT':return {count: state.count + action.payload}default: return state}}
复制代码

串联

最后把对应的代码补充完整即可。

// Counter.js
import React, {Component} from 'react'
import {connect} from 'react-redux'
import {increment} from './action'
import {bindActionCreators} from 'redux'@connect(state => ({count: state.count}),dispatch => ({increment: bindActionCreators(increment, dispatch)})
)
class Counter extends Component {render () {return (<div><button onClick={this.props.increment.bind(this, 1)}>add</button><div>{this.props.count}</div></div>)}
}
复制代码
// app.js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import {Provider} from 'react-redux'
import {createStore} from 'redux'
import reducer from './reducer'const store = createStore(reducer)class App extends Component {render() {return (<Provider store={store}><div><h3>Redux-actions</h3><Counter/></div></Provider>);}
}
复制代码

更多API

通过上面的例子,你应该可以对redux-actions有了基本的认识了。接下来继续介绍其他API

createActions

从名字就可以看出这个函数用来创建多个动作的。具体用法就是createActions(actionMap)

actionMap就是一个对象,key值为动作类型,value可以是payloadCreator函数、一个数组[payloadCreator, metaCreator]、嵌套的actionMap。

cosnt {add, remove} = createActions({ADD_TODO: todo => ({ todo }), // payload creatorREMOVE_TODO: [todo => ({ todo }), // payload creator(todo, warn) => ({ todo, warn }) // meta]
})// {type: 'ADD_TODO', payload: {todo: 'redux-actions'}}
add('redux-actions')// {type: 'ADD_TODO', payload: {todo: 'redux-actions'}, meta: {todo: 'redux-actions', warn: 'warn'}}
remove('redux-actions', 'warn')
复制代码

handleActions

同样的handleActions函数是用来处理多个动作的。

handleActions(reducerMap, defaultState)const reducer = handleActions({INCREMENT: (state, action) => ({counter: state.counter + action.payload}),DECREMENT: (state, action) => ({counter: state.counter - action.payload})},{ counter: 0 }
);
复制代码

可以看到reducerMap中key就是动作名, value就是reducer

combineActions

合并多个action和actionCreator

const { increment, decrement } = createActions({INCREMENT: amount => ({ amount }),DECREMENT: amount => ({ amount: -amount }),
})
const reducer = handleAction(combineActions(increment, decrement), {next: (state, { payload }) => ({ ...state, count: state.count + payload }),throw: state => ({ ...state, count: 0 }),
}, { count: 10 })const reduce2 = handleActions({[combineActions(increment, decrement)] (state, {payload}) {return { ...state, count: state.count + payload }}},{ count: 10 }
)
复制代码

增加和减小的逻辑基本一致,所以可以使用combineActions来合并简写。

总结

redux-actions的使用还是很容易上手的,更多具体细节可以看官方文档

redux-actions入门相关推荐

  1. GitHub Actions入门教程:自动化部署静态博客

    前天,我使用 GitHub Actions 实现了静态博客的自动化部署,觉得它非常强大,只要你提交到 GitHub,后面的部署完全由 GitHub 自动完成. 这里提的静态博客,就是通过生成工具(eg ...

  2. GitHub Actions入门教程

    GitHub Actions入门教程 GitHub Marketplace · Actions to improve your workflow · GitHub 概述 GitHub Actions ...

  3. Flux --gt; Redux --gt; Redux React 入门 基础实例教程

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  4. Redux从入门到进阶,看这一篇就够了!

    Redux,带你从入门到进阶

  5. GitHub Actions 入门教程

    https://jiangren.com.au/blog/github-actions 一.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试.登录远程服 ...

  6. Next.js踩坑入门系列(七) —— 其他相关知识

    Next.js踩坑入门系列 (一) Hello Next.js (二) 添加Antd && CSS (三) 目录重构&&再谈路由 (四) Next.js中期填坑 (五) ...

  7. React 全家桶(react脚手架 redux react-redux react-router-dom ui库 reactHook)含 自定义hook的方法及使用

    文章目录 React 入门 React 简介 React 为何物 为何学习 React React 初体验 来一发 Hello React 创建虚拟 DOM 的两种方式:JS 和 JSX 虚拟 DOM ...

  8. redux logic_Redux-Logic简介

    redux logic by Sam Ollason 通过萨姆·奥拉森(Sam Ollason) Redux-Logic简介 (An Introduction to Redux-Logic) This ...

  9. 使用Flow检查React,Redux和React-Redux的全面指南

    by Fabian Terh 由Fabian Terh 使用Flow检查React,Redux和React-Redux的全面指南 (A comprehensive guide to type chec ...

  10. 如何使用Redux-saga和ReactDnD测试React和Redux(哇!)

    by Gregory Beaver 通过格雷戈里·海狸 如何使用Redux-saga和ReactDnD测试React和Redux(哇!) (How to test React and Redux wi ...

最新文章

  1. java中Error与Exception有什么区别
  2. 8086CPU汇编寻址写法
  3. 从提香到戈雅:西班牙普拉多博物馆藏画展
  4. Mac与Phy组成原理的简单分析
  5. 【转】学会这13个原则写UI界面文案,用户才能秒懂
  6. ajax渲染后的点击事件,在ajax调用后渲染“喜欢”按钮
  7. Amazon Web Service 雲端運算平台攻略 【3】:免費架WordPress部落格的虛擬主機
  8. 百家搜索:在网站中添加Google、百度等搜索引擎
  9. 【英语学习】【Daily English】U08 Dating L04 We can Make it another time.
  10. PowerBI开发 第四篇:DAX表达式
  11. 数据结构之线性表之顺序存储结构(3)
  12. 互联网项目架构经验分享
  13. 查看服务器风扇转速等
  14. 我想向你们推荐一门最好的python课程——CS61A学习笔记(一)
  15. 2021年上半年软件设计师下午真题及答案解析
  16. 计算机与食品科学与工程关系,计算机在食品科学与工程中的应用课程标准.doc...
  17. 使用eolink优雅地进行API接口管理
  18. 南开大学校园邮箱pop3地址
  19. 【imx6ul】imx6ul上电boot rom启动过程
  20. 蓝牙5.1定位--蓝牙定位信标--新导智能

热门文章

  1. stl 向量_C ++ STL中的向量delete()和clear()
  2. floyd算法 每一层循环_链接列表循环检测– Floyd的循环查找算法
  3. 若想活得洒脱,就要学会看开
  4. 客户端存储——Storage
  5. IJCAI最佳论文公布 华人斩获最佳学生论文奖!
  6. 时间序列数据的存储和计算 - 开源时序数据库解析(一)
  7. Java中如何跳出多重for循环
  8. html 标题栏小图标 ,锚点,视频插入,音乐插入
  9. ios官方菜单项目重点剖析附项目源码
  10. 关于SVN提交注释的问题