Лекция 32
npm install reselect
import { createSelector } from 'reselect';
const shopItemsSelector
= state => state.shop.items;
const taxPercentSelector
= state => state.shop.taxPercent;
const subtotalSelector = createSelector(
shopItemsSelector,
items => items.reduce(
(acc, item) => acc + item.value,
0
)
);
const taxSelector = createSelector(
subtotalSelector,
taxPercentSelector,
(subtotal, taxPercent) =>
subtotal * (taxPercent / 100)
);
export const totalSelector = createSelector(
subtotalSelector,
taxSelector,
(subtotal, tax) => subtotal + tax
);
const exampleState = {
shop: {
taxPercent: 8,
items: [
{ name: 'apple', value: 1.20 },
{ name: 'orange', value: 0.95 },
]
}
};
console.log(subtotalSelector(exampleState))
// 2.15
console.log(taxSelector(exampleState))
// 0.172
console.log(totalSelector(exampleState))
// 2.322
createSelector(
...inputSelectors | [inputSelectors],
resultFunc
)
const mySelector = createSelector(
state => state.values.value1,
state => state.values.value2,
(value1, value2) => value1 + value2
)
const totalSelector = createSelector(
[
state => state.values.value1,
state => state.values.value2
],
(value1, value2) => value1 + value2
)
const mySelector = createSelector(
(input1, input2) => input1.value + input2.value,
(input1, input2) => input1.value - input2.value,
(value1, value2) => value1 + value2
)
mySelector({ value: 4 }, { value: 2 })
defaultMemoize(
func,
equalityCheck = defaultEqualityCheck
)
createSelectorCreator(
memoize,
...memoizeOptions
)
const custom = createSelectorCreator(
customMemoize,
option1, // 2nd param to customMemoize
option2, // 3rd
option3, // 4th
)
const customSelector = custom(
input1,
input2,
resultFunc // 1st param to customMemoize
)
// customMemoize(resultFunc, option1, option2, option3)
import {
createSelectorCreator,
defaultMemoize
} from 'reselect';
import isEqual from 'lodash.isEqual';
const deep = createSelectorCreator(
defaultMemoize,
isEqual
);
const mySelector = deep(
state => state.values.filter(val => val < 5),
values => ...
);
import {
createSelectorCreator
} from 'reselect';
import memoize from 'lodash.memoize'
const hash = (...args) => args.reduce(
(acc, val) => acc + '-' + JSON.stringify(val),
''
);
const unlimited = createSelectorCreator(
memoize,
hashFn
);
const selector = unlimited(...);
createStructuredSelector(
{inputSelectors},
selectorCreator = createSelector
)
const mySelectorA = state => state.a;
const mySelectorB = state => state.b;
const structuredSelector
= createStructuredSelector({
x: mySelectorA,
y: mySelectorB
});
const result = structuredSelector({ a: 1, b: 2 });
// { x: 1, y: 2 }
const nestedSelector = createStructuredSelector({
subA: createStructuredSelector({
selectorA,
selectorB
}),
subB: createStructuredSelector({
selectorC,
selectorD
})
})
const expensiveItemSelectorFactory = minValue =>
createSelector(
shopItemsSelector,
items =>
items.filter(item => item.value > minValue)
);
const subtotalSelector = createSelector(
expensiveItemSelectorFactory(200),
...
);