서치바에서 검색을 하면 해당 결과로 불러오는 기능을 구현하려고 한다.
useRouter는 next.js에서 브라우저를 라우팅(페이지 이동)할 수 있는 Hook이다. 라우터 객체에 접근하기 위하여 useRouter를 사용한다.
next.js에서는 함수형 컴포넌트에선 useRouter 사용을 권장하고 있다.
왜냐하면 라이프사이클에 맞춰서 상태가 업데이트 되기 때문에 다른 state, hook과 맞춰서 동작을 예측하기가 쉬워지기 때문..이라고 한다.
(참고: https://irondeveloper.tistory.com/19)
우선 메인 페이지에서 검색을 할 수 있는 서치 바를 만들었다.
<form onSubmit={handleSubmit}>
<button>
<BsSearch />
</button>
<input
onChange={handleInputChange}
type="text"
placeholder="search..."
value={searchValue}
/>
{searchValue && (
<button
type="button"
onClick={handleClearInput}
>
<IoMdClose />
</button>
)}
</form>
const router = useRouter();
const [searchValue, setSearchValue] = useState("");
const handleSubmit = (e: { preventDefault: () => void }) => {
// 기본적으로 동작하는 이벤트를 막아준다.
e.preventDefault();
if (searchValue) {
router.push(
{
pathname: `/search`,
query: {
keyword: searchValue,
},
},
`/search?keyword=${searchValue}`
);
setSearchValue("");
}
};
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setSearchValue(event.target.value);
};
const handleClearInput = () => {
setSearchValue("");
};
짜잔!
보완하고 싶은 점이라면, 검색창을 모달로 변경하고 검색어를 입력했을 때 해당하는 단어가 검색창 아래에 뜨도록 구현해보고 싶은 점이다.
검색창이 활성화되었다는 css를 좀 더 직관적으로 보여줄 수 있도록 만들었어도 좋았을 것 같다.