• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 최근본상품(localStorage) 질문드립니다

최근본상품(localStorage) 질문드립니다

7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 글쓴이
  • #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으로 받아오는 식으로 진행하다보니

    배열이 아니라고 계속 오류가 떠서 , 제가 아직 자료형에 대한 이해가 깊지 못한 탓에

    콘솔로 확인해가며 코드를 변경하고 변경하다보니

    위와 같이 코드가 흘러가었고

    결국 화면에 잘 나오기는 하였으나,

    최근본상품들마다 뜨는게 아니라 한 가지 상품만 뜨게 되어 이렇게 질문드립니다 ㅠㅠ

     

    제가 코드에 대한 접근을 아예 잘못하고있는지,

    아니면 반복문 내의 문제인지 모르겠어서 질문드립니다 ㅠ.ㅠ

     

    위와같은 코드를 실행했을 때 화면에 보여지는 모습은 아래 사진 첨부드립니다!

     

    #11137

    codingapple
    키 마스터

    localStorage.setItem('items', 어쩌구);

    이 코드는 로컬스토리지의 items 항목에 어쩌구를 추가해주는 함수가 아니라 덮어쓰는 함수라 그렇습니다

     

    1. 어쩌구를 getItem해서

    2. 뒤에 상품을 추가해주고

    3. 그걸 setItem으로 집어넣으면 될듯요

     

    #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으로 원하는 페이지에서 불러오는 방식으로 이해한 부분이 잘못 이해하고 있는 순서인가요?

     

     

    #11177

    codingapple
    키 마스터

    장바구니에 상품 하나를 추가하면 데이터가 [ {} ] 이렇게 생겼겠네요 

    다른 상품을 하나 추가하면 [ {}, {} ] 이렇게 생겨야겠네요

    근데 이걸 로컬스토리지로 구현하려면 setItem만 쓰면 안됩니다

     

    .setItem( {어쩌구} ) 라고 쓰면 {} 하나를 추가해주는게 아니라 덮어써주기 때문에

    1. 그래서 기존 [ {} ] 이걸 꺼내주세요

    2. [ {}, {} ] 이렇게 뒤에 {} 추가해주세요

    3. 다시 로컬스토리지에 집어넣어주세요

    라고 개발해야할듯요

    state 쓰고 안쓰고는 상관없을듯요

     

     

    #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에 제대로 적용이 안되는 걸까요?

     

    #11278

    codingapple
    키 마스터

    넴 '1'+ 1 은 2가아니라 '11'입니다

    문자를 숫자로 변환하려면 json.parse가 아니라 parseInt('1') 여기넣으면 됩니다

    #11285

    breadlee
    참가자

    감사합니다 선생님!

    말씀주신대로 적용해보았더니 잘 작동됩니다 🙂

    너무 감사드립니다!

     

7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠