在 Reactjs 中实现搜索过滤器的问题 - 触发问题
Problem in implementing Search Filter in Reactjs- Trigger issues
我正在实施一个带有搜索过滤器的反应数据 table 来搜索行。您可以查看 UI here 以更好地理解代码。我最初实现它是为了按名称搜索行。 (稍后我将实现它以在所有列中搜索)。
如您在 UI 中所见,顶部有三个条目,分别名为“Kamakshi”、“Kanika”和“Kanika”。当我在搜索框中键入“Kam”时,会显示 this 结果。现在按下退格键,我的输入变成了“ka”,这意味着我的搜索结果应该显示三行“Kamakshi”、“Kanika”和“Kanika”。但是没有变化。
我想在每次输入发生变化时触发搜索过滤器。我在 useEffect 中将它作为依赖项传递,但它没有用。
这里是我的Bookings2.js(Table是在这实现的)
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";
let bookings_array = [];
const Bookings2= ()=>{
const[Bookings, setBooking]=useState([]);
const[search, setSearch]=useState("");
useEffect(()=>{
loadUsers();
}, []);
useEffect(()=>{
if(search.length){
setBooking(
Bookings.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
}else{
setBooking(bookings_array)
}
}, [search, Bookings]);
const loadUsers= async()=>{
const result =await axios.get("http://localhost:3001/Bookings");
bookings_array=result.data.reverse();
setBooking(bookings_array);
};
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">Bookings2 Page</h2>
<table class="table table-bordered table-striped border shadow">
<thead>
<tr>
<th scope="col" colSpan={5}>
<BsFilterRight/>
<input
placeholder=" search....."
onChange={e=>setSearch(e.target.value)}
/>
</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>
{Bookings.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 Bookings2;
只要搜索发生变化,您就会从 Bookings 中删除内容...但是当新的更改出现时您不会将它们添加回去,这就是它们不会在退格时返回的原因。如果您想重新加载原始预订以进行过滤,您需要再次 运行 您的 loadUsers
功能。
不要过滤状态数组,而是尝试过滤存储在 bookings_array
中的原始数组。所以改变这个:
if (search.length) {
setBooking(
Bookings.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
} else {
setBooking(bookings_array)
}
至:
if (search.length) {
setBooking(
bookings_array.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
} else {
setBooking(bookings_array)
}
我正在实施一个带有搜索过滤器的反应数据 table 来搜索行。您可以查看 UI here 以更好地理解代码。我最初实现它是为了按名称搜索行。 (稍后我将实现它以在所有列中搜索)。
如您在 UI 中所见,顶部有三个条目,分别名为“Kamakshi”、“Kanika”和“Kanika”。当我在搜索框中键入“Kam”时,会显示 this 结果。现在按下退格键,我的输入变成了“ka”,这意味着我的搜索结果应该显示三行“Kamakshi”、“Kanika”和“Kanika”。但是没有变化。
我想在每次输入发生变化时触发搜索过滤器。我在 useEffect 中将它作为依赖项传递,但它没有用。
这里是我的Bookings2.js(Table是在这实现的)
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";
let bookings_array = [];
const Bookings2= ()=>{
const[Bookings, setBooking]=useState([]);
const[search, setSearch]=useState("");
useEffect(()=>{
loadUsers();
}, []);
useEffect(()=>{
if(search.length){
setBooking(
Bookings.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
}else{
setBooking(bookings_array)
}
}, [search, Bookings]);
const loadUsers= async()=>{
const result =await axios.get("http://localhost:3001/Bookings");
bookings_array=result.data.reverse();
setBooking(bookings_array);
};
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">Bookings2 Page</h2>
<table class="table table-bordered table-striped border shadow">
<thead>
<tr>
<th scope="col" colSpan={5}>
<BsFilterRight/>
<input
placeholder=" search....."
onChange={e=>setSearch(e.target.value)}
/>
</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>
{Bookings.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 Bookings2;
只要搜索发生变化,您就会从 Bookings 中删除内容...但是当新的更改出现时您不会将它们添加回去,这就是它们不会在退格时返回的原因。如果您想重新加载原始预订以进行过滤,您需要再次 运行 您的 loadUsers
功能。
不要过滤状态数组,而是尝试过滤存储在 bookings_array
中的原始数组。所以改变这个:
if (search.length) {
setBooking(
Bookings.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
} else {
setBooking(bookings_array)
}
至:
if (search.length) {
setBooking(
bookings_array.filter(Booking =>
Booking.name.toLowerCase().includes(search.toLowerCase())
)
)
} else {
setBooking(bookings_array)
}