@rt_s23

Как перерисовать дочерний функциональный компонент?

У меня есть запрос на сервер, после завершения которого рисуется компонент UsersList. Также я хочу добавить фильтрацию по городу или компании в алфавитном порядке, и у меня успешно меняется массив объектов users, но мне необходимо перерисовать компонент UsersList, используя новый массив объектов users.

Код:

Родительский компонент App:

import axios from 'axios';
import React, { useEffect, useState } from 'react';
import { Aside } from './components/aside/Aside';
import { UsersList } from './components/usersList/UsersList';
import './App.scss';
import { UsersTypes } from './interfaces/usersInterface';




const App:React.FC = () => {
  const [users,setUsers] = useState<UsersTypes[]>([]);
  const [loading,setLoading] = useState(false);

  useEffect(()=>{
    const getUsers = async ()=>{
      const result = await axios('https://jsonplaceholder.typicode.com/users');
      setLoading(true);
      setUsers(result.data);
    }
    getUsers();
    console.log(users);
  },[])

  const citySortHandler = () =>{
    setUsers(users.sort((a, b) => a.address.city > b.address.city ? 1 : -1));
    console.log(users);
  }

  const companySortHandler = () =>{
    setUsers(users.sort((a, b) => a.company.name > b.company.name ? 1 : -1));
    console.log(users);
  }

  return (
    <div className='container'>
      <Aside citySort={citySortHandler} compantSort = {companySortHandler}/>
      <UsersList users={users}/>
    </div>
  );
}

export default App;

Компонент UsersList:

import { UsersTypes } from "../../interfaces/usersInterface";
import './usersList.scss'

type usersListProps ={
  users: UsersTypes[]
}


export const UsersList: React.FC<usersListProps> = ({users}) =>{
  

  return(
    <div className="users__container">
      <ul className="users__list">
        {users.map(user=>{
          return(
            <li key={user.id} className='users__item'>
              <div className='users__descr'>
                <span>ФИО: {user.name}</span>
                <span>город: {user.address.city}</span>
                <span>компания: {user.company.name}</span>
              </div>
              <a href="/" className='users__link'>Подробнее</a>
            </li>
          );
        })}
      </ul>
      <p>найдено {users.length} пользователей</p>
    </div>
  );
}


Компонент с кнопками фильтра:

import './aside.scss'

type AsideProps = {
  citySort: () => void,
  compantSort: () => void
}

export const Aside: React.FC<AsideProps> = ({citySort, compantSort}) =>{

  return(
    <div className="aside__container">
      <h1>Сортировка</h1>
      <button onClick={citySort}>По городу</button>
      <button onClick={compantSort}>По компании</button>
    </div>
  );
}


6265bbc6c7a71418320417.jpeg
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
setUsers(users.slice().sort((a, b) => a.address.city > b.address.city ? 1 : -1));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы