define-selectors
define-selectors is a solution to this stackoverflow problem. It works based on Reselect and Re-reselect.
Installation
$ npm install define-selectors
Comparison with reselect
reselect:
const inputSelector1 = stateval1const inputSelector2 = stateval2 const someSelector =
define-selectors:
const inputSelector1 = stateval1const inputSelector2 = stateval2 const someSelector = // equivalent to aboveconst someSelector =
Usage
const selectNav = statenavconst selectPage = statepageconst selectFoo = statefoo const selectNavAndPageAndFoo selectNavAndPage = const state = nav: 'navA' page: 'pageB' foo: 'fooC' console // 'navA/pageB/fooC'
API
define-reselect consists in just one method exported as default.
defineSelectors( selectors )
selectors
is a object. key: selectorName, value: selectorData pairs
selectorName1: selectorData1 selectorName2: selectorData2 ...
-
selectorData
is a very important here. it is a object or array. selectorData containsinputSelectors
,resultFunc
,resolverFunc
,cacheSize
,customSelectorCreator
.inputSelectors
,resultFunc
are required and the remainings are optional. -
selectorData(array):
[ inputSelectors, resultFunc, resolverFunc, cacheSize, customSelectorCreator ]
Note these index position. If you want to use customSelectorCreator
but don't want resolverFunc
and cacheSize
try this:
[ inputSelectors, resultFunc, void 0, void 0, customSelectorCreator ]
- selectorData(object)
{
inputSelectors: inputSelectors,
resultFunc: resultFunc,
resolverFunc: resolverFunc,
cacheSize: cacheSize,
customSelectorCreator: customSelectorCreator,
}
- inputSelectors(array): refer Reselect project. To avoid difinition ordering problem, you have to define each selector in the same
selectors
object. When you use the selector in the same selectors as inputSelector, use selectorName as thestring
type. In above example, when selectNavAndPageAndFoo is defined, it recursively go to theselectNavAndPage
selector to define this first.FOUND_CIRCULAR_REFERENCE
error occurs if a circular reference is found. - resultFunc(function): refer Reselect project
- resolverFunc(function): refer Re-reselect project
- cacheSize(number): refer my unmerged PR to reselect
- customSelectorCreator(function): refer Reselect project
Contributing
Happy to PR any of the improvements you're thinking about. Thanks!