개발 공부
리액트 기초 (반복문 2)
&u_na&
2023. 9. 12. 21:00
hat_component라는 파일 생성 시켜서 src에 component 라는 폴더 만들고 src > component > common 폴더 만들고 common 안에 4개
Footer.js
import "./footer.css";
const Footer = () => {
return (
<div className="footer">
<div>여기는 footer</div>
</div>
);
};
export default Footer;
Header.js
import "./header.css";
const Header = () => {
return (
<div className="header">
<div>모자팜</div>
</div>
);
};
export default Header;
footer.css
.footer {
background-color: #eee;
padding: 30px;
}
.footer > div {
width: 1200px;
margin: 0 auto;
}
header.css
.header {
background: #c21500; /* fallback for old browsers */
background: -webkit-linear-gradient(
to right,
#ffc500,
#c21500
); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(
to right,
#ffc500,
#c21500
); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
padding: 25px;
color: #fff;
font-weight: bold;
font-size: 30px;
}
그다음 src > component > product 라는 폴더 만들고 product 폴더 안에 4개
ProductList.js
import "./productList.css";
const ProductList = (props) => {
const productList = props.productList;
//console.log(productList);
const changeLike = props.changeLike;
return (
<div className="product-list">
{productList.map((product, index) => {
return (
<Product
key={"product" + index}
product={product}
changeLike={changeLike}
index={index}
/>
);
})}
</div>
);
};
const Product = (props) => {
const product = props.product;
const changeLike = props.changeLike;
const index = props.index;
//console.log(product);
return (
<div className="product">
<div className="product-img">
<img src={product.img}></img>
<div className="like-zone">
<Likes likes={product.likes} changeLike={changeLike} index={index} />
{/* index 빼줌 oldChangeLike 때 */}
</div>
</div>
<div className="product-info">
<div className="product-title">{product.productTitle}</div>
<div className="product-price">{product.productPrice}</div>
<div className="star-rate">
<StarRate star={product.star} />
</div>
</div>
</div>
);
};
const StarRate = (props) => {
const star = props.star;
const starRate = () => {
const arr = new Array();
for (let i = 0; i < star; i++) {
arr.push(<span className="material-icons">star</span>);
}
return arr;
};
return <>{starRate()}</>;
};
const Likes = (props) => {
const likes = props.likes;
const changeLike = props.changeLike;
const index = props.index;
return (
<span
className="material-icons"
onClick={() => {
changeLike(index);
}}
>
{likes === 0 ? "favorite_border" : "favorite"}
</span>
);
};
export default ProductList;
Title.js
import "./title.css";
const Title = () => {
return (
<div className="title">
<span className="material-icons">local_fire_department</span>
<span className="material-icons">local_fire_department</span>
<span>인기상품</span>
<span className="material-icons">local_fire_department</span>
<span className="material-icons">local_fire_department</span>
</div>
);
};
export default Title;
productList.css
import "./title.css";
const Title = () => {
return (
<div className="title">
<span className="material-icons">local_fire_department</span>
<span className="material-icons">local_fire_department</span>
<span>인기상품</span>
<span className="material-icons">local_fire_department</span>
<span className="material-icons">local_fire_department</span>
</div>
);
};
export default Title;
title.css
.title {
display: flex;
justify-content: center;
align-items: center;
padding: 50px 0px;
/* 상하패딩:50px 좌우패딩0px*/
}
.title > span {
font-size: 1.5em;
}
.title > span.material-icons {
color: #ff6a00;
}
.title > span:not(.material-icons) {
font-weight: bold;
}
App.js
import Header from "./component/common/Header";
import Footer from "./component/common/Footer";
import Title from "./component/product/Title";
import { useState } from "react";
import "./shop.css";
import ProductList from "./component/product/ProductList";
function App() {
const [productList, setProductList] = useState([
{
productNo: 1,
productName: "놀부모자",
img: "/image/product1.jpeg",
productPrice: 19900,
star: 4,
likes: 1,
},
{
productNo: 2,
productName: "해바라기모자",
img: "/image/product2.jpeg",
productPrice: 25600,
star: 3,
likes: 0,
},
{
productNo: 3,
productName: "파라오모자",
img: "/image/product3.jpeg",
productPrice: 23800,
star: 5,
likes: 1,
},
{
productNo: 4,
productName: "붕어빵모자",
img: "/image/product4.jpeg",
productPrice: 15600,
star: 2,
likes: 0,
},
]);
const changeLike = (index) => {
const newProductList = [...productList];
const likesStatus = newProductList[index].likes;
const changeStatus = likesStatus === 0 ? 1 : 0;
newProductList[index].likes = changeStatus;
setProductList(newProductList);
};
return (
<div className="wrap">
<Header />
<div className="content">
<Title />
<ProductList productList={productList} changeLike={changeLike} />
</div>
<Footer />
</div>
);
}
export default App;
임포트 된 shop.css
.wrap {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.wrap > div {
width: 100%;
box-sizing: border-box;
}
.content {
flex: 1;
padding: 50px;
}