reactjs - React ref.current 内部循环仅在第一次迭代时起作用
问题描述
我有一个页面,其中从地图呈现带有标签复选框的文件。基本上用户可以选择/取消选择文件。问题是我想添加可以通过单击按钮选择/取消选择所有文件的功能。我试图为此使用 refs。
const fileRef = React.useRef([]);
然后我有简单的地图:
files.map((file, index) =>
<FormControlLabel
ref={el => fileRef.current[index] = el}
control={...}
label={file.name}
/>
)
我试图创建这样的功能:
const selectAll = () => {
for(let i = 0; i < files.length; i++) {
fileRef.current[i].control.click();
}
}
问题是只有第一个文件被选中/取消选中。选定的文件保存在数组中。手动单击是通过简单的 handleChange 处理的,我在其中选择带有 event.target.value 的复选框,而在取消选择时我只使用 array.filter。
例如,如果我用两个不同的索引制作两个按钮,那么它可以工作,但在循环内索引似乎没有生效。
有没有办法一键选择/取消选择所有文件?我认为取消选择很容易,我只是清除数组,但选择似乎是个问题。Ref 仅适用于第一项。
解决方案
不要使用 ref 尝试单击所有复选框,只需更改文件状态以检查所有文件。
我假设它files
是由一些 api 调用加载的,并且您的组件正在执行类似的操作
const [files, setFiles] = useState([])
useEffect(() => {
loadFiles().then(files => {
const filesWithCheckParam = files.map(file => ({ ...file, isChecked: false }))
setFiles(filesWithCheckParam)
})
}, [])
现在您可以放入一个按钮或另一个复选框或任何带有更改文件状态的单击处理程序的内容,例如
const handleCheckAllClick = checked => {
setFiles(fs => fs.map(f => ({ ...f, isChecked: checked })))
}
推荐阅读
- angular - 无法使用 Angular 8 升级 Angular 材质
- javascript - 为什么在中止其他 ajax 调用后将 ajax 重定向到操作 url?
- node.js - 从 NodeJs 作为后端进行 3rd 方 API 调用并渲染在 ReactJs 前端接收到的数据
- angular - 当我使用 ng build 时停止 angular cli 要求收集分析
- oauth-2.0 - php - 存储 access_token 的最佳解决方案
- keycloak - 使用 scriptMapper 计算 Keycloak 客户端属性
- node.js - 使用流功能后如何获得响应?
- html - owl carousel 2中图像之间的空白
- apiconnect-test-monitor - 点击“出了点问题!” 带有 APIC Test & Monitor 桌面版
- django - 在 Travis 上运行 django 单元测试时如何解决“psycopg2.errors.UndefinedTable:关系“auth_user”不存在”