React/쇼핑몰 만들기
[React로 만든 쇼핑몰]localstorage로 최근 본 상품 기능 만들기!!
이지영
2022. 7. 10. 17:41
DB 없이 state 데이터를 저장 하고 싶으면
- 서버로 보내서 DB에 저장
- 브라우저 임시 저장공간 사용 (localStrorage)
저는 localStorage를 사용해 데이터를 저장하여 최근 본 상품 UI를 만들어 볼것입니다
<Detail.js>
let [watchItem, setWatch] = useState([]);
useEffect(() => {
let watch = localStorage.getItem("watched");
if (watch == null) {
watch = [];
} else {
watch = JSON.parse(watch);
watch.push(id);
}
if (watch.length >= 3) {
watch = new Set(watch);
watch = [...watch];
}
localStorage.setItem("watched", JSON.stringify(watch));
setWatch(watch);
}, []);
최근 본 상품의 인덱스를 저장해줄 state를 선언하고 useEffect()로 detail 컴포넌트가 렌더링 될때마다 안에있는 코드를 순서대로 실행하게 되는데 먼저 watched라는 key를 getItem해주면 wated의 value의 값이 출력이 되는데 그값이 없다면(null) 빈 배열을 하나 만들어주고 값이 있다면 JSON.parse()를 통해 오브젝트로 만들어준다.
let { id } = useParams( ); 현재 url에서 불러온 id가 저장되어 있으므로 push(id)로 추가해주고 중복을 처리하기 위해 set()자료 형을 사용해 주었다
<app.js>
let [watchItem, setWatch] = useState([]);
useEffect(() => {
setWatch(JSON.parse(localStorage.getItem("watched")));
console.log(watchItem);
}, []);
return (
<WatchItem>
<p>최근 본 상품</p>
{watchItem &&
watchItem.map((item) => {
if (watchItem.length > 3) {
let copy = [...watchItem];
copy.shift();
setWatch(copy);
} else {
return (
<div id="img" key={item}>
<Link to={"/detail/" + item}>
<img
src={
process.env.PUBLIC_URL + "img/clothes" + [item] + ".png"
}
/>
)
</Link>
</div>
);
}
})}
</WatchItem>
watchItem state에 map()함수를 사용해주고 if문에서는 state 배열길이가 3이 넘으면 shift를 사용해 먼저 저장된 값을 제거 해주었다. 그리고 UI를 만들어서 이미지를 로드하고 해당하는 이미지의 detail 페이지로 link도 걸어주었다 .
<AppCss.js>
import styled from "@emotion/styled";
const WatchItem = styled.div`
display: flex;
border-radius: 5px;
flex-direction: column;
position: fixed;
right: 0;
top: 10;
width: 10em;
height: auto;
background-color: beige;
z-index: 2;
#img {
text-align: center;
}
p {
margin-bottom: 10px;
text-align: center;
font-weight: bold;
}
img {
width: 9em;
height: 9em;
margin-bottom: 10px;
}
`;
export { WatchItem };
emotion 라이브러리를 사용해 UI 를 스타일링 해주었다
(결과)
방문한 사이트 순서로 최근본 상품이 잘 들어가있고 먼제 확인한 상품은 ui에서 보이지 않고 나중에 확인한 상품이 보여진다!!!