反应具有动态数组长度的钩子

时间:2019-10-31 00:34:08

标签: 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

好像没有重新渲染我的组件。这是为什么?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

正如@Nick所提到的那样,问题在于我直接改变了状态本身。我最终使用了以下方法(而不是有效的Nick的方法):

function onChange(index, event) {
  const newValues = [...values];
  newValues[index] = event.target.value;
  setValues(newValues);
}