URL(Uniform Resource Locator)
웹에 존재하는 특정 데이터를 나타내는 문자열
https://www.shoping.com/men/shirts?color=blue&size=m
Host : 전 세계 서버 중 하나의 서버를 특정
www.shoping.com
부분Path(경로) : 서버에 있는 데이터 중 원하는 데이터를 특정
man/shirts
부분Parameter(파라미터) : 경로에서 동적으로 변하는 값
- 만약
man/shirts
부분이man/pants
,man/shoes
등으로 값이 동적으로 바뀐다면shirts
는 파라미터Query(쿼리) : 데이터에 관한 세부적인 요구사항
?color=blue&size=m
부분
Query 파라미터 값을 가져올 때 사용한다.
https://www.shoping.com/men/shirts?color=blue&size=m
에서
color
에 대한 쿼리 값 :searchParams.get('color');
으로 blue 가 출력된다.size
에 대한 쿼리 값:searchParams.get('size');
으로 m 이 출력된다. const [searchParams, setSearchParams] = useSearchParams();
const 쿼리Value = searchParams.get("쿼리 key");
setSearchParams({ key: value });
검색어를 입력하면, 검색어가 들어있는 데이터만 보여주는 코드
import { useSearchParams } from 'react-router-dom';
function CourseListPage() {
const [searchParams, setSearchParams] = useSearchParams();
// keyword 라는 쿼리의 값을 initKeword에 할당한다.
const initKeyword = searchParams.get("keyword");
const [keyword, setKeyword] = useState(initKeyword || ""); // keyword는 반드시 문자열이어야 하므로, 없는 경우 빈 문장열 전달
const courses = getCourses(initKeyword);
// input 값 바뀔 때마다 keyword의 상태값 변경
const handleKeywordChange = (e) => setKeyword(e.target.value);
// keyword 상태 값이 있으면 "keyword" 쿼리의 값을 keyword 상태 값으로 정하는 함수
const handleSubmit = (e) => {
e.preventDefault(); // 기본 동작인 페이지 리로드나 이동 방지
// setSearchParams에는 반드시 객체가 전달되어야 하므로, keyword 의 값이 없으면 빈 객체가 전달되도록 함
setSearchParams(keyword ? { keyword } : {});
}; // 객체 {keyword : keyword} 와 같다.
return (
<>
{/* form에 onSubmit 속성 설정 */}
<form className={searchBarStyles.form} onSubmit={handleSubmit}>
<input
name="keyword"
value={keyword}
onChange={handleKeywordChange}
placeholder="검색으로 코스 찾기"
></input>
<button type="submit"> {/* form의 onSubmit 함수가 실행된다.*/}
<img src={searchIcon} alt="검색" />
</button>
</form>
<p className={styles.count}>총 {courses.length}개 코스</p>
{/* 검색어가 있고, 검색 결과가 없을 때만 ture */}
{initKeyword && courses.length === 0 ? (
<Warn
className={styles.emptyList}
title="조건에 맞는 코스가 없어요."
description="올바른 검색어가 맞는지 다시 한 번 확인해 주세요."
/>
) : (
<div className={styles.courseList}>
{courses.map((course) => (
<CourseItem key={course.id} course={course} />
))}
</div>
)}
</>
);
}
검색창 input에 입력하는 값에 따라 query 의 값이 바뀌고 query 조건에 해당하는 자료들만 보여진다.
<form>
태그 관련 특이사항event.preventDefault()
<a>
태그나 submit 속성은 고유의 동작으로 페이지를 이동시키거나,<form>
안의<input>
등을 전송하는 동작이 있다.
e.preventDefault()는 그 동작을 중지시키는 역할을 한다.
또한<input>
또는<button>
클릭 이벤트가 발생 했을때 페이지가 리로드되는 현상을 막아준다.onSubmit 과 Enter
<form>
태그 내<input type="text">
가 1개인 경우 onSubmit 속성에, 따로 onKeyPress 나 onKeyDown 이벤트를 추가해주지 않아도, Enter키를 누르면 onSubmit 속성에 설정한 함수가 실행된다.
<input type="text" />
가 2개 이상이면 (따로 지정하지 않은 경우) Enter 로 실행되지 않는다.