Как меняется порядок элементов списка в React после клика по кнопке

При исходном ['a','b'] после клика отображение станет ['b','a']. Но reverse сначала мутирует исходный state, и только затем spread создаёт новый массив.

Короткий ответ

Что ответить на собеседовании

При исходном ['a','b'] после клика отображение станет ['b','a']. Но reverse сначала мутирует исходный state, и только затем spread создаёт новый массив.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, как будет изменён порядок отрисованных элементов в DOM после того, как пользователь нажмёт кнопку, учитывая работу хука useState и применение метода reverse к массиву.

import React, { useState } from 'react';

function SimpleList(props) {
  const [list, setList] = useState(props.list || ['a', 'b']);
  const rotateList = () => {
    setList([...list.reverse()]);
  };

  return (
    <div>
      {list.map((txt, id) => {
        return <div key={id}>{txt}</div>;
      })}
      <button onClick={rotateList}>rotate</button>
    </div>
  );
}

Ответ

При исходном ['a','b'] после клика отображение станет ['b','a']. Но reverse сначала мутирует исходный state, и только затем spread создаёт новый массив.

Исправьте на setList(current => [...current].reverse()). Если state был инициализирован props.list, исходная мутация могла затронуть и массив родителя. Индексные key сохраняют идентичность по позиции, а не по элементу; для записей используйте устойчивые ID. Для двух уникальных строк допустим key={txt}.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее