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 ๊ด๋ จ ์ฝ๋
โข
api ์์ฑ ํ ์ ์ฉ
(https://newsapi.org/docs/endpoints/top-headlines โ ํ์๊ฐ์
ํ API KEY ์์ฑ)
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
๋ณต์ฌ



