javascript - 具有动态数组长度的 react 钩子(Hook)

标签 javascript reactjs react-hooks

我有以下虚拟示例:

function App({size}) {
  const [values, setValues] = React.useState(Array(size).fill(''));
  function onChange(index, event) {
    console.log('setting index: ', index)
    console.log('to value: ', event.target.value);
    values[index] = event.target.value;
    setValues(values);
  }

  console.log('values are');
  console.log(values);

  const inputs = Array(size).fill().map((_, index) => (
    <input
      key={`input-${index}`}
      value={values[index]}
      onChange={e => onChange(index, e)}
    />
  ));

  return (
    <React.Fragment>
      {inputs}
    </React.Fragment>
  )
}

ReactDOM.render(
  <App size={3} />,
  document.getElementById('container')
);

我希望能够将 size 传递给 App 并动态获取那么多输入。

当我运行它并输入输入时,我看到了

values are
["", "", "", ""]
setting index: 3
to value: s
setting index: 1
to value: e
setting index: 0
to value: f

看起来我的组件没有重新渲染。这是为什么?

最佳答案

您的问题很可能是您试图直接改变状态。在您的 onChange 函数中,您应该确保不要尝试改变它。

function onChange(index, event) {
  const newValues = values.map((value, i) => {
    return i === index ? event.target.value : value;
  });
  setValues(newValues);
}

关于javascript - 具有动态数组长度的 react 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58635434/

相关文章:

javascript - 元素当前不可见,因此单击按钮时可能无法与之交互

javascript - 如何使用 ReactJS 将对象绑定(bind)到输入标签而不仅仅是值?

javascript - Ipad 滚动到达底部条件未满足

reactjs - 在 React Bootstrap 中居中模式标题和按钮

javascript - useLocation() 即使在 Router 上下文中也不起作用

reactjs - 如何在组件之间传递 React Hook 模态状态?

javascript - 有什么方法可以在页脚内显示从剑道中的日期选择器中选择的日期?

javascript - 点击提交后,React js中输入没有提交

reactjs - react 测试库 : Unable to Select Material UI DatePicker Button

javascript - 如何将数据从 vanilla JavaScript 传递到 React 功能组件