reactjs - onChange 回调返回错误的 id
问题描述
我有以下代码
const inputRef = useRef<HTMLInputElement>(null);
const handleClick = () => {
if (inputRef.current) inputRef.current.click();
};
return (
<Container fixed>
<div className={classes.root}>
<Grid container spacing={1}>
{data &&
data.map(category => (
...
<Link to={`/products/${category.id}`}>
...
<input
accept="image/*"
hidden
type="file"
ref={inputRef}
onChange={e => handleChange(e, category.id)}
/>
<IconButton onClick={handleClick}>
<InsertPhoto />
</IconButton>
出于某种原因,链接组件 category.id 为 1,但在句柄更改中,我只是控制台记录了 id,它返回 10(最后一个 category.id)这怎么可能?完整的代码可以在这里找到https://pastebin.com/ZiDTkdTU
解决方案
您的代码的问题是ref
您正在使用。
data
您在数组中有几个类别(您提到了 10 个) 。但只有一个inputRef
存在。因此,在遍历数组时,您将此单个 ref 绑定到每个输入。最后inputRef
绑定到最后一个<input>
元素。
然后单击<IconButton>
以插入照片,此单击将转移到<input>
元素,该元素将打开文件选择对话框(因为它具有type="file"
)。但是任何<IconButton>
点击总是转移到最后一个<input>
元素,因为你有 single inputRef
。所以onChange
也总是为最后一个输入触发,向你展示id === 10
.
<input>
随着元素被隐藏并且您看不到哪个<input>
元素接受文件,问题变得更糟。
解决方案是创建 refs 数组,每个用于 single <input>
。
这是展示这种效果的示例。无论您选择什么“选择文件”按钮,最后都会选择文件<input>
,控制台将始终记录 3。
这是使用 ref 数组的正确示例。
推荐阅读
- javascript - [i] 在 javascript 函数中用于什么?
- openmp - 使用 openMP 和 openACC 的多线程多 GPU 计算
- amazon-web-services - AWS PowerShell 自定义 SSO 回调:在此线程中没有可用于运行脚本的运行空间
- sql - SQL 按顺序分组和组的顺序 ID
- selenium - 如何使 Selenium WebdriverJS 代码按顺序执行
- python - 使用经过训练的 RNN 模型在 Magenta-js 中生成 midi。matMul 中的错误:形状为 1,74 和 582,256 的张量的内部形状 (74) 和 (582) 必须匹配
- android - 充气 RecyclerView 时出现 InflateException
- javascript - React,useState - 为什么在作为(props)传递时不能检索状态值,但在传递({props})时可以?
- algorithm - 使用 Go 固定容量 PriorityQueue 查找前 N 个元素
- c# - 数据库更新时更新列表视图