2025. 8. 19. 20:14ใReact
๋ด๋น๊ฒ์ด์ ๋ฐ์์ ํน์ ํค์๋๋ก ๊ฒ์์ ์๋ํ๋ฉด, ๊ฒ์ ํ์ด์ง๋ก ์ด๋ํ ๋ค ํด๋น ํค์๋์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฒ์์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ๊ณผ์ ์์ ๋ง์ฃผ์ณค๋ ๋ฌธ์ ๋ค๊ณผ ์ด๋ฅผ ํตํด ์ป์ ์ธ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
์ต์ข UI
์ด๋ฒคํธ ๋์ ์ ์ํ๊ธฐ
์ ๋ ฅ ๊ฐ์ ๋ฐ๋ฅธ ๋ณ์ ์ ๋ณด ์ถ๋ ฅ
์ฌ์ฉ์๊ฐ input ํ๊ทธ์ ๊ฐ์ ์ ๋ ฅํ ๋ค ๊ฒ์ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋ Enter ํค๋ฅผ ๋๋ฅด๋ฉด, ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ด์ง๊ฐ ์ด๋ํ๊ณ ์ ๋ ฅํ ํค์๋๋ฅผ ์ด์ฉํด API ์์ฒญ์ด ์ํ๋์ด ํน์ ๋ณ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ด๋ฒคํธ ์ฒ๋ฆฌ ๊ตฌํํ๊ธฐ
๋ฐ์ดํฐ ์ ๋ ฅํ๊ธฐ
๐ ์ฐธ๊ณ ์๋ฃ
input ํ๊ทธ ์ฌ์ฉ ์ form ํ๊ทธ ์ฌ์ฉ ์ฌ๋ถ - ์ธํ๋ฐ | ์ปค๋ฎค๋ํฐ ์ง๋ฌธ&๋ต๋ณ
๋๊ตฌ๋ ํจ๊ปํ๋ ์ธํ๋ฐ ์ปค๋ฎค๋ํฐ. ๋ชจ๋ฅด๋ฉด ๋ฌป๊ณ , ํด๋ต์ ์ฐพ์๋ณด์ธ์.
www.inflearn.com
๊ธฐ์กด์ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋์๋ ๊ฒ์์ ๊ณง submit์ด๋ผ๊ณ ์๊ฐํ์ฌ input ํ๊ทธ๋ฅผ form ํ๊ทธ ์์ ๋ฃ์ด ๊ตฌํํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค, input ํ๊ทธ์ ์ ๋ ฅ๋ ๊ฐ์ form ํ๊ทธ์์ ์ด๋ป๊ฒ ์ฝ์ด์ค๋์ง ๊ถ๊ธํ์ฌ ๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ ์ค ์ธํ๋ฐ ์ปค๋ฎค๋ํฐ์์ ์ ์ฉํ ๋ด์ฉ์ ํ์ธํ ์ ์์์ต๋๋ค. ๋ด์ฉ์ ์๋์ ๊ฐ์์ต๋๋ค.
form ํ๊ทธ ์ฌ์ฉ ์ ์ฅ์
input ํ๊ทธ์ id๊ฐ ํ ๋น๋์ด ์์ผ๋ฉด, State์ ๋ฐ๋ก ๊ฐ์ ์ ์ฅํ์ง ์์๋ submit ์ด๋ฒคํธ ๋ฐ์ ์ ์๋์ผ๋ก ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. (์๋ ์ฝ๋ ์ฐธ๊ณ )
โก๏ธ ์ฆ, ํ์๊ฐ์ ์ฒ๋ผ ๋ง์ input์ด ํฌํจ๋์ด ์๊ณ ๊ตณ์ด ๊ฐ์ State์ ์ ์ฅํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ form ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค.
๐๐ป ์ฝ๋ ๋ณด๊ธฐ
import "./styles.css";
export default function App() {
const onSubmit = (e) => {
const firstValue = e.target.first.value;
const secondValue = e.target.second.value;
console.log({ firstValue, secondValue });
e.preventDefault();
};
return (
<form onSubmit={onSubmit}>
<div>
<input id="first" />
</div>
<div>
<input id="second" />
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
);
}
์ ํํ ๋ฐฉ๋ฒ
์ด๋ฒ ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ์์๋ ์ค์ง ํ๋์ input๋ง ํฌํจ๋์ด ์์๊ธฐ ๋๋ฌธ์ form ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ input ํ๊ทธ๋ง ํ์ฉํ์ฌ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ฒ์์ด ์ ๋ ฅ ๋ฐ ํ์ด์ง ์ด๋
์ฌ์ฉ์๊ฐ ๋ค๋น๊ฒ์ด์ ๋ฐ์์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ๊ฒ์์ด์ ํจ๊ป ๊ฒ์ ๊ฒฐ๊ณผ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
function handleSearchSubmit(searchKeyword, navigate) {
navigate(`/search?q=${searchKeyword}`) //ํ์ด์ง ์ด๋
}
๐ก Enter ์ธ์ ๋ฐฉ๋ฒ
onKeyDown์ ํค ๋๋ฆ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
React onKeyDown Event - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
www.geeksforgeeks.org
- ํค ๋๋ฆ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น key๊ฐ Enter๋ผ๋ฉด ์ด๋ฒคํธ๋ฅผ ํธ์ถํฉ๋๋ค.
- Enter ํค๋ฟ๋ง ์๋๋ผ Space, Tab ๋ฑ์ ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
onKeyDown={(e) => e.key === "Enter" ? "์ด๋ฒคํธ ํธ์ถ": null}
URL ํ๋ผ๋ฏธํฐ ํ์ฉํด API ์์ฒญ
๊ฒ์ ๊ฒฐ๊ณผ ํ์ด์ง์์๋ useSearchParams๋ฅผ ์ฌ์ฉํด URL์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ํด๋น ๊ฐ์ผ๋ก API ์์ฒญ์ ์ํํฉ๋๋ค.
๐ก useSearchParams
URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ๊ณ ์ค์ ํ๋ ๋๊ตฌ์ ๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
[React.js] useSearchParams ํ (React Router)
useSearchParams ํ (React Router)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)์์ ์ ๊ณตํ๋ @useSearchParams@ ํ ์ ๋ํด ์ ๋ฆฌํด๋ณธ๋ค. useSearchParams๊ฐ๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)๋ฅผ ์ฌ์ฉํ์ฌ URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ
dev-astra.tistory.com
์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค. ์: /search?keyword=banana
import { useSearchParams } from 'react-router-dom';
const [searchParams, setSearchParams] = useSearchParams();
const keyword = searchParams.get("keyword"); //URL์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๐๐ป ์ฝ๋
ClinicSearchResultPage.jsx
import { useSearchParams } from 'react-router-dom';
import { fetchSearchClinicByQuery } from '../api';
function ClinicSearchResultPage() {
const [searchParams, setSearchParams] = useSearchParams();
useEffect(() => {
const keyword = searchParams.get("q");
fetchSearchClinicByQuery(keyword, currentPage)
.then((res) => {
console.log(res.data);
setTotalPages(res.data.page.totalPages)
setSearchResult(res.data.content)
})
}, [searchParams, currentPage])
... ์๋ต
}
api.js (api ์์ฒญ์ ๋ด๋นํ๋ ํ์ผ)
export function fetchSearchClinicByQuery(searchKeyword, navigate) {
const token = localStorage.getItem("accessToken")?.trim();
return api.get(
"/search",
{
params : {
"p": `${searchKeyword}`
},
headers: {
"Authorization": `Bearer ${token}`
},
},
)
}
์๋ต ๋ฐ์ดํฐ ๋ ๋๋ง
API ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ์ฌ ์ฌ์ฉ์๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋๋ก ํฉ๋๋ค.
๊ฒ์์ด ๋ณ๊ฒฝ ์ ํ์ด์ง๋ ์ ์ง, ํ๋ผ๋ฏธํฐ๋ง ๋ณ๊ฒฝ
์ฌ์ฉ์๊ฐ ๋ค๋น๊ฒ์ด์ ๋ฐ์์ ์๋ก์ด ํค์๋๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ด์ง๋ ๊ทธ๋๋ก ๋๊ณ URL ํ๋ผ๋ฏธํฐ๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค.
ํ๋ผ๋ฏธํฐ ๋ณ๊ฒฝ ๊ฐ์ง ํ API ์ฌํธ์ถ
useEffect ํ ์ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง API๋ฅผ ๋ค์ ํธ์ถํฉ๋๋ค.
์ด๋ฅผ ํตํด ํ์ด์ง ์ ์ฒด๊ฐ ์๋ก ๋ ๋๋ง ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ดํฐ๋ง ์ ๋ฐ์ดํธ๋ฉ๋๋ค.