10/07
작업
1. Header에 있는로고 클릭 시, 메인 창으로 이동한다
2. 우리가 가진 json 파일 => 목록안에 세팅 완료!
1. JSX: HTML +JS
-- 규칙
a. 반드시 하나의 부모요소로 감싸줄 것
b. {} return 문 안에서 js문법쓰려면? => if문 사용 불가 => 삼항연산자?: =>&&연산자
c. 태그 사용할때 무조건 소문자
2.Component
- class Component => this문법
- function Component
컴포넌트: 어플의 최소단위
=> 반복되는 코드를 하나로 묶어서 컴포넌트로 만든다
3.props 프로퍼티: 상위 컴포넌트 => 하위 컴포넌트로 값을 전달
=> 하위 컴포넌트 : Const 하위컴포넌트 = (props) => {}
그런데, 속성 이름만 가져오고 싶다면? {속성이름}
4.useState
- 변수는 화면에 바로 렌더링 되지 않는다!
- 데이터 관리를 state로!
4.Map 함수 (배열함수) 즉, 앞에 있는 데이터가 배열이 아니면 사용 x
- 에러 "map 함수 내가 모르는 함수다 어쩌고저쩌고" =>
- key => 고유한 값
** 하위 컴포넌트 => 상위컴포넌트로 값을 전달 xx
(1) 상위 컴포넌트 함수 만들고
(2) 그 함수를 하위 컴포넌트에 전달
(3) 하위컴포넌트에서 함수 호출
(4) 값은 매개변수로 왔다갔다
5.useEffect(Lifycycle)
case1)화면 렌더링 완료! useEffect(()=>{},[])
case2) 특정 값이 변화했을 때 useEffect(()=>{}, [감지할값])
6.Router
(1) Browser Router
(2) Routes: 조건에 맞는 경로를 지정해주는 친구!
(3) Route: path, element
(4) Link
(5) useNavigate
7.Axios
비동기 통신
.get(url).then.catch
<App.js>
import './App.css';
import {useEffect, useState} from 'react'
import axios from 'axios'
import Newsitem from './components/Newsitem';
function App() {
// Axios : 비동기 통신 라이브러리
// (1) 설치 : npm i axios
// (2) import axios from axios
// (3) axios로 데이터 조회하기
// axios : 비동기적으로 데이터를 요청
// .get(url) : get방식 /url에 있는 데이터
// .then(()=>{}) : 데이터 조회 성공 시
// .catch(()=>{}) : 데이터 조회 실패 시
// .then(()=>{}) : 항상 실행하는 것
// ** axios로 데이터 전송하기 (백엔드에)
// axios : 비동기적으로 데이터 전송
// .post(url, {보낼데이터}): 전송할 데이터, url
// .then(()=>{})
// .catch(()=>{})
let url='https://newsapi.org/v2/top-headlines?country=kr&apiKey=fa8d9d2a4b2a41b6805c902f4a3d8929'
const [news, setNews]=useState([])
const getNews = () => {
axios.get(url)
.then((res)=>{
setNews(res.data.articles)
console.log(news)
})
.catch(()=>{alert('error!')})
}
// 화면이 렌더링이 끝나면! 실행해주세요!
useEffect(()=>{
getNews()
},[])
return (
<div>
{news.map((item, idx)=>(<Newsitem key={idx+item.title} news={item}/>))}
</div>
);
}
export default App;
<index.js>
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<App />
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
<Newsitem.js>
import React from 'react'
const Newsitem = ({news}) => {
console.log(news)
return (
<div>
<img src={news.urlToImage} width="200px"></img>
<a href={news.url}>
<h2>{news.title}</h2>
</a>
<p>{news.description}</p>
</div>
)
}
export default Newsitem
<index.js>
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
<App.js>
import './App.css';
import {Routes, Route} from 'react-router-dom'
import Detail from './components/Detail';
import Header from './components/Header';
import Products from './components/Products';
function App() {
return (
<div>
<Header/>
<Routes>
<Route path='/' element={<Products/>}/>
<Route path='/detail:num' element={<Detail/>}/>
</Routes>
</div>
);
}
export default App;
[components]
<Detail.js>
import React from 'react'
import { useParams, useSearchParams } from 'react-router-dom'
const Detail = () => {
// useParams() => 파라미터
// Route path 값을 수정
let {num} = useParams()
//useSearchParams() => 쿼리
// url 값을 수정
const [query, setQuery] = useSearchParams()
// 장소까지 추가로 가져와서
// h2 => 타이틀
// p => 가격
// p => 장소
console.log(query.get('title'))
console.log(query.get('price'))
console.log(query.get('place'))
return (
<div>
{num}번째 게시물
<h2>{query.get('title')}</h2>
<h2>{query.get('price')}</h2>
<h2>{query.get('place')}</h2>
</div>
)
}
export default Detail
<Header.js>
import React from 'react'
import { Link } from 'react-router-dom'
const Header = () => {
const linkStyle = {
textDecoration : 'none',
color: 'green'
}
return (
<div>
<Link to='./' style={linkStyle}>
Campus K Market
</Link>
</div>
)
}
export default Header
<Product.js>
import React from 'react'
import { Link } from 'react-router-dom'
const Product = ({item,idx}) => {
console.log(item)
const containerStyle={
border: '1px solid gray',
display : 'flex',
flexDirection : 'column'
}
return (
<div style={containerStyle}>
<img src={item.photo} width="100px"></img>
<h2>
<Link to ={'/detail'+idx+'?title='+item.title+'&price='+item.price+'&place='+item.place}>
{item.title}
</Link>
</h2>
<p>{item.price}</p>
<p>{item.place}</p>
</div>
)
}
export default Product
<Products.js>
import React from 'react'
//데이터가 들어있는 json 파일
import sell from '../json/sell.json'
import Product from './Product'
//flex-wrap : wrap;
// => 크기가 넘어가는 데이터들은 다음 줄로 넘겨줌
const Products = () => {
console.log(sell.list)
return (
<div>
{sell.list.map((item,idx)=>(
<Product key={idx+item.title} item={item} idx={idx}/>
))}
</div>
)
}
export default Products