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

home2 게시판 React 게시판 메인페이지에서 card 클릭시 상품상세페이지 이동 방법

메인페이지에서 card 클릭시 상품상세페이지 이동 방법

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

    박땡땡
    참가자
    App.js
    
    
    
    /* eslint-disable */
    import { useState } from 'react';
    import { Button, Navbar, Container, Nav, Row, Col} from 'react-bootstrap';
    import bg from './bg.png';
    import './App.css';
    /* import a from './data.js' */
    /* import {a, b} from './data.js' */
    import data from './data.js'
    import {Detail} from './pages/Detail.js';
    import {Routes, Route, Link, useNavigate, Outlet} from 'react-router-dom'
    import axios from 'axios'; 
    import Cart from './component/Cart.js'
    function App() {
    let [shoes, setShoes] = useState(data);
    let navigate = useNavigate();
    let [moreBtn, setMoreBtn] = useState(0);
    let [loading, setLoading] = useState(false);
    let [noitem, setItem] = useState(false);
    /* localstorage */
    
    
    return (
    <div className="App">
    <Navbar bg="dark" variant="dark">
    <Container>
    <Navbar.Brand onClick={()=>{ navigate('/') }}>ShoeShop</Navbar.Brand>
    <Nav className="me-auto">
    <Nav.Link onClick={()=>{ navigate('/') }}>Home</Nav.Link>
    <Nav.Link onClick={()=>{ navigate('/detail') }}>Detail</Nav.Link>
    <Nav.Link onClick={()=>{ navigate('/cart') }}>Cart</Nav.Link>
    </Nav>
    </Container>
    </Navbar>
    <Routes>
    <Route path="/" element={
    <>
    <div className="main-bg" style={{ backgroundImage: `url(${bg})` }}></div>
    <div className="container">
    <div className="row">
    <Card shoes={shoes}></Card>
    </div>
    </div>
    {
    loading == true ? <Loading></Loading> : null
    }
    {
    noitem == true? <NoItem></NoItem> : null
    }
    <button onClick={(e)=>{
    setLoading(true);
    if(moreBtn == 0) {
    axios.get('https://codingapple1.github.io/shop/data2.json')
    .then((result)=>{ 
    setLoading(false);
    let copyShoes = [...shoes];
    copyShoes.push(...result.data);
    setShoes(copyShoes);
     }).catch(()=> {
    console.log('데이터 가져오기 실패');
     });
    setMoreBtn(moreBtn+1);
     } else if(moreBtn == 1) {
    axios.get('https://codingapple1.github.io/shop/data3.json')
    .then((result)=>{ 
    setLoading(false);
    let copyShoes = [...shoes];
    copyShoes.push(...result.data);
    setShoes(copyShoes);
     }).catch(()=> {
    console.log('데이터 가져오기 실패');
     });
    setMoreBtn(moreBtn+1);
     } else {
    setLoading(false);
    setItem(true);
     }
    moreBtn >= 2 ? e.target.style.display = 'none' : null;
     }}>더보기</button>
     
    </>
    } />
    <Route path="/detail/:id" element={<Detail shoes={shoes}/>} />
    <Route path="/cart" element={ <Cart/>}/>
    <Route path="*" element={<div>없는 페이지 입니다.</div>} />
    </Routes>
     
    </div>
     );
    }
    function Card(props){
    let shoeslist = props.shoes;
    return(
    shoeslist.map(function(a, i) {
    return(
    <div className="col-md-4" key={i}>
    <img src={`https://codingapple1.github.io/shop/shoes${i+1}.jpg`} width="80%"/>
    <h4>{shoeslist[i].title}</h4>
    <p>{shoeslist[i].content}</p>
    </div>
     )
     })
     )
    }
    function Loading(){
    return(
    <>
    <p>상품 목록을 불러오고 있습니다.</p>
    </>
     )
    }
    function NoItem(){
    return(
    <>
    <p>더 이상 상품이 존재하지 않습니다.</p>
    </>
     )
    }
    export default App;
    
    
    -----------
    Detail.js
    
    
    
    import { useEffect, useState } from "react"
    import { useParams } from "react-router"
    import styled from 'styled-components';
    import {Nav} from 'react-bootstrap';
    import './../App.css';
    import { useDispatch } from "react-redux";
    import { addItem } from './../store.js';
    const Detail = function(props) {
    /* let alertDisplay = () => {
     const alertBox = document.querySelector('.alert-warning');
     setTimeout(()=> {
     alertBox.style.display = 'none';
     }, 2000);
     } */
     
    let {id} = useParams();
    let findProd = props.shoes.find(function(el){
     return el.id == id;
    });
    let [alert, setAlert] = useState(true);
    let [checkAlert, setChekAlert] = useState(false);
    let [inputValue, setInputValue] = useState('');
    let 

    = useState(0); let [fade2, setFade2] = useState(''); let dispatch = useDispatch();
    useEffect(() => {
    /* alertDisplay(); */
    const a = setTimeout(()=> {setAlert(false);}, 2000);
     return () => {
    clearTimeout(a)
    }
    }, []);
    useEffect(()=> {
    if(isNaN(inputValue) == true) {
    setChekAlert(true);
    } else {
    setChekAlert(false);
    }
    }, [inputValue]);
    useEffect(()=> {
    setTimeout(() => {
    setFade2('end');
    }, 100);
     return(
    setFade2('')
    )
    }, []);
     return(
    <div className={`container start ${fade2}`}>
    {
    alert == true ?
    <div className="alert alert-warning">2초 이내 구매시 할인!</div>
    : null
    }
    <div className="row">
    <div className="col-md-6">
    
    </div>
    <div className="col-md-6">
    {
    checkAlert == true ?
    <div className="alert alert-danger">숫자만 입력하세요</div>
    : null
    }
    <input type="text" onChange={(e)=> {
    setInputValue(e.target.value);
     }}/>
    <h4 className="pt-5">{findProd.title}</h4>
    <p>{findProd.content}</p>
    <p>{findProd.price}</p>
    <button className="btn btn-danger" onClick={()=>{
    dispatch(addItem( {id: findProd.id, name: findProd.title, count: 1} ))
     }
    }>주문하기</button>
    </div>
    </div>
    <div className="row">
    <div className="col-md-12">
    <Nav variant="tabs" defaultActiveKey="link0">
    <Nav.Item>
    <Nav.Link onClick={ ()=>{setTab(0)} } eventKey="link0">버튼0</Nav.Link>
    </Nav.Item>
    <Nav.Item>
    <Nav.Link onClick={ ()=>{setTab(1)} } eventKey="link1">버튼1</Nav.Link>
    </Nav.Item>
    <Nav.Item>
    <Nav.Link onClick={ ()=>{setTab(2)} } eventKey="link2">버튼2</Nav.Link>
    </Nav.Item>
    </Nav>
    <TabContent tab={tab} />
    </div>
    </div>
    </div>
     
    )
    }
    function TabContent({tab, shoes}){/* props 대신 {}괄호 안에 useState 변수 넣어줘도 됨 */
    /* if(tab == 0) {
     return (<div>탭 01</div>);
     }
     if(tab == 1) {
     return (<div>탭 02</div>);
     }
     if(tab == 2) {
     return (<div>탭 03</div>);
     } */
    let [fade, setFade] = useState('');
    useEffect(()=>{
    setTimeout(()=> {
    setFade('end');
     }, 100)
    return () => {
    setFade('');
     }
     },

    );
    return(
    <div className={`start ${fade}`}>
    {[<div>탭 01</div>, <div>탭 02</div>, <div>탭 03</div>]

    } </div> ) }
    export {Detail}
    
    
    
    
    
    ----------------------------------------
    
    
    선생님 localStorage 최근 본 상품 기능 숙제를 하기 위해
    메인(home)에서 상품리스트 클릭 시, 해당되는 디테일 페이지로 이동하도록 하고싶은데
    라우터? 링크? 를 어떻게 적용시켜야 할 지 모르겠습니다.
    주소창에 직접 http://localhost:3000/detail/0 이렇게 쳐서 이동하면 정상적으로 id값에 해당되는 상품페이지로 이동되긴 하나,
    선생님처럼 메인페이지에서 상품이미지 클릭시 디테일 페이지로 이동하는 방법을 어떻게 적용해야할지 모르겠습니다 ㅠㅠ..
    저렇게 컴포넌트를 map 함수로 이용하여 뿌려줄 땐 페이지 이동링크를 어떻게 달아줘야 하나요?
    
    
    
    
    #46919

    codingapple
    키 마스터
    원하는거 클릭시 navigate()를 실행해줍시다
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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