下面只是一个重现此问题的简化虚拟示例.

function MultiplierBox() {
  const [a, setA] = useState([1.0, 2.2])
  function updateA(index, newValue) {
    const newArray = [...a];
    newArray[index] = newValue;
    setA(newArray);
  }
  function Row({ a, index }) {
    function handleA(event) {
      const newValue = parseFloat(event.target.value)
      updateA(index, newValue)
    }
    return <input type="number" value={a[index]} onChange={handleA} />
  }
  return (<div className="MultiplierBox">
    {a}
    <Row a={a} index={0} />
    <Row a={a} index={1} />
  </div>);
}

我try 了什么:

  • 使用单个值而不是数组(有效)
  • 已判断css样式规则
  • 创建了问题的简化版本

我期望的是:

  • 输入字段保持焦点

推荐答案

您已经定义了MultiplierBox组件中的Row组件inside.这意味着每次MultiplierBox呈现时,都会创建一个全新的Row函数.它可能与旧的具有相同的文本,但就Reaction所知,它是一种不同类型的组件.所以Reaction卸掉了旧的一排,挂上了新的一排.新安装的输入没有焦点.

解决办法是在顶层只定义一次所有组件.您将需要修改Row组件,以便updatA是一个传递下来的props :

function Row({ a, index, onChange }) {
  function handleA(event) {
    const newValue = parseFloat(event.target.value);
    onChange(index, newValue);
  }
  return <input type="number" value={a[index]} onChange={handleA} />;
}

function MultiplierBox() {
  const [a, setA] = useState([1.0, 2.2]);
  function updateA(index, newValue) {
    const newArray = [...a];
    newArray[index] = newValue;
    setA(newArray);
  }

  return (
    <div className="MultiplierBox">
      {a}
      <Row a={a} index={0} onChange={updateA} />
      <Row a={a} index={1} onChange={updateA} />
    </div>
  );
}

Reactjs相关问答推荐

无法在主组件的返回语句中呈现预期组件

在Reaction中的第一次装载时,Use Effect返回空数组

Mantine DatePickerInput呈现错误

svg每条路径上的波浪动画

为什么React UseEffect挂钩在页面重新加载时运行

如何在中间件中获取 nextAuth 会话

Redux 工具包不更新状态

在Vite React上获取Amplify的环境变量

Material UI @mui/material/Button vs @material-ui/core/Button,它什么时候改变的,旧版本的文档在哪里

如何在 JS 中绘制具有不同笔画宽度的样条线

单击按钮时如何添加或删除 3d 对象

如何在屏幕上使用相同的可重用

React Native应用如何订阅Supabase的实时数据?

如何在 React map 函数循环中使用
标签

如何在 React 中使用 debounce hooks

使用输入类型文本对 useState 和日期做出react

React 中的 Slide API Mui 在开始而不是结束时触发侦听器

在 React 中,为什么不能向空片段添加键(短语法)?

React如何在用户登录后等待当前用户数据被获取

如何在 NavBar 中设置动态标题