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

home2 게시판 React 게시판 ajax 응용문제에서 상세페이지 연결

ajax 응용문제에서 상세페이지 연결

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

    딩코
    참가자
    import React, { useEffect, useState } from 'react';
    import { useParams, useNavigate } from 'react-router-dom';
    import data from './data';
    import './Detail.css';
    const Detail = () => {
        let [timeSale, SettimeSale] = useState(true);
        let [amount, SetAmount] = useState(1);
        // let [num, setNum] = useState('');
        let [tab, SetTab] = useState(1);
        useEffect(()=> {
            setTimeout(()=> {SettimeSale(false)}, 2000); 
        },[])
        useEffect(()=>{
            if(isNaN(amount) === true){
                alert('숫자만 입력해주세요');
                SetAmount(amount = 1);
            }
            if(amount <= 0){
                alert('해당 상품의 최소 구매 수량은 1개 입니다');
                SetAmount(amount = 1);
            }
        },[amount])
        let {id} = useParams();
        let navigate = useNavigate();
        
        return (
            <div className="container">
                <div className="row">
                    {
                        timeSale === true ? <div className='timesale'><h2>2초후에 사라집니다</h2></div> : null
                    }
                    
                    <div className="col-md-6">
                        
                    </div>
                    <div className="col-md-6">
                        <h4 className="pt-5">{data[id].title}</h4>
                        <p>{data[id].content}</p>
                        <p>{data[id].price}</p>
                        <input value={amount} onChange={(e) => {SetAmount(e.target.value)}}></input>
                        <button onClick={()=>{SetAmount(amount ++ )}}>+</button>
                        <button onClick={()=>{SetAmount(amount --)}}>-</button>
                        <p>TOTAL : { Math.ceil(data[id].price * amount)}원</p>
                        <button className="btn btn-danger">주문하기</button>
                        <button className="btn btn-danger" onClick={()=>{navigate(-1)}}>뒤로가기</button>
                    </div>
                </div>
                {/* <input onChange={(e) => {setNum(e.target.value)}}></input> */}
                
                <div className='tabWrap'>
                    
                          <li onClick={()=>{SetTab(1)}}>제품정보                     <li onClick={()=>{SetTab(2)}}>제품문의                     <li onClick={()=>{SetTab(3)}}>리뷰                     <li onClick={()=>{SetTab(4)}}>교환/반품                
                    <Tabcontent tab={tab} />             </div>                     </div>     ); }; function Tabcontent (props) {     if( props.tab === 1){         return <div>제품정보입니다</div>     }     if( props.tab === 2){         return <div>제품문의입니다</div>     }     if( props.tab === 3){         return <div>리뷰</div>     }     if( props.tab === 4){         return <div>교환/반품</div>     } } export default Detail;
    안녕하세요 선생님
    이게 지금 제 detail.js인데
    1번클릭시 456뜨고 2번 클릭시 789뜨게하는 응용문제는 성공했는데
    뜬 상품을 눌렀을때 상세페이지가 안뜨는데
    뜨게하려면 detail.js에서도 axios.get('https://codingapple1.github.io/shop/data3.json') 이런식으로 데이터를 불러와서 
    주소창에 예를들어 detail/7 이 찍혔을때는 https://codingapple1.github.io/shop/data3.json' 이주소에서 데이터값을 불러와서
    보여줘라는 식의 코드를 짜야할것 같은데 주말부터 어떻게 짜봐도 오류가 나는데 도와주세요 선생님 ㅠㅠ~!
    #38467

    codingapple
    키 마스터
    클릭시 페이지 이동은 navigate() 함수를 씁시다 
    Detail 페이지 로드시 지금 url에 적힌게 
    0 1 2면 data1.json 
    3 4 5 면 data2.json
    6 7 8이면 data3.json 
    가져오라고 코드짭시다 
    
    #38598

    딩코
    참가자
    선생님 App.js에서는 data2.json이랑 data3.json을 깃헙에서 axios로 가져오고 있는데 그럼
    detail.js에서 어떤방식으로 불러와야할까요??
    import랑 axios.get을 해봤는데 둘다 안되는데 
    검색도 감이 안잡혀서 ㅠㅠ
    검색 키워드라도 힌트를 주시면 찾아서 다시 짜보겠습니다!!
    
    #38601

    codingapple
    키 마스터
    위에 적은것처럼 detail 페이지 방문시 다시 ajax 요청하면 됩니다
    실제서비스였으면 상품하나만 불러올 수 있는 주소같은걸 편하게 만들어놨을듯요
    #39427

    딩코
    참가자
    import React, { useEffect, useState } from 'react';
    import { useDispatch } from 'react-redux';
    import { useParams, useNavigate } from 'react-router-dom';
    import data from './data';
    import './Detail.css';
    import axios from 'axios';
    import { addItem } from './store.js';
    const Detail = () => {
        let [productData, setProductdata] = useState(data);
        let [timeSale, SettimeSale] = useState(true);
        let [amount, SetAmount] = useState(1);
        // let [num, setNum] = useState('');
        let [tab, SetTab] = useState(0);
        let dispatch = useDispatch();
        let {id} = useParams();
        let navigate = useNavigate();
        console.log(id);
        Number(id) <= 5 ? console.log() : axios.get('https://ohwowoAo.github.io/shop/data2.json')
        .then((결과)=>{ 
          let addList = [...결과.data];
          setProductdata(addList)
          console.log(addList)
        })
        
        useEffect (()=> {
            const titleElement = document.getElementsByTagName("title")[0];
            titleElement.innerHTML = '상품상세페이지';
        },[]);
        
        useEffect(()=> {
            let watched = localStorage.getItem('watched');
            watched = JSON.parse(watched);
            watched.push(data[id].id);
            watched = new Set(watched);
            watched = Array.from(watched);
            localStorage.setItem('watched',JSON.stringify(watched));
        },[])
        useEffect(()=> {
            setTimeout(()=> {SettimeSale(false)}, 3000); 
        },[])
        useEffect(()=>{
            if(isNaN(amount) === true){
                alert('숫자만 입력해주세요');
                SetAmount(amount = 1);
            }
            if(amount <= 0){
                alert('해당 상품의 최소 구매 수량은 1개 입니다');
                SetAmount(amount = 1);
            }
        },[amount])
        
        // useEffect(() => {
        //     console.log(localStorage.getItem('cart'))
        // },[])
        
        
        return (
            <div className="container">
                <div className="row">
                    {
                        timeSale === true ? <div className='timesale'><p>※ 배송비 이벤트 기간 ~8월 15일 (3초후에 사라집니다.) </p></div> : null
                    }
                    
                    <div className="col-md-8 thumb-info">
                        
                    </div>
                    <div className="col-md-4 info">
                        <h4 className="pt-5">{productData[id].title}</h4>
                        <p className='productInfo'>{data[id].content}</p>
                        <p className='price'>{data[id].price}</p>
                        <table class="detailOpt">
                            <tr>
                                <th scope="row">제조사</th>
                                <td>내용이 들어갑니다.</td>
                            </tr>
                            <tr>
                                <th scope="row">브랜드</th>
                                <td>내용이 들어갑니다.</td>
                            </tr>
                            <tr>
                                <th scope="row">배송비</th>
                                <td> 배송비이벤트🔥 주문금액에 상관없이 무료배송</td>
                            </tr>
                        </table>
                        <div className='innerPrice'>
                            <p className='innerPriceName'>{productData[id].title}</p>
                            <div className='MK_qty-ctrl'>
                                <input value={amount} onChange={(e) => {SetAmount(e.target.value)}}></input>
                                <button className='plus' onClick={()=>{SetAmount(amount ++ )}}>+</button>
                                <button className='minus' onClick={()=>{SetAmount(amount --)}}>-</button>
                            </div>
                            <p className='innerPrice_basic'>{ Math.ceil(data[id].price * amount)}</p>
                        </div>
                        
                        <div className='total'><p>TOTAL</p> <b>{ Math.ceil(data[id].price * amount)}원</b></div>
                        <button className="cartBtn" onClick={()=>{
                            let cartList = JSON.parse(localStorage.getItem('cart'));
                            cartList.push({id : data[id].id, name : data[id].title, count : 1});
                            localStorage.setItem('cart', JSON.stringify(cartList))
                        }}>Cart</button>
                        <button className="backBtn" onClick={()=>{navigate(-1)}}>Back</button>
                    </div>
                </div>
                {/* <input onChange={(e) => {setNum(e.target.value)}}></input> */}
                
                <div className='tabWrap'>
                   
      <li style="list-style-type: none;">
                          <li className={tab === 0? 'bold' : null} onClick={()=>{SetTab(0)}}>제품정보

                        <li className={tab === 1? 'bold' : null} onClick={()=>{SetTab(1)}}>제품문의

                        <li className={tab === 2? 'bold' : null} onClick={()=>{SetTab(2)}}>리뷰

                        <li className={tab === 3? 'bold' : null} onClick={()=>{SetTab(3)}}>교환/반품

                   

                    <Tabcontent tab={tab} />             </div>                     </div>     ); };

    function Tabcontent (props) {
        let [fade, setFade] = useState('');
        useEffect (()=>{
            setTimeout(()=> {setFade('end')}, 10)
            return () => {
                setFade('')
            }
        }, [props.tab])
        return (<div className={'tabInfo ' + 'start ' + fade}>
            { [ <div>제품정보입니다</div>,  <div>제품문의입니다</div>, <div>리뷰</div>, <div>교환/반품</div>][props.tab]}</div>)
    }
    export default Detail;
    
    
    
    선생님 저렇게 가져온 data가 .then(()=>{})안에서만 유효하고 밖으로 나오지 못하는데
    어떤식으로 작성해야 주소 id에 맞춰 가져오게 짤수 있을까요?
    구조가 너무 어렵게 느껴져요 감이 안잡혀요 ㅠㅠ
    #39441

    codingapple
    키 마스터
    가져온거 productData에 잘저장되고 있을걸요 
    html에서 사용할 땐 productData에 원하는게 있을 때만 html 보여달라고 if문 써봅시다
    #39457

    딩코
    참가자
    .then((결과)=>{ 
          let addList = [...productData, ...결과.data];
          setProductdata(addList)
          console.log(addList); //결과.data까지 추가돼서 잘 나타남
          console.log(productData); // 기존 productData만 나타남
        })
    console.log(addList); //중분류에서 소멸돼서 함수찾을 수 없는 상태
    console.log(productData); //기존 productData만 나타남
    
    
    선생님 이런 상태인데 setProductdata(addList)을 해줬으면 productData 값이 결과.data까지 추가된 상태로 
    바뀌었어야 하는거 아닌가요??? addList는 중분류 밖으로 꺼내쓸수 없는데 이런 상태에서 
    어떻게 해야 합쳐진 데이터를 꺼내쓸수있을까요????
    #39499

    codingapple
    키 마스터
    state변경함수는 늦게처리되어서 그 밑에서 바로 state 출력해보면 제대로 안나옵니다 
    변경은 잘되어있습니다
8 글 보임 - 1 에서 8 까지 (총 8 중에서)
  • 답변은 로그인 후 가능합니다.

About

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

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

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