การจัดการสถานะในพารามิเตอร์ค้นหาของ URL
ซิงค์ตัวกรอง การเรียงลำดับ และการแบ่งหน้าไปยัง URL ด้วย useSearchParams
การจัดการสถานะในพารามิเตอร์ค้นหาของ URL เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องเก็บสถานะไว้ใน URL
ตัวกรอง คิวรีค้นหา ลำดับการจัดเรียง และการแบ่งหน้า ควรเก็บไว้ใน URL เพื่อให้ผู้ใช้บุ๊กมาร์ก แชร์ และย้อนกลับมายังมุมมองเดิมได้โดยไม่สูญเสียสถานะ
ฮุก useSearchParams
useSearchParams() จะส่งคืนอินสแตนซ์ URLSearchParams ปัจจุบันและฟังก์ชันตั้งค่า ซึ่งคล้ายกับ useState แต่มี URL เป็นแหล่งเก็บสตริงคิวรี
import { useSearchParams } from 'react-router-dom';
function ProductList() {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get('q') || '';
const page = Number(searchParams.get('page') || 1);
// ...
}การอ่านพารามิเตอร์เดียว
ใช้ searchParams.get('key') เพื่ออ่านค่า โดยจะส่งคืน null หากไม่มีพารามิเตอร์ดังกล่าว ดังนั้นควรกำหนดค่าทดแทนไว้
const sort = searchParams.get('sort') ?? 'name';
const order = searchParams.get('order') ?? 'asc';การเขียนพารามิเตอร์โดยไม่เปลี่ยนเส้นทาง
เรียกใช้ setSearchParams() พร้อมออบเจ็กต์ใหม่หรือฟังก์ชันอัปเดตเพื่อเปลี่ยนพารามิเตอร์ React Router จะอัปเดต URL และแสดงผลใหม่โดยไม่เปลี่ยนเส้นทางทั้งหมด
function SortButton({ field }) {
const [searchParams, setSearchParams] = useSearchParams();
const handleClick = () => {
setSearchParams(prev => {
prev.set('sort', field);
prev.set('page', '1');
return prev;
});
};
return <button onClick={handleClick}>Sort by {field}</button>;
}การรักษาพารามิเตอร์อื่นขณะอัปเดต
ใช้รูปแบบฟังก์ชันอัปเดตของ setSearchParams เพื่อเปลี่ยนเฉพาะพารามิเตอร์ที่ต้องการ โดยคงพารามิเตอร์อื่นทั้งหมดไว้เหมือนเดิม
setSearchParams(prev => {
prev.set('q', newQuery);
// 'sort' and 'page' are unchanged
return prev;
});การซิงค์อินพุตกับพารามิเตอร์ค้นหา
ควบคุมค่าของอินพุตจากพารามิเตอร์ใน URL และอัปเดต URL เมื่อค่ามีการเปลี่ยนแปลง เพื่อให้ทั้งสองส่วนสอดคล้องกัน
function SearchBar() {
const [params, setParams] = useSearchParams();
const q = params.get('q') || '';
return (
<input
value={q}
onChange={e => setParams(prev => {
prev.set('q', e.target.value);
prev.set('page', '1');
return prev;
})}
/>
);
}แฟล็กบูลีนในพารามิเตอร์ค้นหา
ใช้การมีอยู่หรือไม่มีอยู่ของพารามิเตอร์ (หรือสตริง '1'/'0') เพื่อแทนสถานะส่วนติดต่อผู้ใช้แบบบูลีน เช่น แผงที่เปิดอยู่หรือตัวกรองที่ใช้งานอยู่
const showFilters = searchParams.has('filters');
const toggleFilters = () => {
setSearchParams(prev => {
if (prev.has('filters')) prev.delete('filters');
else prev.set('filters', '1');
return prev;
});
};ค่าอาร์เรย์ในพารามิเตอร์ค้นหา
URLSearchParams รองรับหลายค่าสำหรับคีย์เดียวกัน ใช้ getAll('key') เพื่ออ่านค่าเหล่านั้นเป็นอาร์เรย์
// URL: /products?tag=react&tag=typescript
const tags = searchParams.getAll('tag'); // ['react', 'typescript']
// Setting multiple values:
const newParams = new URLSearchParams();
selectedTags.forEach(t => newParams.append('tag', t));
setSearchParams(newParams);การแทนที่เทียบกับการเพิ่มประวัติ
ส่ง { replace: true } เป็นอาร์กิวเมนต์ตัวที่สองให้กับ setSearchParams เพื่อไม่ให้การเปลี่ยนตัวกรองเพิ่มรายการจำนวนมากลงในประวัติเบราว์เซอร์
setSearchParams(prev => { prev.set('q', val); return prev; }, { replace: true });การคำนวณสถานะจากพารามิเตอร์
คำนวณค่าที่ได้จากข้อมูลอื่น เช่น จำนวนเต็มที่แปลงแล้วหรืออีนัมที่ผ่านการตรวจสอบ จากพารามิเตอร์สตริงดิบที่ด้านบนของคอมโพเนนต์ เพื่อใช้งานอย่างปลอดภัยตลอดทั้งคอมโพเนนต์
const rawPage = searchParams.get('page');
const page = Math.max(1, parseInt(rawPage || '1', 10));
const rawSort = searchParams.get('sort');
const sort = ['name', 'price', 'date'].includes(rawSort) ? rawSort : 'name';การเชื่อมโยงด้วยพารามิเตอร์ค้นหา
ใช้พร็อพเพอร์ตี search บนออบเจ็กต์ Link หรือ to เพื่อเปลี่ยนไปยัง URL ที่กำหนดพารามิเตอร์คิวรีไว้
<Link to={{ pathname: '/products', search: '?sort=price&order=asc' }}>
Sort by Price
</Link>ตรวจสอบอย่างรวดเร็ว
เมธอดใดของ URLSearchParams ที่ใช้อ่านค่าทั้งหมดของคีย์ที่ซ้ำกัน เช่น ?tag=react&tag=ts
สรุปทบทวน
useSearchParams() ซิงค์สถานะของคอมโพเนนต์กับสตริงคิวรีใน URL ใช้รูปแบบตัวอัปเดตเพื่อรักษาพารามิเตอร์อื่นไว้ ใช้ { replace: true } เพื่อหลีกเลี่ยงประวัติที่มีรายการมากเกินไป และใช้ getAll() สำหรับพารามิเตอร์ที่มีค่าเป็นอาร์เรย์
คำถามที่พบบ่อย
บทเรียน “การจัดการสถานะในพารามิเตอร์ค้นหาของ URL” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการสถานะในพารามิเตอร์ค้นหาของ URL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการสถานะในพารามิเตอร์ค้นหาของ URL”
ซิงค์ตัวกรอง การเรียงลำดับ และการแบ่งหน้าไปยัง URL ด้วย useSearchParams คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการสถานะในพารามิเตอร์ค้นหาของ URL” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางซ้อนกันและเลย์เอาต์ Outlet
- ตัวโหลดและแอ็กชัน (Data Router API)
- เส้นทางที่มีการป้องกันและตัวตรวจสอบสิทธิ์
- การจัดการสถานะในพารามิเตอร์ค้นหาของ URL