작성
·
36
0
그랩님, 강의 잘 듣고 있습니다.
다름이 아니라, 상품 상세 페이지 에러와 의문점이 있어서 어떻게 해결해야 하는지 궁금한 사항이 있어 질문 드리게 되었습니다.
일단 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}') 처럼 소스를 달러 중괄호 아이디 입력하면, 아래와 같은 첨부 사진처럼 에러가 납니다.
--> 위 에러 첨부 사진은 어떻게 해결해야 할까요?
3. 하지만, 위 소스대로 입력 안하면
axios.get('제 mock 서버 주소 넣었습니다/products/1') 하면 제대로 데이터를
오류 없이 아래 첨부 사진처럼 받아 오는 것을 알 수 있습니다.
3-1. 그랩님, 강의 소스에서 처럼 axios.get('제 mock 서버 주소 넣었습니다/products/${id}')해서 하면 위 첨부 사진 처럼 에러가 나는데요, 성공적으로 오류 없이 불러오고 싶은데요, 어떻게 해야 하나요?
단계별로 어떻게 소스를 수정해야하는지 알려주시면 좋겠습니다.
확인하시면 답변 부탁 드립니다.
답변 2
0
확인이 늦었습니다!
문자열을 처리하는 방식에 ''(따옴표) 과 ``(벡틱)가 있는데, 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}')
에서 잘못된 문자열 템플릿 사용으로 보입니다. 자바스크립트에서 문자열 템플릿을 사용할 때는 백틱(`)을 이용해야 하는데, 잘못된 작은 따옴표(“)를 사용했습니다. 올바른 방법으로 수정해 주세요:
axios.get(`제 mock 서버 주소 넣었습니다/products/${id}`)
여기서 핵심은 작은 따옴표가 아닌 백틱(`)을 사용해야 한다는 것입니다. 백틱은 문자열 내에서 변수를 포함하는 문자열 템플릿에 적합합니다.
또한, map
메서드 안에서 구성 요소를 나열할 때 각 요소에 고유한 key
를 추가하는 것이 좋습니다. 이는 성능 최적화 및 React에서 리스트의 엘리먼트를 관리하기 위한 일반적인 권장사항입니다. 다음과 같이 수정하시면 됩니다:
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.
도움이 되셨길 바라며, 추가적으로 궁금한 점 있으면 언제든지 문의 주세요!