我做了一些研究,但我发现旧的例子通常是 Redux 或一个主要组件,但无法弄清楚逻辑。
我可以从 API 获取数据,但我确实需要对该数据进行搜索、排序、过滤等(即使是同时进行)。我知道我不应该直接改变状态,所以在这种情况下,我将有几个不同的状态集,例如filteredData、sortedData 等。但是,我将把哪个状态传递给 Player 组件?排序功能将如何处理过滤后的数据?我非常困惑。
我想将我的状态和与状态相关的逻辑放在 Context 中,但如果这看起来有问题或错误,那么我可以尝试您的方法。
语境
const ContextProvider = ({ children }) => {
const [data, setData] = useState([]);
const [filteredData, setFilteredData] = useState([]);
const [sortedData, setSortedData] = useState([]);
useEffect(() => {
fetch('URL HERE')
.then(data => data.json())
.then(data=> setData(data));
}, []);
const handleSearch = e => {
let value = e.target.value;
const filteredData = data.filter(player=>
player.name.includes(value)
);
setFilteredData(filteredData);
};
const handleSort = e => {
let value = e.target.value;
// I am trying to sort FILTERED DATA?
const sortedData = filteredData.sort((a, b) => {
if (a[value] < b[value]) {
return 1;
} else {
return -1;
}
});
setSortedData(sortedData);
};
return (
<Context.Provider
value={{ data, handleSearch, handleSort, filteredData, sortedData}}
>
{children}
</Context.Provider>
);
};
搜索
const Search = () => {
const { handleSearch, handleSort } = useContext(Context);
return (
<div className='row'>
<Input
type='search'
name='search'
onChange={handleSearch}
></Input>
<Input
type='select'
name='select'
onChange={handleSort}
>
<option value='name'>Name</option>
<option value='team'>Team</option>
</Input>
</div>
);
};
播放器
const Player = () => {
const {data, filteredData, sortedData} = useContext(Context);
return (
<ul>
//{data or filteredData or sortedData will be mapped?}
<li>// not sure what to do</li>
</ul>
);
};
我真的很欣赏带有一些解释的代码示例。