javascript - 尝试根据过滤器选择用字符串值填充数组,并通过将数组与记录属性的字符串值进行比较来过滤记录
问题描述
我有一个 API 响应,它返回一个记录列表,每个记录都有一个“状态”属性。状态可以是“当前”、“以前”、“从不”。
我有一组 3 个复选框,每个复选框都有一个值,用户单击该值以相应地过滤记录列表。
我试图实现过滤功能的方式是使用钩子const [statuses, setStatuses] = useState<string[]>([]);
然后使用来自以下位置的每个复选框的值填充该数组:
<div>FILTER BY STATUS</div>
<FilterSection>
<span><input type="checkbox" value="Current" onClick={handleStatusChange}/> Current</span>
<span><input type="checkbox" value="Former" onClick={handleStatusChange}/> Former</span>
<span><input type="checkbox" value="Never" onClick={handleStatusChange}/> Never </span>
</FilterSection>
</div>
然后我有调用handleStatusChange的onClick方法:
const handleStatusChange = e => {
setStatuses([...statuses, e.target.value]);
props.onFilterChange(statuses, state)
console.log('status value: ', e.target.value)
};
它将其值传递给容器组件并输入过滤器函数,如下所示:
const handleFilterChange = (status: string[], state: string) => {
store.set('currentPage')(0);
const allLocations = store.get('locations');
let filteredLocations = allLocations.slice();
const pageSize = store.get('pageSize');
if (status && status.length > 0) {
filteredLocations = filteredLocations
.filter(l => {
l.financialDetails && l.financialDetails.locationStatus === status;
})
.slice();
}
store.set('filteredLocations')(filteredLocations);
const pagedLocations = filteredLocations.slice(0, pageSize);
store.set('pagedLocations')(pagedLocations);
store.set('locationsLoading')(false);
};
我看到的问题是我在里面handleFilterChange
说TypeScript 错误This condition will always return 'false' since the types 'string' and 'string[]' have no overlap.
编辑
我已经更新了handleStatusChange
函数并且它正在填充数组但仅在第二次单击复选框时。因此,在第一次单击时,它会生成一个空数组,在第二次单击时,它会抓取第一次单击的值并将其推送到数组中,这样它总是在用户实际选择的内容之后单击一次。
解决方案
我认为这样的事情会奏效。
const handleStatusChange = e => {
const status = e.target.value;
if (!statuses.includes(status)) {
setStatuses(statuses.concat(status));
}
else {
const statusIndex = statuses.findIndex(status);
statuses.splice(statusIndex, 1);
setStatuses(statuses);
}
props.onFilterChange(statuses)
};
而对于 handleFilterChange...
const handleFilterChange = (statuses: string[]) => {
const allLocations = store.get('locations');
let filteredLocations = allLocations.slice();
if (statuses && statuses.length) {
statuses.forEach((status) => {
filteredLocations = filteredLocations
.filter(l => (l.financialDetails && l.financialDetails.locationStatus !== status));
}
const pagedLocations = filteredLocations.slice(0, pageSize);
};
我删除了一些我认为与问题无关的代码。
推荐阅读
- r - 比较两个字符串并查找差异并显示它们以便在 R 中轻松查看(类似于 git diff)?
- coq - 如何用索引定义列表
- reactjs - 减速器从哪里获得状态?
- ios - iOS SDK 中的 Mapbox 导航、重新路由问题
- angular6 - 如何在 ngx bootstrap tabset 中上一个活动选项卡
- android - Android WebView 视频全屏模式不起作用
- java - jar依赖中的权限被拒绝heroku错误
- swift - 警报按钮的 .default 成员没有上下文类型错误
- angular - 关闭角度应用程序的最后一个浏览器选项卡
- ios - 无法附加检索到的文档