redux-actions入门
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入门相关推荐
- GitHub Actions入门教程:自动化部署静态博客
前天,我使用 GitHub Actions 实现了静态博客的自动化部署,觉得它非常强大,只要你提交到 GitHub,后面的部署完全由 GitHub 自动完成. 这里提的静态博客,就是通过生成工具(eg ...
- GitHub Actions入门教程
GitHub Actions入门教程 GitHub Marketplace · Actions to improve your workflow · GitHub 概述 GitHub Actions ...
- Flux --gt; Redux --gt; Redux React 入门 基础实例教程
本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...
- Redux从入门到进阶,看这一篇就够了!
Redux,带你从入门到进阶
- GitHub Actions 入门教程
https://jiangren.com.au/blog/github-actions 一.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试.登录远程服 ...
- Next.js踩坑入门系列(七) —— 其他相关知识
Next.js踩坑入门系列 (一) Hello Next.js (二) 添加Antd && CSS (三) 目录重构&&再谈路由 (四) Next.js中期填坑 (五) ...
- React 全家桶(react脚手架 redux react-redux react-router-dom ui库 reactHook)含 自定义hook的方法及使用
文章目录 React 入门 React 简介 React 为何物 为何学习 React React 初体验 来一发 Hello React 创建虚拟 DOM 的两种方式:JS 和 JSX 虚拟 DOM ...
- redux logic_Redux-Logic简介
redux logic by Sam Ollason 通过萨姆·奥拉森(Sam Ollason) Redux-Logic简介 (An Introduction to Redux-Logic) This ...
- 使用Flow检查React,Redux和React-Redux的全面指南
by Fabian Terh 由Fabian Terh 使用Flow检查React,Redux和React-Redux的全面指南 (A comprehensive guide to type chec ...
- 如何使用Redux-saga和ReactDnD测试React和Redux(哇!)
by Gregory Beaver 通过格雷戈里·海狸 如何使用Redux-saga和ReactDnD测试React和Redux(哇!) (How to test React and Redux wi ...
最新文章
- java中Error与Exception有什么区别
- 8086CPU汇编寻址写法
- 从提香到戈雅:西班牙普拉多博物馆藏画展
- Mac与Phy组成原理的简单分析
- 【转】学会这13个原则写UI界面文案,用户才能秒懂
- ajax渲染后的点击事件,在ajax调用后渲染“喜欢”按钮
- Amazon Web Service 雲端運算平台攻略 【3】:免費架WordPress部落格的虛擬主機
- 百家搜索:在网站中添加Google、百度等搜索引擎
- 【英语学习】【Daily English】U08 Dating L04 We can Make it another time.
- PowerBI开发 第四篇:DAX表达式
- 数据结构之线性表之顺序存储结构(3)
- 互联网项目架构经验分享
- 查看服务器风扇转速等
- 我想向你们推荐一门最好的python课程——CS61A学习笔记(一)
- 2021年上半年软件设计师下午真题及答案解析
- 计算机与食品科学与工程关系,计算机在食品科学与工程中的应用课程标准.doc...
- 使用eolink优雅地进行API接口管理
- 南开大学校园邮箱pop3地址
- 【imx6ul】imx6ul上电boot rom启动过程
- 蓝牙5.1定位--蓝牙定位信标--新导智能