在購物網站、瀏覽器、地圖等等地方搜尋欄是隨處可見的東西,在這邊我們要教大家如何在地圖中利用Antd的AutoComplete來實踐搜尋功能。當我們按下enter鍵後會將畫面帶到該景點的詳細介紹頁面。
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { Row, Col, Button, AutoComplete, Input } from 'antd';
這邊的useNavigate是切換頁面會用的,那我們也先在這邊定義好。
const [options, setOptions] = useState([]); // 搜尋選項
const navigate = useNavigate();
const onSelect = (value, option) => {
navigate(`/places/id/${option.id}`);
};
filter() :方法會篩選出符合條件的景點。這裡的條件是每個 landmark.name 是否包含搜尋字串。toLowerCase :忽略大小寫差異,舉例來說,搜尋Osaka時,打成小寫的o也可以搜尋的到,是相當的方便。setOptions():將篩選和轉換後的 searchResults 更新到 options 狀態,這樣 AutoComplete 元件就會顯示這些建議選項。
// 當使用者輸入時動態提供搜尋建議
const handleSearch = (value) => {
const searchResults = landmarks
.filter(landmark =>
landmark.name.toLowerCase().includes(value.toLowerCase()))
.map(landmark => ({
value: landmark.name,
id: landmark.id, // 加入 ID 以便搜尋後導覽
}));
setOptions(searchResults);
};
onSearch 函數:
Enter 鍵後觸發的行為,通常與 Input.Search 或其他輸入元件綁定。value 是使用者在搜尋欄中輸入的文字。landmarks.find():
find() 是一個 JavaScript 陣列方法,用來找到第一個符合條件的元素。find() 會遍歷 landmarks 陣列(包含所有景點資訊),並尋找與 value(使用者輸入的文字)相匹配的景點名稱。navigate():
navigate() 是由 react-router-dom 提供的用來進行路由導航的方法。navigate() 會將使用者導覽到該景點的詳細頁面,這裡的路徑是 /places/id/${selectedPlace.id},其中 ${selectedPlace.id} 是該景點的唯一的id。// 處理按下 Enter 鍵後的行為
const onSearch = (value) => {
const selectedPlace = landmarks.find
(landmark => landmark.name.toLowerCase() === value.toLowerCase());
if (selectedPlace) {
navigate(`/places/id/${selectedPlace.id}`);
}
};
{/* 搜尋欄 */ }
<Row justify="center" className={styles.searchRow}>
<Col span={18}>
<AutoComplete
options={options}
onSearch={handleSearch}
onSelect={onSelect}
style={{ width: '65%' }}
>
<Input.Search
placeholder="搜尋景點"
enterButton
onSearch={onSearch} // 處理 Enter 鍵觸發導航
/>
</AutoComplete>
</Col>
</Row>
可以看到就算大小寫錯誤,還有第一個字母不是o的時候,搜尋欄位也能根據我們JSON檔中的資料為我們提供搜尋建議。
今天透過antd中的AutoComplete來完成搜尋欄的功能,包含搜尋建議、將頁面跳到該景點的詳細介紹頁面,算是一個簡單實用的功能。其中的filter的篩選、navigate的導覽語法是這篇比較重要的內容,希望大家能順利完成這個簡單實用的功能!接下來,我們要完成將景點加入到收藏、建立行程的功能,我們會帶大家了解Redux的基本用法與安裝!