Реагировать хуки с динамической длиной массива - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующий фиктивный пример:

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 голосов
/ 31 октября 2019

Как упомянул @Nick, проблема заключалась в том, что я непосредственно мутировал само состояние. В итоге я использовал следующий подход (вместо подхода Ника, который работает):

function onChange(index, event) {
  const newValues = [...values];
  newValues[index] = event.target.value;
  setValues(newValues);
}
0 голосов
/ 31 октября 2019

Скорее всего, ваша проблема в том, что вы пытаетесь напрямую изменить состояние. В вашей функции onChange вы должны стараться не изменять ее.

function onChange(index, event) {
  const newValues = values.map((value, i) => {
    return i === index ? event.target.value : value;
  });
  setValues(newValues);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...