Comment passer des paramètres supplémentaires aux sélecteurs combinés? J'essaie de
• Obtenez des données
• Filtrer les données
• Ajouter une valeur personnalisée à mon ensemble de données/données de groupe par myValue
export const allData = state => state.dataTable
export const filterText = state => state.filter.get('text')
export const selectAllData = createSelector(
allData,
(data) => data
)
export const selectAllDataFiltered = createSelector(
[ selectAllData, filterText ],
(data, text) => {
return data.filter(item => {
return item.name === text
})
}
)
export const selectWithValue = createSelector(
[ selectAllDataFiltered ],
(data, myValue) => {
console.log(myValue)
return data
}
)
let data = selectWithValue(state, 'myValue')
console.log(myValue)
renvoie undefined
La réponse à vos questions est détaillée dans un FAQ ici: https://github.com/reactjs/reselect#q-how-do-i-create-a-selector -qui-prend-un-argument
En bref, reselect ne prend pas en charge les arguments arbitraires transmis aux sélecteurs. L'approche recommandée est, au lieu de passer un argument, de stocker ces mêmes données dans votre état Redux.
qu'en est-il du retour d'une fonction depuis le sélecteur? getFilteredToDos
en est un exemple
// redux part
const state = {
todos: [
{ state: 'done', text: 'foo' },
{ state: 'time out', text: 'bar' },
],
};
// selector for todos
const getToDos = createSelector(
getState,
(state) => state.todos,
);
// selector for filtered todos
const getFilteredToDos = createSelector(
getToDos,
(todos) => (todoState) => todos.filter((toDo) => toDo.state === todoState);
);
// and in component
const mapStateToProps = (state, ownProps) => ({
...ownProps,
doneToDos: getFilteredToDos()('done')
});
Une autre option:
const parameterizedSelector = (state, someParam) => createSelector(
[otherSelector],
(otherSelectorResult) => someParam + otherSelectorResult
);
Et puis utiliser comme
const mapStateToProps = state => ({
parameterizedSelectorResult: parameterizedSelector(state, 'hello')
});
Je ne suis pas sûr de la mémorisation/des performances dans ce cas, mais cela fonctionne.