Berikut ialah gambaran keseluruhan tentang perkara yang telah saya cuba setakat ini:
Fungsi data penapis
function filterData(searchText, restaurants) { const filterData = restaurants.filter((restaurant) => restaurant.info.name.includes(searchText) ); return filterData; }
import { restruntList } from "../constants"; // JSON数据 const Body = () => { const [searchText, setSearchText] = useState(""); const [restaurants, setRestaurants] = useState(restruntList); return ( <> <div className="search-container"> <input type="text" className="search-input" placeholder="搜索" value={searchText} onChange={(e) => { setSearchText(e.target.value); }} /> <button className="search-btn" onClick={() => { //过滤数据 const data = filterData(searchText, restaurants); //更新状态 - restaurant变量 setRestaurants(data); }} > 搜索{" "} </button> </div> //UI <div className="restrunt-list"> {restruntList.map((restaurant) => { return <RestruntCard {...restaurant.info} key={restaurant.info.id} />; })} </div> </> ); };
format data JSON restruntList
export const restruntList = [ { info: { id: "23719", name: "麦当劳", cloudinaryImageId: "ee5f8e06b300efc07c9fe3f4df40dfc4", locality: "JM Road", areaName: "Shivajinagar", costForTwo: "₹400 for two", cuisines: ["汉堡", "饮料", "咖啡馆", "甜点"], avgRating: 4.3, } } ]
Berdasarkan kod dan perihalan yang anda berikan, pendekatan ini kebanyakannya kelihatan betul, tetapi terdapat masalah kecil dengan cara ia mengendalikan fungsi data penapis dan data restoran.
Isu utama ialah cara anda mengendalikan penapisan dan mengemas kini status. Memandangkan kemas kini keadaan React adalah tidak segerak dan tidak berlaku serta-merta selepas menggunakan
searchText
值来过滤restaurants
可能无法得到预期的结果。状态更新可能在设置searchText
secara langsung, anda mungkin mendapat hasil yang tidak konsisten atau lapuk yang ditapis.Untuk menyelesaikan masalah ini, anda boleh memanfaatkan
useEffect
钩子在searchText
Kemas kini data penapis apabila ia berubah. Dengan cara ini fungsi penapis akan sentiasa beroperasi pada keadaan terkini. Berikut ialah kod yang dikemas kini:Perubahan dalam kod:
restaurants
更改为filteredRestaurants
untuk mengelakkan kekeliruan antara data mentah dan data yang ditapis.useEffect
钩子来处理searchText
penapis pada perubahan. Ini memastikan kemas kini yang betul bagi data yang ditapis.Kini apabila anda menaip dalam kotak input carian, penapisan harus berkuat kuasa serta-merta dan senarai restoran harus dikemas kini dengan sewajarnya.