reactjs - React 中最近查看的组件的改进
问题描述
我有一个使用 REST 国家 API 创建的小应用程序。
https://rest-country-react.netlify.app/
如果您单击一个国家/地区卡,则它会显示在“最近查看”标题下。到目前为止它工作正常,但我想稍微调整一下。我以为我会做的:
#1 添加最近浏览的三个国家的限制,所以基本上如果用户点击4,5,6个国家,只显示最近点击的三个国家。
#2 访问过的国家目前按“最旧”到“最新”的顺序排序。我想扭转它,所以最新的获得第一个位置,然后是第二个最新的,然后是第三个,依此类推。
我被卡住了,因为我不确定如何实施这些调整。对于第一个,我认为我会在将状态数组映射到组件中之前对其进行过滤,例如...如果索引> 2,则将其过滤掉元素。
但是对于第二个,我还没有找到解决方案。也许我应该使用 unshift() 而不是使用 concat() 方法?根据我在 React 文档中阅读的内容,不建议直接编辑状态或其数组,所以我不知道该怎么做。
onCountryClick(country) {
const uniqueRecent = [
...new Set(this.state.recentlyViewed.concat(country)),
];
this.setState({
// ... other state updates here
recentlyViewed: uniqueRecent
});
}
解决方案
实际上有多种解决方案,但让我们采用一个非常干净且易于理解的解决方案:
onCountryClick(country) {
const { recentlyViewed } = this.state;
const newState = {}; // add your other updates here
if (!recentlyViewed.includes(country)) {
// firstly take first two items as a new array
newState.recentlyViewed = recentlyViewed.slice(1);
// add country into beginning of new array
newState.recentlyViewed.unshift(country);
}
this.setState(newState);
}
首先,我们检查国家/地区是否已经存在于recentlyViewed
数组中,如果不存在,则继续。更新状态时我们必须使用新数组,所以简单地调用unshift()
方法对我们不起作用,因为它修改了原始数组并且不返回新数组。相反,我们首先调用.slice()
方法,它为我们解决了两个主要问题:它获取原始数组的一部分(在我们的例子中,索引为 0 和 1 的项目)并与它们一起返回新数组。伟大的!现在我们可以轻松地使用unshift
将国家添加到新数组的开头。然后简单地更新状态。
使用此解决方案,您始终会获得一个最多包含 3 个国家/地区的新数组,其中第一项是最新的。
推荐阅读
- python - 在嵌套的while循环中更新熊猫索引和行
- reactjs - 为什么我的类型编号值在 Firestore 中存储为字符串?
- r - 搜索多列 dplyr
- javascript - 在 React JS 中隐藏特定组件的页眉和页脚
- reactjs - 使用 react-testing-library 进行 useContext 测试
- angular - 从 Angular 获取没有客户端密码、Power BI 的用户名/密码的 Azure AD 访问令牌
- php - 添加 Swagger Laravel 后无法创建新路由
- arrays - 将零移动到数组的开头
- reactjs - 如何检查用户是否使用 React 和 Embedded RuBy (erb) 登录?
- python - 如何从 Keras 加载本地图像?