reudx-action构建工具(redux-act)
github路径:https://github.com/pauldijou/... 这是一个自用的工具用于创建 安装npm install redux-act --save 用法这里有一个名叫 // Import functions import { createStore } from 'redux'; import { createAction,createReducer } from 'redux-act'; // 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); // Dispatch actions counterStore.dispatch(increment()); // counterStore.getState() === 1 counterStore.dispatch(increment()); // counterStore.getState() === 2 counterStore.dispatch(decrement()); // counterStore.getState() === 1 counterStore.dispatch(add(5)); // counterStore.getState() === 6 高级用法import { createStore } from 'redux'; import { createAction,createReducer } from 'redux-act'; // 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,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 }); API说明createAction([description],[payloadReducer],[metaReducer])参数
用法返回一个新的 // 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})) // Serializable action (the description will be used as the unique identifier) const serializableAction = createAction('SERIALIZABLE_ACTION'); action creator
const addTodo = createAction('Add todo'); addTodo('content'); // return { type: '[1] Add todo',payload: 'content' } const editTodo = createAction('Edit todo',(id,content) => ({id,content})); editTodo(42,'the answer'); // return { type: '[2] Edit todo',payload: {id: 42,content: 'the answer'} } const serializeTodo = createAction('SERIALIZE_TODO'); serializeTodo(1); // return { type: 'SERIALIZE_TODO',payload: 1 }
getType()返回生成的类型并被用于这个 assignTo(store | dispatch)记住你要触发这些 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 bindTo(store | dispatch)如果你需要不可变,你可以使用该方法。它将生成一个新的 // 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()测试 const action = createAction(); action.assigned(); // false,not assigned action.bound(); // false,not bound action.dispatched(); // false,test if either assigned or bound const boundAction = action.bindTo(store); boundAction.assigned(); // false boundAction.bound(); // true boundAction.dispatched(); // true action.assignTo(store); action.assigned(); // true action.bound(); // false action.dispatched(); // true raw(...args)当 const action = createAction().bindTo(store); action(1); // store has been updated action.raw(1); // return the action,store hasn't been updated createReducer(handlers,[defaultState])参数
用法返回一个新的 const increment = createAction(); const add = createAction(); // First pattern const reducerMap = createReducer({ [increment]: (state) => state + 1,payload) => state + payload },0); // Second pattern const reducerFactory = createReducer(function (on,off) { on(increment,(state) => state + 1); on(add,payload) => state + payload); // 'off' remove support for a specific action // See 'Adding and removing actions' section },0); reducer
options(object)因为 const add = createAction(); const sub = createAction(); const reducer = createReducer({ [add]: (state,action) => state + action.payload,[sub]: (state,action) => state - action.payload },0); reducer.options({ payload: false }); has(action creator)检测 const add = createAction(); const sub = createAction(); const reducer = createReducer({ [add]: (state,action) => state + action.payload },0); reducer.has(add); // true reducer.has(sub); // false reducer.has(add.getType()); // true on(action creator,reduce function) / off(action creator)可以动态添加或删除action。 assignAll(actionCreators,stores)参数
用法普遍的方式是导出一系列的action作为对象,如果你需要将所有绑定到store,这里有一个超级小帮手。也可以使用action数组。 // actions.js export const add = createAction('Add'); export const sub = createAction('Sub'); // reducer.js import * as actions from './actions'; export default createReducer({ [actions.add]: (state,[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); export default store; bindAll(actionCreators,stores)参数
用法类似于 import { bindAll } from 'redux-act'; import store from './store'; import * as actions from './actions'; export bindAll(actions,store); disbatch(store | dispatch,[actions])参数
用法// 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(),inc()]); // Disbatch immediately from store disbatch(store,inc(),inc()); disbatch(store,[inc(),inc()]); // Disbatch immediately from dispatch disbatch(store.dispatch,inc()); disbatch(store.dispatch,inc()]); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |