-
글쓴이글
-
2021년 7월 2일 22:58 #11129
breadlee참가자안녕하세요 선생님!
localStorage를 사용하여 '최근본상품' 컴포넌트에 이미지를 띄우려 합니다!
이것 저것 시도해보다보니 강의에서 알려주신 부분과 코드가 많이 달라졌는데, 그래도 띄워지는데 성공하였습니다.
그러나 최근본상품이 한 가지밖에 적용되지 않아서, 해결 방법을 끝내 찾지 못하여 질문드립니다 ㅠㅠ
Detail.js 페이지에 setItem을 사용하여 담은 뒤, LastProduct.js컴포넌트에 getItem으로 붙여오는 방식으로 진행하였습니다.
아래 Detail.js 코드 전달드립니다.
const Detail = (props) => {
let { id } = useParams();
let productId = props.state.find(function(a) {
return a.id == id;
});// info라는 state를 정의하여, 객체 형태로 담았습니다.
let [info, setInfo] = useState([{
id: productId.id,
img: productId.img,
title: productId.title,
content: productId.content,
price: productId.price
}])// info를 setItem안에 담았습니다
localStorage.setItem('items', JSON.stringify(info));
return (
// 코드생략
)
};
아래는 LastProduct.js 코드입니다. (최근본상품을 우측 하단에 표시하는 레이아웃을 담는 컴포넌트입니다)
const LastProduct = (props) => {
let [late, setLate] = useState([]); // late라는 state를 만들어두고 빈배열을 놓았습니다useEffect(() => {
let info = localStorage.getItem('items'); // getItem으로 받아왔습니다
if (info == null) {
info = []
}
else {
info = JSON.parse(info);
}
setLate(info) // setLate 변경함수 안에 담았습니다.
}, []);
return (
<div className="LastProduct">
<div className="LastProduct_title">최근 본 상품</div>
<ul>
{
late.map((a, i) => {
return (
<li key={i}><img src={late[i].img} /></li>
)
})
}
</ul>
</div>
);
};강의에서 Detail.js 페이지의 useEffect 안에 setItem과 getItem이 함께 담겨있는 부분을 두개의 컴포넌트로 나눠서
Detail.js에서는 setItem을 하고, 최근본상품 컴포는트에는 getItem으로 받아오는 식으로 진행하다보니
배열이 아니라고 계속 오류가 떠서 , 제가 아직 자료형에 대한 이해가 깊지 못한 탓에
콘솔로 확인해가며 코드를 변경하고 변경하다보니
위와 같이 코드가 흘러가었고
결국 화면에 잘 나오기는 하였으나,
최근본상품들마다 뜨는게 아니라 한 가지 상품만 뜨게 되어 이렇게 질문드립니다 ㅠㅠ
제가 코드에 대한 접근을 아예 잘못하고있는지,
아니면 반복문 내의 문제인지 모르겠어서 질문드립니다 ㅠ.ㅠ
위와같은 코드를 실행했을 때 화면에 보여지는 모습은 아래 사진 첨부드립니다!
2021년 7월 3일 09:00 #11137
codingapple키 마스터localStorage.setItem('items', 어쩌구);
이 코드는 로컬스토리지의 items 항목에 어쩌구를 추가해주는 함수가 아니라 덮어쓰는 함수라 그렇습니다
1. 어쩌구를 getItem해서
2. 뒤에 상품을 추가해주고
3. 그걸 setItem으로 집어넣으면 될듯요
2021년 7월 4일 09:02 #11175
breadlee참가자안녕하세요 선생님!
답변 감사드립니다 🙂
localStorage.setItem('items', 어쩌구);
1. 어쩌구를 getItem하기
2. getItem에서 뒤에 상품을 추가하기(push)
3. 그걸 setItem으로 집어넣기
위와 같이 설명해 주셨는데 아직 잘 이해가 되지 않아서 추가 질문드립니다 ㅠ.ㅠ
setItem은 객체에 접근하여 항목을 추가(items)하는 기능이고, getItem은 항목(items)을 읽어 오는 기능으로 ,
Detail.js페이지에서
localStorage.setItem('items', JSON.stringify(info));
라고 지정했을 때,
info에 대한 state값을미리 정의해 놓은 후, 해당 info값을 items에 추가되었고,
(-- info에 대한 state값--
let [info, setInfo] = useState([{
id: productId.id,
img: productId.img,
title: productId.title,
content: productId.content,
price: productId.price
}]))
LastProduct.js페이지에서 getItem을 했을 때 해당 항목(items)을 불러 읽어오는 기능으로 해석하는게 아닌것일까요?
setItem으로 객체 지정 후, getItem으로 지정(추가)한 값을 불러오는 방식이 아니라
getItem을 먼저 설정한 후에 setItem에 집어넣어야 하는걸까요?
3번의 setItem으로 집어넣어야 한다는 의미가 어떤 뜻인지 잘 모르겠습니다 ㅠ.ㅠ
가져오고 싶은 값을 setItem의 객체 형태로 저장 후(값의 부분 설정 해놓고)
해당 키를 getItem으로 원하는 페이지에서 불러오는 방식으로 이해한 부분이 잘못 이해하고 있는 순서인가요?
2021년 7월 4일 09:13 #11177
codingapple키 마스터장바구니에 상품 하나를 추가하면 데이터가 [ {} ] 이렇게 생겼겠네요
다른 상품을 하나 추가하면 [ {}, {} ] 이렇게 생겨야겠네요
근데 이걸 로컬스토리지로 구현하려면 setItem만 쓰면 안됩니다
.setItem( {어쩌구} ) 라고 쓰면 {} 하나를 추가해주는게 아니라 덮어써주기 때문에
1. 그래서 기존 [ {} ] 이걸 꺼내주세요
2. [ {}, {} ] 이렇게 뒤에 {} 추가해주세요
3. 다시 로컬스토리지에 집어넣어주세요
라고 개발해야할듯요
state 쓰고 안쓰고는 상관없을듯요
2021년 7월 6일 19:57 #11275
breadlee참가자선생님
가이드 해주신대로 시도 해보다가 드디어 상품이 하나씩 추가되고 있습니다 ㅠㅠ
정말 감사드립니다!
Detail.js페이지에서 getItem(push) >> setItem(JSON.stringify) 한 후에
LastProduct.js 페이지에서 getItem 해오니깐 잘 나오고 있습니다 🙂
그러나 화면에 표시하는 부분에서 또 다른 에러로 계속 헤매고 있는데 힌트 하나만 주실 수 있으실까요?ㅠ.ㅠ
최근본상품 컴포넌트 내, img를 반복문으로 돌려서, getItem으로 하나씩 추가되는 상품들(detail페이지에 방문하는 상품들이 하나씩 추가)이 img의 src에 상품들이 하나씩 추가되고 있으나,
id값으로 받아오기 때문에 img src의 url과 맞게 하기 위해서는 +1을 해주어야 합니다!
Product.js 페이지에서는
<img src={"https://codingapple1.github.io/shop/shoes" + (props.state[i].id+1) + ".jpg"} width="100%" />
이렇게 하였을 때 잘 작동되서, 같은 방식으로 적용했을때 이미지가 공란으로 추가되고 있어서 질문드립니다!
질문 ) 최근본상품 컴포넌트 내에서 img를 반복문으로 적용하고 있습니다. img의 src에 상품번호가 바뀌도록 아래와 같이 설정하였습니다.
return (
<div className="LastProduct">
<div className="LastProduct_title">최근 본 상품</div>
<ul>
{
late.map((a, i) => {
return (
<li key={i}><img src={"https://codingapple1.github.io/shop/shoes" + (late[i]+1) + ".jpg"} /></li>
)
})
}
</ul>
</div>
);위 코드의 late라는 state는
let [late, setLate] = useState([]);
이렇게 설정한 후, localStorage.getItem('items')로 받아온 값들을 setLate에 넣어주었습니다.
그래서 콘솔로 출력해보면, 디테일 페이지에 상품 하나씩 방문할때마다
console.log(late)의 값은
// Array(2)
0:"0"
1:"1"
이렇게 출력되고 있습니다!
문자열로 감싸져 있어서 img src에 적용이 안되는 것 같아서
getItem으로 받아올 때,
useEffect(() => {
let info = localStorage.getItem('items');
if (info == null) {
info = []
}
else {
info = JSON.parse(info); << JSON.parse 로 따옴표 없앤걸 info에 다시 담았씁니다
console.log(info)
setLate(info)
}
console.log(info)
}, []);따옴표를 없애기를 적용하였는데 출력결과 따옴표는 쳐져있습니다
그래서 img src에 제대로 적용이 안되는 걸까요?
2021년 7월 6일 20:49 #11278
codingapple키 마스터넴 '1'+ 1 은 2가아니라 '11'입니다
문자를 숫자로 변환하려면 json.parse가 아니라 parseInt('1') 여기넣으면 됩니다
-
글쓴이글
- 답변은 로그인 후 가능합니다.