Проблема с реализацией двух фильтров поиска в таблице react

#reactjs #search #react-hooks #react-table

#reactjs #Поиск #реагирующие хуки #react-таблица

Вопрос:

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

Теперь проблема в том, что я успешно реализовал поиск по имени, и он работает нормально. Теперь я закодировал поиск по консультанту, но я не знаю, как вызвать его в теле таблицы вместе с поиском по имени.

Вот мой Bookings.js . Я знаю, что мне нужно вызывать FilteredConsultants в теле таблицы вместе с FilteredNames, но как это сделать?

 import React, {useState, useEffect} from 'react';
import axios from 'axios';
import {Link} from 'react-router-dom';
import '../../static/Bookings.css';
import {BsFilterRight} from "react-icons/bs";

const Bookings= ()=>{
    const[Bookings, setBooking]=useState([]);
    const[searchByName, setSearchByName]=useState('');
    const[FilteredNames, setFilteredNames]=useState([]);
    const[searchByConsultant, setSearchByConsultant]=useState('');
    const[FilteredConsultants, setFilteredConsultants]=useState([]);

    useEffect(()=>{
        loadUsers();
    }, []);

    useEffect(()=>{
        setFilteredNames(
            Bookings.filter(Booking=>{
                return Booking.name.toLowerCase().includes(searchByName.toLowerCase())
            })
        )
    }, [searchByName, Bookings]);

    useEffect(()=>{
        setFilteredConsultants(
            Bookings.filter(Booking=>{
                return Booking.consultant.toLowerCase().includes(searchByConsultant.toLowerCase())
            })
        )
    }, [searchByConsultant, Bookings]);

    const loadUsers= async()=>{
        const result =await axios.get("http://localhost:3001/Bookings");
        setBooking(result.data.reverse());
    };

    const deleteUser=async id => {
        await axios.delete(`http://localhost:3001/Bookings/${id}`);
        loadUsers();
    }

    return(
        <div className="Booking-page-container">
            <h2 className="text-center mb-4">Bookings Page</h2>
            <table class="table table-bordered table-striped border shadow">
                <thead>
                    <tr>
                        <th scope="col"></th>
                        <th scope="col">
                        <BsFilterRight/>
                            <input 
                                placeholder="search by name..."
                                onChange={e=>setSearchByName(e.target.value)}
                            />  
                        </th>
                        <th scope="col">
                        <BsFilterRight/>
                            <input 
                                placeholder="search by consultant..."
                                onChange={e=>setSearchByConsultant(e.target.value)}
                            />
                        </th>
                        <th scope="col">Email</th>
                        <th>Action</th>
                    </tr>
                </thead>
          
                <thead class="thead-dark">
                    <tr>
                        <th scope="col"></th>
                        <th scope="col">Name</th>
                        <th scope="col">Consultant</th>
                        <th scope="col">Email</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                    {FilteredNames.map((Booking,index)=>(
                        <tr>
                            <th scope="row">{index 1}</th>
                            <td>{Booking.name}</td>
                            <td>{Booking.consultant}</td>
                            <td>{Booking.email}</td>
                            <td>
                                <Link class="btn btn-primary mr-2" to={`/Bookings/view/${Booking.id}`}>View</Link>
                                <Link class="btn btn-outline-primary mr-2" to={`/Bookings/edit/${Booking.id}`}>Edit</Link>
                                <Link class="btn btn-danger" onClick={()=>deleteUser(Booking.id)}>Delete</Link>
                            </td>
                        </tr>   
                    ))}
                </tbody>
            </table>
        </div>
    );
};

export default Bookings;
 

Комментарии:

1. Должны ли ваши фильтры быть условием ИЛИ или И? Другими словами, если кто-то вводит имя и консультанта, должны ли в бронировании отображаться это имя и консультант?

2. Это должно быть И основано

3. Если я ввожу имя и согласного, то я хочу увидеть строки таблицы, которые удовлетворяют обоим условиям.

Ответ №1:

Прямо сейчас в таблице once searchByConsultant or searchByName is changed отображаются заказы, отфильтрованные только по одному из значений.

Если вы хотите отфильтровать с помощью условия «и», тогда вам нужно будет создать фильтр, используя оба значения.

 useEffect(()=>{
  setFilteredNames(
      Bookings.filter(Booking=> {
        const byName = !searchByName || Booking.name.toLowerCase().includes(searchByName.toLowerCase());
        const byConsultant = !searchByConsultant || Booking.consultant.toLowerCase().includes(searchByConsultant.toLowerCase());
        return byName amp;amp; byConsultant;
      })
  )
}, [searchByName, searchByConsultant, Bookings]);

 

FilteredConsultants кажется, что здесь это на самом деле не используется