Как отфильтровать массив по имени в react redux?

Я получаю данные с API рандомных пользователей.
Далее хочу, что бы при введении имени в поиск, возвращало карточки совпавшие по имени. И при стирании имени возвращало исходную коллекцию.
5f7b151817a55155967118.png
reducer
import { FETCH_USERS, SEARCH_VALUE, } from "../actions/actionTypes";

export function addFetchUsers(payload){
    return {
        type: FETCH_USERS,
        payload: payload
    }
}

export function getFetchUsers() {
    return dispatch => {
        return fetch('https://randomuser.me/api/?results=10')
            .then(response => response.json())
            .then(json => {
                dispatch(addFetchUsers(json.results))
                return json.products;
            })
    }
}


export function addSearchValue(payload){
    return {
        type: SEARCH_VALUE,
        payload: payload
    }
}


action

import { FETCH_USERS, SEARCH_VALUE } from "../actions/actionTypes";


const initialState = {
    users: [],
    searchValue: '',
}

const reducerFetchUsers = (state = initialState, action) => {

    switch (action.type) {

        case FETCH_USERS:
            return {
                ...state,
                users: state.users.concat(action.payload)
            }

        case SEARCH_VALUE:
            return {
                ...state,
                searchValue: action.payload
            }

        default:
            return state;
    }

};

export default reducerFetchUsers;


Ну и непосредственно компонент в котором вывожу карточки

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { getFetchUsers } from '../../../redux/actions/actionFetchUsers';

const UsersPosts = () => {

    const usersPosts = useSelector(state => state.reducerFetchUsers.users);
    const dispatch = useDispatch();

    useEffect(() => {
        dispatch(getFetchUsers());
    }, [dispatch]);

    return (
        <div className="row">
            <ul className="list">
                {
                    usersPosts.map((user, index) => {
                        return (
                            <div className="col-lg-4" key={index}>
                                <li className="list__item">
                                    <span>{user.name.first}</span>
                                    <span>{user.gender}</span>
                                    <span>{user.email}</span>
                                    <span>{user.location.country}</span>
                                </li>
                            </div>
                        );
                    })
                }
            </ul>
        </div>
    )
}

export default UsersPosts;
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
@davidnum95
const usersPosts = useSelector(state => {
    const { users, searchValue } = state.reducerFetchUsers
    if (!searchValue)
      return users

    return users.filter((user) => user.name.includes(searchValue))
  })
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы