【发布时间】:2021-12-18 04:31:46
【问题描述】:
我有一个数组,称为reportsData,然后我需要对其进行过滤,生成一些复选框,每个复选框都有一个基于来自另一个数组(emittersData)的每个名称的标签,所以基本上我这样设置它:
const [searchUser, setSearchUser] = useState<string[]>([])
const mappedAndFiltered = reportsData
.filter((value: any) =>
searchUser.length > 0 ? searchUser.includes(value.user.name) : true
)
然后我像这样渲染我的复选框:
function EmittersCheckboxes () {
const [checkedState, setCheckedState] = useState(
new Array(emittersData.length).fill(false)
)
const handleOnChange = (position: any, label: any) => {
const updatedCheckedState = checkedState.map((item, index) =>
index === position ? !item : item
)
setSearchUser((prev) =>
prev.some((item) => item === label)
? prev.filter((item) => item !== label)
: [...prev, label]
)
setCheckedState(updatedCheckedState)
};
return (
<div className="App">
{emittersData.map((value: any, index: any) => {
return (
<li key={index}>
<div className="toppings-list-item">
<div className="left-section">
<input
className="h-4 w-4 focus:bg-indigo border-2 border-gray-300 rounded"
type="checkbox"
id={`custom-checkbox-${index}`}
name={value.Attributes[2].Value}
value={value.Attributes[2].Value}
checked={checkedState[index]}
onChange={() => handleOnChange(index, value.Attributes[2].Value)}
/>
<label className="ml-3 font-medium text-sm text-gray-700 dark:text-primary" htmlFor={`custom-checkbox-${index}`}>{value.Attributes[2].Value}</label>
</div>
</div>
</li>
);
})}
</div>
)
}
在反应组件上,我正在渲染每个复选框,即li,例如:
<ul><EmittersCheckboxes /></ul>
最后我渲染了mappedAndFiltered。
然后没关系,当我单击每个生成的复选框时,它会过滤设置setSearch用户状态的数组并过滤数组。
您可以在此处查看:可流式传输。 com /v6bpk6 看到过滤器正在工作,数组中的项目总数根据选中的复选框(一个或多个)而变化。
但问题是每个复选框都没有被“选中”,它保持空白(未切换)。
我做错了什么,为什么它不检查自己?
【问题讨论】:
-
这是真实的代码还是你使用 React 组件来渲染每个项目?
-
我只是把各个函数放了起来,这样容易阅读,因为整个文件很大。如果您需要查看,请在此处查看:pastebin.com/5akZa2X4(代码中有很多未使用的内容,请忽略它们,专注于我在帖子中所说的内容)
-
你在你的父组件中定义了一个新的
EmittersCheckboxes组件......它会工作,但有点奇怪 -
我不明白,不明白你想说什么。而且它不起作用..复选框没有保持选中状态。
标签: javascript reactjs typescript checkbox filter