React. Некорректно обрабатывается select

Проблема в изменении селекта e.target.value срабатывает корректно, а в selectedSort данные не закидываются сразу.

Если указать изначальное значение стейта, то работает, но при этом значения не соответствуют выводу

App.js

import React, { useState } from 'react';
import './style.css';

export default function App() {
  const [selectedSort, setSelectedSort] = useState('');

  // ЕСЛИ ИЗНАЧАЛЬНО УКАЗАТЬ, ТО ХОТЬ КАК-ТО РАБОТАЕТ
  // const [selectedSort, setSelectedSort] = useState('city');

  const [data, setData] = useState([
    { id: 1, name: 'Jessica', city: 'LA' },
    { id: 2, name: 'Jacob', city: 'Miami' },
    { id: 3, name: 'Lory', city: 'Moscow' },
    { id: 4, name: 'Lindsey', city: 'London' },
    { id: 5, name: 'Stefani', city: 'France' }
  ]);

  const options = [
    { value: 'name', name: 'По имени' },
    { value: 'city', name: 'По городу' }
  ];

  // Делаем сортировку
  const sortFields = e => {
    setSelectedSort(e.target.value);

    // появляется значение при перевыборе селекта
    console.log('selectedSort: ', selectedSort);

    // срабатывает корректно
    console.log('e.target.value: ', e.target.value);
    setData(
      [...data].sort((a, b) => a[selectedSort].localeCompare(b[selectedSort]))
    );
  };

  return (
    <div>
      {/* Выводим селект */}
      <select value={selectedSort} onChange={sortFields}>
        {options.map(({ value, name }) => (
          <option key={value} value={value}>
            {name}
          </option>
        ))}
      </select>

      <div>
        <div
          style={{
            display: 'flex',
            justifyContent: 'flex-start',
            fontWeight: 700
          }}
        >
          <div style={{ display: 'flex', flex: '0 1 50%' }}>Имя</div>
          <div>Возвраст</div>
        </div>
        {data.map(option => (
          <p
            key={option.name}
            style={{ display: 'flex', justifyContent: 'space-around' }}
          >
            <div>{option.name}</div>
            <div>{option.city}</div>
          </p>
        ))}
      </div>
    </div>
  );
}


Ответы (1 шт):

Автор решения: Lev Shportak

Добавь useEffect который будет делать сортировку при изменении стэйта

  const sortFields = e => {
    setSelectedSort(e.target.value);
  };
  useEffect(()=>{
     setData(
       [...data].sort((a, b) => a[selectedSort].localeCompare(b[selectedSort]))
     );
  },[selectedSort])
→ Ссылка