강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của isbcom10046265
isbcom10046265

câu hỏi đã được viết

Một trại huấn luyện phát triển toàn diện thực sự dành cho những người không chuyên ngành

그랩님, 상품 상세 페이지 에러와 의문점 질문드립니다.

Viết

·

81

0

그랩님, 강의 잘 듣고 있습니다.

다름이 아니라, 상품 상세 페이지 에러와 의문점이 있어서 어떻게 해결해야 하는지 궁금한 사항이 있어 질문 드리게 되었습니다.

  1. 일단 src/main/index.js 소스 코드를 첨부합니다.


    import './index.css';
    import axios from "axios";
    import React from 'react';
    import {Link} from 'react-router-dom';
    function MainPage(){
        const [products, setProducts]=React.useState([]);
        React.useEffect(
            function(){
                axios.get("제 mock 서버 주소 넣었습니다/products")
                .then(function(result){
                    const products=result.data.products;
                    setProducts(products);
                }).catch(function(error){
                    console.error("에러 발생:",error);
                });
        },[]); return ( 
            <div>    
            <div id="header">
            <div id="header-area">
                <img src="../images/icons/logo.png" />
            </div>
        </div>
        <div id="body">
            <div id="banner">
                <img src="../images/banners/banner1.png" />
            </div>
            <h1>판매되는 상품들</h1>
            <div id="product-list">
                
                {
                     products.map(function(product, index){
                
                        return ( 
    
                    <div className="product-card">
                    <Link className="product-link" to={`/products/${product.id}`}>
                    <div>
    
                    <img className="product-img" src={product.imageUrl} />
                    </div>
                <div className="product-contents">
                    <span className="product-name">{product.name}
                    </span>
                    <span className="product-price">{product.price}원
                    </span>
                    <div className="product-seller">
                        <img className="product-avatar" src="../images/icons/avatar.png" />
                        <span>{product.seller}</span>
                    </div>
                </div>
                </Link>
    
                </div>
                
                
            ); 
                    }) 
                }
    
            </div>
            </div>
        
        <div id="footer"></div>
        </div>
        );
    }
    
    export default MainPage;

    2.src/product/index.js 소스 첨부합니다.

    import {useParams} from 'react-router-dom';
    import axios from "axios";
    import { useEffect, useState } from 'react';
    function ProductPage(){
        // const params=useParams();
        const {id} = useParams();
        const [product, setProduct] = useState(null);
        useEffect(function(){
            axios.get('제 mock 서버 주소 넣었습니다/products/${id}'
            )
            .then(function (result) {
                setProduct(result.data);
                // console.log(result);
            }).catch(function(error){
                console.error(error);
            }
        );
        },[]);
        console.log(product);
        
        // console.log(params);
    
        return <h1>상품 상세 페이지 {id} 상품</h1>;
    }
    export default ProductPage;


    -->여기서부터 의문점과 문제점이 발생하게 되니 읽어주시고 해결할 수 있는 방법을 알려주시면 좋겠습니다. 위 소스에서

    axios.get('제 mock 서버 주소 넣었습니다/products/${id}') 처럼 소스를 달러 중괄호 아이디 입력하면, 아래와 같은 첨부 사진처럼 에러가 납니다.


    상품 상세 페이지 1 구현 에러 axios get url 슬래시 1하면 되는데 문제는 달러 아이디 중괄호하면 안됨 이미지첨부.jpg.webp


    --> 위 에러 첨부 사진은 어떻게 해결해야 할까요?



    3. 하지만, 위 소스대로 입력 안하면
    axios.get('제 mock 서버 주소 넣었습니다/products/1') 하면 제대로 데이터를
    오류 없이
    아래 첨부 사진처럼 받아 오는 것을 알 수 있습니다.

    상품 상세 페이지 1 구현 에러 아닌 소스코드 슬래시 1일때 정상 화면 달러 중괄호 아이디하지 않을 때 잘 되는 화면.jpg.webp




    3-1. 그랩님, 강의 소스에서 처럼 axios.get('제 mock 서버 주소 넣었습니다/products/${id}')해서 하면 위 첨부 사진 처럼 에러가 나는데요, 성공적으로 오류 없이 불러오고 싶은데요, 어떻게 해야 하나요?

     


    단계별로 어떻게 소스를 수정해야하는지 알려주시면 좋겠습니다.

    확인하시면 답변 부탁 드립니다.

HTML/CSSjavascriptreactnode.jsreact-native머신러닝expresstensorflow

Câu trả lời 2

0

grab님의 프로필 이미지
grab
Người chia sẻ kiến thức

확인이 늦었습니다!
문자열을 처리하는 방식에 ''(따옴표) 과 ``(벡틱)가 있는데, products/${id} 같이 변수를 넣어야 하는경우
``으로 처리를 해줘야 합니다.

예를들면 const id = 1;

const url = 'https://hello.com/products/${id}'
를 하게되면 실제로 url에는 products/1 이렇게 변수가 들어가는 구조가 아닌 문자열 그대로 처리되어 버립니다.

따라서 따옴표가 아닌 벡틱인 `...` 로 처리해주시면 잘 동작할 것 같습니다! {id}'를 하게되면 실제로 실행시 u{}'

0

안녕하세요, 인프런 AI 인턴입니다.
isbcom1004님, 문의 주신 사항에 대해 답변 드리겠습니다.

에러의 원인은 axios.get('제 mock 서버 주소 넣었습니다/products/${id}')에서 잘못된 문자열 템플릿 사용으로 보입니다. 자바스크립트에서 문자열 템플릿을 사용할 때는 백틱(`)을 이용해야 하는데, 잘못된 작은 따옴표(“)를 사용했습니다. 올바른 방법으로 수정해 주세요:

  1. 변경해야 할 코드:
    
    axios.get(`제 mock 서버 주소 넣었습니다/products/${id}`)
    

여기서 핵심은 작은 따옴표가 아닌 백틱(`)을 사용해야 한다는 것입니다. 백틱은 문자열 내에서 변수를 포함하는 문자열 템플릿에 적합합니다.

또한, map 메서드 안에서 구성 요소를 나열할 때 각 요소에 고유한 key를 추가하는 것이 좋습니다. 이는 성능 최적화 및 React에서 리스트의 엘리먼트를 관리하기 위한 일반적인 권장사항입니다. 다음과 같이 수정하시면 됩니다:

  1. map 메서드 사용 시 수정:
    
    {
       products.map(function(product, index){
           return (
               <div className="product-card" key={product.id}>
                   <Link className="product-link" to={`/products/${product.id}`}>
                       <div>
                           <img className="product-img" src={product.imageUrl} />
                       </div>
                       <div className="product-contents">
                           <span className="product-name">{product.name}</span>
                           <span className="product-price">{product.price}원</span>
                           <div className="product-seller">
                               <img className="product-avatar" src="../images/icons/avatar.png" />
                               <span>{product.seller}</span>
                           </div>
                       </div>
                   </Link>
               </div>
           );
       })
    }
    

위의 수정사항을 반영하신 후, 다시 시도해 보시면 문제가 해결될 것입니다. 문제가 지속된다면 추가 정보를 제공해 주시거나, 코드의 다른 부분에서 실수가 있을 수 있습니다.

추가적으로, 이미지와 관련된 에러는 제공해주신 URL로 확인할 수 있습니다: 이미지 1, 이미지 2.

도움이 되셨길 바라며, 추가적으로 궁금한 점 있으면 언제든지 문의 주세요!

Hình ảnh hồ sơ của isbcom10046265
isbcom10046265

câu hỏi đã được viết

Đặt câu hỏi