Backend
home

2024. 7. 3

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
๋ณต์‚ฌ

๊ธฐํƒ€