Управление состоянием отдельных строк в таблице react js

#reactjs #react-hooks #use-state

Вопрос:

У меня есть требование, согласно которому для каждой строки таблицы(строки динамически заполняются) у меня есть кнопка «Подробности», которая должна отображаться модально при нажатии. Как мне сохранить состояние для каждой строки этой таблицы, чтобы React знал, на какую строку я нажимаю, и, следовательно, передавал реквизиты соответственно модальному компоненту?

Я попробовал создать массив всех ложных значений с длиной, такой же, как у моих данных. План состоит в том, чтобы обновить логическое значение для определенной строки при нажатии кнопки. Однако я не могу выполнить то же самое.

Вот что я пробовал до сих пор:

 let initTableState = new Array(data.length).fill(false) const [tableState, setTableState] = useState(initTableState) const detailsShow = (index) =gt; {  setTableState(...tableState, tableState[index] = true) }  

Я получаю «данные» из базы данных. В деталях функции я пытаюсь каким-то образом получить индекс строки, чтобы я мог обновить соответствующее состояние в «Состоянии таблицы». Кроме того, вот как выглядит мой код для вставки в модальный компонент, размещенный сразу после ввода строк:

 {tableState[index] amp;amp; DetailModal}  

Здесь DetailModal-это модальный компонент. Мы будем очень признательны за любую помощь в разрешении этого варианта использования!

Ответ №1:

Это tableState один объект массива. Вы также распространяете массив в функцию setTableState обновления, функция обновления состояния также принимает только один аргумент значения состояния или функцию обратного вызова для обновления состояния.

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

 const detailsShow = (index) =gt; {  setTableState(tableState =gt; tableState.map((el, i) =gt; i === index ? true : el)) }  

Если вы не хотите сопоставлять предыдущее состояние и предпочитаете сначала мелко скопировать массив и обновить конкретный индекс:

 const detailsShow = (index) =gt; {  setTableState(tableState =gt; {  const nextTableState = [...tableState];  nextTableState[index] = true;  return nextTableState;  }) }