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

home2 게시판 React 게시판 localStorage 이용관련

localStorage 이용관련

5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 글쓴이
  • #106055

    김정헌
    참가자
    페이지 구성을 조금 다르게 해서, 하단에 상품 정렬되도록 나오고, 버튼 클릭시
    shop/{i}로 이동하도록 만들었습니다.
    그리고 처음 페이지는 i=0이 되도록 설정했습니다.
    
    <div className="row">
    {
    shoes.map(function(a,i){
    return(
    <Products shoes={shoes} i={i} key={i} onClick={()=>{
    setSelectedProduct(i);
    navigate(`/Shop/${i}`);
    MoveToTop();
    let viewed = JSON.parse(localStorage.getItem('viewed'));
    let newViewed = viewed.push(selectedProduct);
     localStorage.setItem('viewed', JSON.stringify(newViewed));
    } } ></Products>
    )
    })
    }
    </div>
    
    질문은 여기서 onclick에 기능을 추가할 시,
    
    let viewed = JSON.parse(localStorage.getItem('viewed'));
    cosole.log(viewed);//[]
    let newViewed = viewed.push(selectedProduct);
    cosole.log(newViewed);//[i]
    까지는 작동하는데
    
     localStorage.setItem('viewed', JSON.stringify(newViewed));
    여기서 업데이트가 안 됩니다. 
    
    혹시 onclick에 추가할 시 작동이 안 되는 걸까요?
    
    이건 코드 전부입니다.
    혹시나 해서 첨부드립니다.
    
    function Shop(props){
    let [fade2, setFade2] = useState('')
    let [shoes,setShoes] = useState(data);
    let [more,setMore] = useState(true);
    let [loading,setLoading] = useState(false);
    let 

    = useState(1); let navigate = useNavigate(); let {id=0} = useParams(); const [selectedProduct,setSelectedProduct] = useState(Number(id)); let [amount,setAmount] = useState(''); const [count, setCount] = useState(0); const MoveToTop = () => { window.scrollTo({ top: 0, behavior: 'smooth' }); };
    let state = useSelector(state=>state);
    let dispatch = useDispatch()
     
    useEffect(()=>{
    let timer = setTimeout(()=>{
    setFade2('end')
     },100)
    return ()=>{clearTimeout(timer); setFade2('')}
     },[])
    useEffect(()=>{
    if(isNaN(amount)){
    alert('숫자만 입력가능합니다.')
     }
     },[amount])
    
    
    
    
    return(
    <div className = {`start ${fade2}`}>
     <Detail shoes={shoes} selectedProduct={selectedProduct} setAmount={setAmount} amount={amount} dispatch={dispatch}></Detail>
     <Nav variant="tabs" defaultActiveKey="link-1" style={{marginLeft : '1px'}}>
     <Nav.Item>
     <Nav.Link eventKey="link-0" onClick={()=>{setTab(0)}}>제품 정보</Nav.Link>
     </Nav.Item>
     <Nav.Item>
     <Nav.Link eventKey="link-1" onClick={()=>{setTab(1)}}>상세페이지</Nav.Link>
     </Nav.Item>
     <Nav.Item>
     <Nav.Link eventKey="link-2" onClick={()=>{setTab(2)}}>사이즈</Nav.Link>
     </Nav.Item>
     </Nav>
     <Tabcontent tab={tab} shoes={shoes} selectedProduct={selectedProduct}></Tabcontent>
     <div className="container">
     <div className="row">
     {
     shoes.map(function(a,i){
    return(
    <Products shoes={shoes} i={i} key={i} onClick={()=>{
    setSelectedProduct(i);
    navigate(`/Shop/${i}`);
    MoveToTop();
    let viewed = JSON.parse(localStorage.getItem('viewed'));
    let newViewed = viewed.push(selectedProduct);
     localStorage.setItem('viewed', JSON.stringify(newViewed));
     } } ></Products>
     )
     })
    }
     </div> //해당 부분
     {
     loading ==true ? <Spinner className='mt-4' animation="border" variant="secondary" /> : null
    }
     
     </div>
     {
     more == true ? <button className="btn btn-dark my-3" onClick={()=>{
    setCount(count + 1);
    setLoading(true)
    if(count == 1){
     axios.get('https://codingapple1.github.io/shop/data2.json')
     .then((result)=>{
    let copy = [...shoes, ...result.data]
    setShoes(copy);
    setLoading(false);
     })
     .catch(()=>{setLoading(false);throw '실패 ㅅㄱ'})
     } else if(count==2) {
    setLoading(true);
     axios.get('https://codingapple1.github.io/shop/data3.json')
     .then((result)=>{
    let copy = [...shoes, ...result.data]
    setShoes(copy);
    setLoading(false);
     })
     .catch(()=>{setLoading(false);throw '실패 ㅅㄱ'})
    setMore(false)
     } 
     
     }}>MORE</button> : null
    }
     
     
     </div>
     )
    }
    function Detail(props){
    return(
    <div className="container my-4">
     <div className="row">
     <div className="col-6">
     < img src={`https://codingapple1.github.io/shop/shoes${props.selectedProduct+1}.jpg`} width="100%" />
     </div>
     <div className="col-6">
     <h4 className="pt-5">{props.shoes[props.selectedProduct].title}</h4>
     <p>{props.shoes[props.selectedProduct].content}</p>
     <p>{props.shoes[props.selectedProduct].price}원</p>
     <input type='text' placeholder='ex)1' onChange={(e)=>{
     props.setAmount(e.target.value)
     }}></input>
     <button className="btn btn-danger" onClick={()=>{
     props.dispatch(addItem(props.shoes[props.selectedProduct]))
     }}>주문하기</button>
     </div>
     </div>
    </div>
     )
    }
    function Tabcontent({tab, shoes, selectedProduct}){
    let [fade,setFade] = useState('')
    useEffect(()=>{
    let a = setTimeout(()=>{
    setFade('end')
     },100)
    return ()=>{clearTimeout(a); setFade('')}
     },

    ) return( <div className={`p-5 tab-content start ${fade}`}> {[<div>{shoes[selectedProduct].title}</div>, <div>상세 페이지</div>,<div>사이즈</div>]

    } </div>) }
    export {Shop}
    
    
    #106079

    codingapple
    키 마스터
    navigate()를 로컬스토리지 어쩌구들 밑으로 내려봅시다
    #106088

    김정헌
    참가자
    죄송한데 말씀하신 것처럼 내려도 실행이 안됩니다..
    
    혹시 처음부터 route 경로를 잘 못 만든걸까요?
    #106107

    codingapple
    키 마스터
    로컬스토리지에 viewed 항목이 없어서 그럴수도요
    아니면 컴포넌트에 onClick달면 잘 안될수도있습니다 컴포넌트 안의 div에 달아봅시다
    #106116

    김정헌
    참가자
    해결했습니다!!
    바보같이 [] 추가 안했습니다.
    useEffect(()=>{
    localStorage.setItem('viewed',JSON.stringify([]))
    },[])
    여기 추가 안했습니다...
    
    심지어 let newViewed = viewed.push(props.i);라고 적어서 업데이트 된 length값만 받아서 넣으려고 해서 계속 1이 출력되었습니다.ㅠㅠ
    저는 하산을 좀 많이 미루도록 하겠습니다.ㅜㅜ
    
    
    		
    	
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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