스프링부트, 리액트 연동 쇼핑몰 검색 기능 구현
Header 페이지에서 검색 하면 -> ProductSearch 라는 새 페이지에서 검색 결과가 출력되는 검색 기능 구현.
백엔드 구현 부분은 이전 글을 참고해 주세요.
이전글 : 스프링부트 검색기능 구현
function Header() {
const [word, setWord] = useState("");
const onSubmit = async () => {
window.location.href = "/search/" + word;
};
return (
<input
onChange={(e) => {
setWord(e.target.value);
console.log(word);
}}></input>
<button
type="button"
onClick={() => {
onSubmit();
}}></button>
);
}
2_ Routing.js
class Routing extends React.Component {
render() {
return (
<Router>
<Routes>
< 다른 링크들 ... />
<Route path="/search/:word" element={<Search />} />
Routing.js 파일에서 "/search/:word" 로 Header.js 에서 전달한 word를 :으로 붙여준다.
3_ ProductSearch.js
검색어를 받아 띄워질 새 창인 ProductSearch.js 파일
import { useParams } from "react-router";
function Search() {
const [searchData, setSearchData] = useState([]);
const params = useParams();
useEffect(() => {
async function fetchData() {
const result = await axios.get(
"http://localhost:8080/product/search?word=" + params.word
);
console.log(result.data.result);
setSearchData(result.data.result);
}
fetchData();
}, []);
get 방식으로 받은 http://localhost:8080/product/search?word= 와 params.word를 합쳐 result에 저장, result에 담긴 데이터들을 setSearchData로 searchData에 저장한다.
이를 useEffect 함수에 만들어 컴포넌트가 렌더링 될 때마다 작업을 실행하게 한다.
전달한 word를 받기 위해 { useParams } from "react-router"를 import한다.
그리고 params.word 이렇게 꺼낸다.
console.log로 result.data.result를 출력해 함수 작동이 잘 되는지 확인해 보자.
이제 이 결과를 화면에 출력해보자.
{searchData.map((product) => {
return (
<CardImg
filename={product.filename.split(",")[0]}
>/CardImg>
);
})}
map 함수로 searchData에 저장된 값들을 하나씩 빼서 CardImg 태그에 담아 출력한다. (CardImg는 디자인을 적용한 div 태그)
처음엔 filename={product.filename} 이렇게만 했었는데 이렇게 했더니
한 상품에 이미지가 여러장이 저장된 경우 에러가 났다.
백엔드에서 첫번째 이미지만 가져오게 하거나, 프로필용 대표 사진을 따로 저장해서 그걸 가져오게 해도 되겠지만 일단은.. split 함수로 구분하여 첫번째 이미지만 보이게 처리했다.
'💎 리액트' 카테고리의 다른 글
리액트 button 태그 자동 클릭되는 현상 막는 법 (0) | 2022.03.03 |
---|---|
리액트 useEffect() 사용법 (0) | 2022.03.03 |
리액트 : 부모 컴포넌트에서 자식 컴포넌트 함수 호출하는 법 (0) | 2022.03.02 |
리액트 key 할당해도 해결 안되는 문제. Warning:Each child in an array or iterator should have a unique"key"prop. (0) | 2022.02.28 |
리액트 Component, render,constructor(props), props와 state 차이점 (0) | 2022.02.12 |
댓글