React
•
axios 쪽 code 수정 전 코드
const getProducts = () => {
axios.get('http://localhost:8080/products')
.then(res => res.data)
.then(data => setProducts(data))
.catch(err => console.err(err))
}
JavaScript
복사
•
axios 쪽 code 수정 후 코드
const getProducts = async () => {
try {
const res = await axios.get("http://localhost:8080/products");
const data = res.data;
setProducts(data);
} catch (err) {
console.error(err);
}
}
JavaScript
복사
Product 관련 코드
•
ProdBox.jsx
import axios from "axios";
import { useState } from "react";
const ProdBox = ({ prod, setProducts, products }) => {
const [isUpdateMode, setIsUpdateMode] = useState(false);
const handleUpdateMode = () => {
setIsUpdateMode(true)
}
const handleDelete = async () => {
try {
const res = await axios.delete(`http://localhost:8080/products/${prod.id}`);
const newProducts = products.filter(p => {
return p.id != prod.id
});
setProducts(newProducts);
} catch (error) {
console.error(error);
}
}
return (
<div style={{
textAlign: 'left',
display: 'flex',
flexDirection: 'column',
width: '30%',
padding: '10px'
}}>
<div style={{
width: '100%',
height: '100px',
backgroundColor: 'lightgray'
}}>
{
// 내용 수정
isUpdateMode ?
<>
<div><input /></div>
<div><input /></div>
<button>완료</button>
</>
:
<>
<div>{prod.name}</div>
<div>{prod.price}</div>
<button onClick={handleUpdateMode}>수정</button>
</>
}
<button onClick={handleDelete}>삭제</button>
</div>
</div>
);
}
export default ProdBox;
JavaScript
복사
•
ProdInput.jsx
import axios from "axios";
import { useState } from "react";
const ProdInput = ({ setProducts, products }) => {
const [newProduct, setNewProduct] = useState({
name: "",
price: 0,
});
const handleChange = (e) => {
const name = e.target.name;
const value = e.target.value;
setNewProduct({ ...newProduct, [name]: value });
// const { name, value } = e.target;
// setNewProduct({...newProduct, [name] : value } )
// setNewProduct({...newProduct, [e.target.name] : e.target.value})
};
const handleAddProd = async () => {
const res = await axios.post("http://localhost:8080/products", newProduct);
const newProd = res.data;
setProducts([...products, newProd]);
};
return (
<div>
<input type="text" name="name" value={newProduct.name} onChange={handleChange}/>
<input type="number" name="price" min="0" step="1000" value={newProduct.price} onChange={handleChange} />
<button onClick={handleAddProd}>추가</button>
</div>
);
};
export default ProdInput;
JavaScript
복사
•
Product.jsx
import axios from "axios";
import { useState } from "react";
const ProdBox = ({ prod, setProducts, products, idx }) => {
const [isUpdateMode, setIsUpdateMode] = useState(false);
const [product, setProduct] = useState({ name: prod.name, price: prod.price });
const handleChange = (e) => {
setProduct(prevState => ({...prevState, [e.target.name]: e.target.value}))
}
const handleUpdateMode = () => {
setIsUpdateMode(true);
}
const handleUpdate = async () => {
try {
// 입력한 상품명과 가격을 받아야
// product <- 입력한 상품명과 가격
// 서버에 업데이트 요청
// put : 전체에 대한 변경
// patch : 일부에 대한 변경
const editProduct = {...product, id: prod.id}
const res = await axios.put(`http://localhost:8080/products/${prod.id}`, editProduct)
const updateProducts = products.map(p => (p.id === prod.id ? editProduct : p));
setProducts(updateProducts);
// 정상적으로 업데이트가 되었다면
setIsUpdateMode(false);
} catch (error) {
console.error(error)
}
}
const handleDelete = async() => {
try {
const res = await axios.delete(`http://localhost:8080/products/${prod.id}`);
const newProducts = products.filter(p => {
return p.id != prod.id
});
setProducts(newProducts);
} catch (error) {
console.error(error);
}
}
return (
<div style={{
textAlign: 'left',
display: 'flex',
flexDirection: 'column',
width: '30%',
padding: '10px'
}}>
<div style={{
width: '100%',
height: '100px',
backgroundColor: 'lightgray'
}}>
{
// 내용 수정
isUpdateMode ?
<>
<div><input type="text" name="name" value={product.name} onChange={handleChange} /></div>
<div><input type="number" name="price" value={product.price} onChange={handleChange} /></div>
<button onClick={() => handleUpdate(prod.id)}>완료</button>
</>
:
<>
<div>{prod.name}</div>
<div>{prod.price}</div>
<button onClick={handleUpdateMode}>수정</button>
<button onClick={handleDelete}>삭제</button>
</>
}
</div>
</div>
);
}
export default ProdBox;
JavaScript
복사
News 관련 코드
•
https://newsapi.org/v2/top-headlines?country=kr&apiKey=API_KEY
JavaScript
복사
•
News.jsx
import axios from "axios";
import "./News.css";
import { useEffect } from "react";
import { useState } from "react";
const News = () => {
const cateArr = ["business", "entertainment", "general", "health", "science", "sports", "technology"]
const [newsList, setNewsList] = useState();
const [isLoading, setIsLoading] = useState(true);
const [category, setCategory] = useState("business");
const getNews = async () => {
try {
// 뉴스 api 호출하여 정보 불러오기 (20개 정보 조회됨)
const res = await axios.get(`https://newsapi.org/v2/top-headlines?country=kr&category=${category}&apiKey=7eb27740ecee473ba3dad7721eacc7b8`);
console.log(res.data.articles);
setNewsList(res.data.articles);
setIsLoading(false)
} catch (error) {
console.error(error);
}
}
const handleCategory = (e) => {
console.log(e.target.innerText);
setCategory(e.target.innerText);
}
// 딱 한번만 실행되고 멈춤
useEffect(() => {
getNews();
}, [category]);
if (isLoading) {
return (
<div>로딩 중</div>
)
}
return (
<>
{
cateArr.map((category, idx) => (
<button key={idx} onClick={handleCategory}>{category}</button>
))
}
<div className="news-list">
{newsList.map((article, idx) => (
<div key={idx} className="news-item">
<div className="thumbnail">
<img src={article.urlToImage} alt={article.title} />
</div>
<div className="contents">
<h2>{article.title}</h2>
<p>{article.description}</p>
</div>
</div>
))}
</div>
</>
);
}
export default News;
JavaScript
복사
•
News.css
.news_list {
width: 500px;
margin-right: 10px;
}
.news-item {
margin-left: 200px;
margin-right: 200px;
margin-top: 50px;
padding: 50px 50px;
border-radius: 20px;
display: flex;
background-color: white;
border: 0.5px solid black;
text-align: left;
text-decoration: none;
box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.15);
}
.thumbnail {
padding: 10px 20px;
}
h2 {
font-size: 20px;
}
img {
width: 250px;
height: 250px;
}
p {
display: flex;
overflow: hidden;
}
CSS
복사
Shopping
•
react-router-dom 설치
yarn add react-router-dom
Plain Text
복사