问题描述
// ui component
import React from 'react';
import { usedispatch,useSelector } from "react-redux";
import { searchPersonAction } from "../store/actions/search";
const Search = () => {
const dispatch = usedispatch();
const selector = useSelector(s => s.search);
const search = (e) => {
const txt = e.target.value;
dispatch(searchPersonAction(txt));
};
return (
<div>
<input onChange={search} placeholder="search"/>
<ul>
{
selector.name.map(p => <li key={p.name}>{p.name}</li>)
}
</ul>
</div>
);
};
export default Search;
// action
import { SEARCH } from './actionTypes';
import { persons } from "../../mock__data";
export const searchPersonAction = (person) => {
const personSearched = persons.filter(p => p.name.toLowerCase().includes(person.toLowerCase()));
console.log(personSearched);
return {
type: SEARCH.SEARCH_PERSON,payload: personSearched,}
};
//reducer
import { SEARCH } from '../actions/actionTypes';
import { persons } from "../../mock__data";
const initialState = {
name:persons
};
export const search = (state = initialState,{ type,payload }) => {
switch (type) {
case SEARCH.SEARCH_PERSON:
return {
...state,name: payload
};
default:
return state;
}
};
以上,我使用const personSearched = persons.filter(p => p.name.toLowerCase().includes(person.toLowerCase()));
进行过滤,并使用上述Search
组件进入了ui。
问:在我的示例中如何使用reselect
库?
解决方法
Reselect documentation中的示例将带您到达那里。您提到的过滤将成为您的重新选择器:
import { createSelector } from 'reselect'
import { persons } from "../../mock__data";
const nameSelector = state => state.name;
export const searchedPersonsSelector = createSelector(
nameSelector,name => persons.filter(p => p.name.toLowerCase().includes(name.toLowerCase()));
);
在组件内部,您可以导入选择器并像已经做的那样使用useSelector
钩子:
import { searchedPersonsSelector } from "./selectors";
const Persons = () => {
const searchedPersons = useSelector(searchedPersonsSelector);
return (
...
);
};