// Create an action creator (description is optional) const add = createAction('add some stuff') const increment = createAction('increment the state') const decrement = createAction('decrement the state')
// Create a reducer // (ES6 syntax, see Advanced usage below for an alternative for ES5) const counterReducer = createReducer( { [increment]: state => state + 1, [decrement]: state => state - 1, [add]: (state, payload) => state + payload }, 0 ) // <-- This is the default state
// Create the store const counterStore = createStore(counterReducer)
// You can create several action creators at once // (but that's probably not the best way to do it) const [increment, decrement] = ['inc', 'dec'].map(createAction)
// When creating action creators, the description is optional // it will only be used for devtools and logging stuff. // It's better to put something but feel free to leave it empty if you want to. const replace = createAction()
// By default, the payload of the action is the first argument // when you call the action. If you need to support several arguments, // you can specify a function on how to merge all arguments into // an unique payload. let append = createAction('optional description', (...args) => args.join(''))
// There is another pattern to create reducers // and it works fine with ES5! (maybe even ES3 \o/) const stringReducer = createReducer(function(on) { on(replace, (state, payload) => payload) on(append, (state, payload) => (state += payload)) // Warning! If you use the same action twice, // the second one will override the previous one. }, 'missing a lette') // <-- Default state
// Rather than binding the action creators each time you want to use them, // you can do it once and for all as soon as you have the targeted store // assignTo: mutates the action creator itself // bindTo: returns a new action creator assigned to the store const stringStore = createStore(stringReducer) replace.assignTo(stringStore) append = append.bindTo(stringStore)
// Now, when calling actions, they will be automatically dispatched append('r') // stringStore.getState() === 'missing a letter' replace('a') // stringStore.getState() === 'a' append('b', 'c', 'd') // stringStore.getState() === 'abcd'
// If you really need serializable actions, using string constant rather // than runtime generated id, just use a uppercase description (with eventually some underscores) // and it will be use as the id of the action const doSomething = createAction('STRING_CONSTANT') doSomething(1) // { type: 'STRING_CONSTANT', payload: 1}
// Little bonus, if you need to support metadata around your action, // like needed data but not really part of the payload, you add a second function const metaAction = createAction( 'desc', arg => arg, arg => ({ meta: 'so meta!' }) )
// Metadata will be the third argument of the reduce function createReducer({ [metaAction]: (state, payload, meta) => payload })
// Super simple action const simpleAction = createAction() // Better to add a description const betterAction = createAction('This is better!') // Support multiple arguments by merging them const multipleAction = createAction((text, checked) => ({ text, checked })) // Again, better to add a description const bestAction = createAction('Best. Action. Ever.', (text, checked) => ({ text, checked })) // Serializable action (the description will be used as the unique identifier) const serializableAction = createAction('SERIALIZABLE_ACTION')
let action = createAction() let action2 = createAction() const reducer = createReducer({ [action]: state => state * 2, [action2]: state => state / 2 }) const store = createStore(reducer, 1) const store2 = createStore(reducer, -1)
// Automatically dispatch the action to the store when called action.assignTo(store) action() // store.getState() === 2 action() // store.getState() === 4 action() // store.getState() === 8
// You can assign the action to several stores using an array action.assignTo([store, store2]) action() // store.getState() === 16 // store2.getState() === -2
// If you need more immutability, you can bind them, creating a new action creator const boundAction = action2.bindTo(store) action2() // Not doing anything since not assigned nor bound // store.getState() === 16 // store2.getState() === -2 boundAction() // store.getState() === 8
assigned() / bound() / dispatched()
测试action creator的当前状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
const action = createAction() action.assigned() // false, not assigned action.bound() // false, not bound action.dispatched() // false, test if either assigned or bound
// First pattern const reducerMap = createReducer( { [increment]: state => state + 1, [add]: (state, payload) => state + payload }, 0 )
// Second pattern const reducerFactory = createReducer(function(on, off) { on(increment, state => state + 1) on(add, (state, payload) => state + payload) // 'off' remove support for a specific action // See 'Adding and removing actions' section }, 0)
// actions.js exportconst add = createAction('Add'); exportconst sub = createAction('Sub');
// reducer.js import * as actions from'./actions'; exportdefault createReducer({ [actions.add]: (state, payload) => state + payload, [actions.sub]: (state, payload) => state - payload }, 0);
// store.js import * as actions from'./actions'; import reducer from'./reducer';
const store = createStore(reducer); assignAll(actions, store);
exportdefault store;
bindAll(actionCreators, stores)
参数
actionCreators(对象或数组)
stores(对象或数组)
用法
类似于assignAll,可以立刻绑定action。
1 2 3 4 5
import { bindAll } from'redux-act'; import store from'./store'; import * as actions from'./actions';
export bindAll(actions, store);
disbatch(store | dispatch, [actions])
参数
store | dispatch (对象,store 或 diaptch 方法),在store上添加disbatch方法,类似于diaptch,但这个是触发多个action。
actions(数组,可选) 需要触发的一些action
用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// All samples will display both syntax with and without an array // They are exactly the same import { disbatch } from'redux-act' import { inc, dec } from'./actions'
// Add 'disbatch' directly to the store disbatch(store) store.disbatch(inc(), dec(), inc()) store.disbatch([inc(), dec(), inc()])
// Disbatch immediately from store disbatch(store, inc(), dec(), inc()) disbatch(store, [inc(), dec(), inc()])