我有一个数组,名为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>
)
}
在react组件上,我呈现每个复选框,即li
,如:
<ul><EmittersCheckboxes /></ul>
我在最后渲染了mappedAndFiltered
。
然后就可以了,当我点击每个生成的复选框时,它会过滤设置setSearch
用户中状态的数组,然后过滤数组。
你可以在这里查看:流媒体。com/v6bpk6请查看过滤器是否正常工作,数组中的项目总数是否根据选中的复选框(一个或多个(而变化。
但问题是,每个复选框并没有变成"已选中",而是保持空白(未切换(。
我做错了什么,为什么它不自我检查呢?
您已经在另一个组件中定义了EmittersCheckboxes
组件。每次父组件渲染(通过状态更改(时,您的内部组件都会被重新定义,一次又一次地导致它失去React为您保留的内部状态。
这里有一个简化的例子:
import React, { useState } from "react";
function CheckboxeComponent() {
const [checkedState, setCheckedState] = useState(false);
return (
<div>
<span>CheckboxeComponent</span>
<input
type="checkbox"
checked={checkedState}
onChange={() => setCheckedState((x) => !x)}
/>
</div>
);
}
export default function App() {
const [counter, setCounter] = useState(1);
function InternalCheckboxeComponent() {
const [checkedState, setCheckedState] = useState(false);
return (
<div>
<span>InternalCheckboxeComponent</span>
<input
type="checkbox"
checked={checkedState}
onChange={() => setCheckedState((x) => !x)}
/>
</div>
);
}
return (
<>
<InternalCheckboxeComponent />
<CheckboxeComponent />
<button onClick={() => setCounter((c) => c + 1)}>{counter}</button>
</>
);
}
有一个App
(父组件(,它有自己的状态(counter
(,有一个按钮可以更改此状态,单击此按钮将增加计数器,导致应用程序的重新呈现。此重新渲染会在每次渲染时重新定义一个名为InternalCheckboxeComponent
的新组件。
InternalCheckboxeComponent
还具有内部状态(checkedState
(。
还有一个外部定义的功能组件,名为CheckboxeComponent
,有了这个组件,React能够保持自己的状态,因为它没有被重新定义(这是相同的功能(
如果将每个的状态设置为"0";"已检查";并单击按钮,这将导致App
的重新渲染,这将重新定义InternalCheckboxeComponent
函数,导致React失去状态。并且CCD_ 15状态保持在React中,因为它是相同的功能。