ข้ามไปยังเนื้อหา

React Hook

thaizip/react มี hook ชื่อ useThaiAddressAutocomplete ให้ ครอบการค้นหา (searchThaiAddress) พร้อม debounce 200ms และจัดการ state ของ query/suggestions ให้เสร็จสรรพ react/react-dom เป็น peer dependency แบบ optional และไฟล์ที่ build ออกมาแนบ "use client" มาให้แล้ว จึงใช้ได้ใน Next.js App Router ได้เลยโดยไม่ต้องห่อ wrapper เพิ่ม

ลองพิมพ์ในช่องด้านล่าง แล้วคลิกเลือกผลลัพธ์ — ค่าที่เลือกจะถูกส่งกลับผ่าน onSelect เป็นออบเจ็กต์ ResolvedThaiAddress:

กำลังโหลดข้อมูลที่อยู่…

ตัวอย่างแบบไม่ตกแต่ง style

หัวข้อ “ตัวอย่างแบบไม่ตกแต่ง style”

นี่คือ component ที่ demo ด้านบนใช้จริง (ตัดส่วน loading/error ของ index ออก) — เรียก hook แล้ว render input กับ <ul> ของผลลัพธ์แบบดิบ ๆ:

import { useState } from 'react'
import { useThaiAddressAutocomplete } from 'thaizip/react'
import type { ResolvedThaiAddress, TrigramIndex } from 'thaizip'
function AddressAutocomplete({ index }: { index: TrigramIndex }) {
const [selected, setSelected] = useState<ResolvedThaiAddress | null>(null)
const { query, setQuery, setQuerySilent, suggestions, isOpen, selectSuggestion } =
useThaiAddressAutocomplete({ index, onSelect: setSelected })
return (
<div>
<input value={query} onChange={(e) => setQuery(e.target.value)} />
{isOpen && (
<ul>
{suggestions.map((s) => (
<li
key={s.id}
onClick={() => {
const resolved = selectSuggestion(s)
if (resolved) setQuerySilent(s.label)
}}
>
{s.label} ({s.zipCode})
</li>
))}
</ul>
)}
</div>
)
}

หมายเหตุ: useThaiAddressAutocomplete ต้องได้ index ที่ไม่เป็น null ในตัวเลือก และ hook เรียกแบบมีเงื่อนไขไม่ได้ — ถ้า index ของคุณโหลดแบบ async (เช่นผ่าน loadDefaultIndex()) ให้แยก component ชั้นนอกที่รอ index พร้อมก่อน แล้วค่อย render component ชั้นในที่เรียก hook จริง เหมือนที่ HookDemo ทำ

ค่าที่ hook คืนกลับมา

หัวข้อ “ค่าที่ hook คืนกลับมา”
ค่าความหมาย
queryข้อความในช่องค้นหาปัจจุบัน
setQueryตั้งค่า query ใหม่ — จะ trigger การค้นหาแบบ debounce
setQuerySilentตั้งค่า query โดยไม่ค้นหาซ้ำและไม่เปิด dropdown ใหม่ — ใช้ตอนเอา label ที่เลือกแล้วมาแสดงในช่อง input
suggestionsอาเรย์ ThaiAddressSuggestion[] จากการค้นหาล่าสุด
isOpenquery.length > 0 && suggestions.length > 0 — ใช้ตัดสินใจว่าจะแสดง dropdown หรือไม่
selectSuggestionรับ suggestion (จาก suggestions) ทั้งก้อน แล้วคืนค่า ResolvedThaiAddress โดย lookup ด้วย id ของมันแบบ O(1) ภายใน และยิง onSelect; ถ้า id ไม่รู้จักหรือค้างจาก suggestions ชุดก่อน จะคืนค่า null โดยไม่โยน exception — และจะไม่แก้ query ให้เอง (ออกแบบมาให้เรียก setQuerySilent เองถ้าต้องการ echo label กลับเข้าช่อง)
clearรีเซ็ต query และ suggestions กลับเป็นค่าว่าง