Ricorda sempre che lo stato è la tua "fonte di verità". Diffidare di eliminare lo stato sulla base di un filtro temporaneo. Una volta fatto, quegli oggetti sono spariti. (L'unico modo per farli tornare è quello di ripristinare lo stato iniziale, che potrebbe non essere l'ideale.)
Un approccio migliore è quello di mantenere l'elenco degli articoli così com'è, e semplicemente memorizzare il testo di ricerca.
const initialState = {
searchText: '',
items: [ 'hello', 'wahhh', 'yo' ]
};
export default function searchSimple(state = initialState, action) {
switch (action.type) {
case SEARCH_TEXT:
return Object.assign({}, state, {
searchText: action.text
});
}
}
Mentre il vostro stato non conterrà l'elenco filtrato, ti dice tutto quello che c'è da sapere per costruire l'elenco filtrato.
Supponendo che si sta utilizzando Reagire, il vostro "componente intelligente" può essere configurato con il mapStateToProps()
seguente funzione:
function mapStateToProps(state) {
const { items, searchText } = state.searchSimple;
return {
filteredItems: items.filter((item) => item.startsWith(searchText))
};
}
Se avete bisogno di questo elenco filtrato in più di un luogo, prendere in considerazione la creazione di un "selettore" funzione, come dimostrato nell'esempio del carrello degli acquisti di Redux. https://github.com/reactjs/redux/blob/master/examples/shopping-cart/src/reducers/cart.js
Sarebbe simile a questa:
export function filteredItems(state) {
const { items, searchText } = state.searchSimple;
return items.filter((item) => item.startsWith(searchText));
}
Per un approccio più avanzato per selettori, controllare la biblioteca Riseleziona.
https://github.com/rackt/reselect
sembra corretto per me. Se nessun testo riduce il precedente 'stato' puoi semplicemente restituirlo – philk