【问题标题】:onChange callback returns wrong idonChange 回调返回错误的 id
【发布时间】:2019-11-11 16:58:42
【问题描述】:

我有以下代码

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

【问题讨论】:

  • 请提供小提琴链接而不是 pastebin

标签: reactjs


【解决方案1】:

您的代码有问题是ref 您正在使用。

data 数组中有几个类别(您提到了 10 个)。但是只有一个inputRef 存在。因此,在遍历数组时,您将此单个 ref 绑定到每个输入。最后 inputRef 绑定到最后一个 &lt;input&gt; 元素。

然后单击&lt;IconButton&gt; 插入照片,此单击将转移到&lt;input&gt; 元素,该元素将打开文件选择对话框(因为它有type="file")。但是无论&lt;IconButton&gt;点击总是转移到最后一个&lt;input&gt;元素,因为你有一个inputRef。所以onChange 也总是在最后输入时触发,显示id === 10

问题变得更糟,因为&lt;input&gt; 元素被隐藏并且您看不到&lt;input&gt; 元素接受的文件。

解决方案是创建引用数组,每个引用为单个&lt;input&gt;

这里是sample 来展示这种效果。无论您选择什么“选择文件”按钮,都会为最后一个 &lt;input&gt; 选择文件,并且控制台将始终记录 3。

这里是正确的sample,它使用了 ref 数组。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2021-10-25
  • 2012-01-19
  • 2020-04-03
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多