선언형
코드를 자세히 분석하지 않고도 코드의 의도를 분명히 알 수 있게 작성하는 방식 ===> 명시적// 직관적
컴포넌트란
하나의 기능 구현을 위해 여러 코드를 묶어놓은 것
- 장점
- 독립성이 생기고 재사용성이 높다
- 기능 작동에 집중하여 개발
- 유지보수 및 유닉 테스트가 쉽다
범용성
리액트는 자바스크립트 라이브러리
자바스크립트 프로젝트 어디에든 유연하게 적용
javascript XML의 줄임말
JSX작동 순서
하나의 엘리먼트 안에 모든 엘리먼트를 포함해야한다.
여러 엘리먼트를 작성하고자 하는 경우, opening tag와 closing tag필요
엘리먼트 클래스 사용 시, class가 아닌 className
자바스크립트 표현식 사용 시, 중괄호{ } 사용
컴퍼넌트는 대문자로 시작
function Exscript () {
console.log('hello world')
}
삼항연산자란
조건? 참일 때 결과 : 거짓일 때 결과
const result = (3 +1 ===4) (<h3> 정답입니다 !</h3>) :<h3> 오답입니다 !</h3>
if는 변수에 할당을 할 수 없지만,
삼항연산자는 변수에 할당이 가능하다.
const tweet = [
{
id: 1,
username: 'kim',
picture: `https://randomuser.me/api/portraits/women/${getRandomNumber(
1,
98
)}.jpg`,
content:
'어후,
createdAt: '2019-02-24T16:17:47.000Z',
updatedAt: '2019-02-24T16:17:47.000Z',
}
]
function Blog(tweet){
<ul className="tweets">
{/* TODO : 트윗 메세지가 있어야 합니다. */}
{tweet.map((el) => {
return <Tweet key={el.id} tweet={el} />
})}
</ul>
}
단, key값을 넣어줘여 한다.
- 모든 리액트 애플리케이션은 최소 한개의 컴퍼넌트를 가짐
- 컴포넌트는 애플리케이션 내부적으로 근원이되는 역할
- 부모와 자식이 있는 트리구조를 형성
React 앱 만들기
1. 터미널에 작업 폴더 생성
2. 작업 폴더로 이동
3. npm create-react-app 작업명
일반적인 웹 사이트는 새로운 정보를 받기 위해 매번 html파일 전부를 서버로부터 가져와야함
이는 불필요한 트래픽을 발생
이러한 문제로 만들어 진 것이 SPA
SPA
필요한 데이터만 서버에서 전달받아 브라우저에서 해당하는 부분만 업데이트하는 방식으로 작동하는 웹 애플리케이션이나 웹 사이트
장점
1. 필요한 부분만 렌더링하여 빠른 반응속도 제공
2. 서버 과부하 문제가 현저하게 줄어듬
3. 더 나은 유저경험 제공
단점
1. javascript의 파일크기 증가
2. 첫 로딩 시간이 길다
다른 주소에 따른 다른 뷰를 보여주는 과정을 경로에 따라 변경한다라는 의미
==> 다른 주소에 다른 화면을 보여줌 !
import {browserRouter, Switch, Route,Link}from “react-router-dom”;
새로고침하지 않고도 주소를 변경할 수 있는 역할
Switch
여러 Route를 감싸서 그 중 경로가 일치하는 단 하나의 라우터만 렌더링 해주는 역할
Route은 path속성을 지정하여 해당 path에 어떤 컴포넌트를 보여줄지 정함
Link컴포넌트가 정해주는 URL경로와 일치하는 경우에만 작동
path에서 exact속성이란 ?
Link
경로를 연결해주는 역할
ReactDOM으로 렌더를 시키게 되면 Link 컴포넌트는 a 태그로 바뀌는 모습을 볼 수 있습니다.
React Router 에서 a 태그가 아닌 Link를 사용하는 이유가 있나요?
==>Link컴포넌트는 페이지 전환을 방지하는 기능이 내장
ex)Main.js
<BrowserRouter> <Switch> <Route exact path="/"> <Home /> </Route> <Route path="/about"> {/* 경로를 설정하고 */} <MyPage /> {/* 컴포넌트를 연결합니다. */} </Route> <Route path="/home"> <Home /> </Route> </Switch> </BrowserRouter>
Side.js
<Link to ="/"> <i className="far fa-comment-dots"></i> </Link> <Link to ="/about"> <i className="far fa-question-circle"></i> </Link> <Link to ="/home"> <i className="far fa-user"></i> </Link>
cost [state, setState] = useState(초기값)
예시
```jsx
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
const handleChecked = (event) => {
setIsChecked(event.target.checked);
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
</div>
);
}
사용방법
- 하위 컴포넌트에 전달하고자 하는 값과 속성을 정의
- props를 이용하여 정의된 값과 속성을 전달
- 전달받은 props를 렌더링
ex)
import "./styles.css"; const App = () => { const itemOne = "React를"; const itemTwo = "배우고 있습니다."; return ( <div className="App"> {/* Learn 컴포넌트에 itemOne 과 itemTwo 를 props 로 전달하세요 */} <Learn>{itemOne} </Learn> <Learn text = {itemTwo} /> </div> ); }; const Learn = (props) => { // 전달받은 props 를 아래 <div> tag 사이에 사용하여 // "React를 배우고 있습니다" 라는 문장이 렌더링되도록 컴포넌트를 완성하세요 return <div className="Learn"> {props.children}{props.text} </div>; }; export default App;
import React, { useState } from "react";
import "./styles.css";
function SelectExample() {
const [choice, setChoice] = useState("apple");
const fruits = ["apple", "orange", "pineapple", "strawberry", "grape"];
const options = fruits.map((fruit) => {
return <option value={fruit}>{fruit}</option>;
});
const handleFruit = (event) => {
// drop down 목록에서 선택된 과일로 현재의 state 가 업데이트 되도록
// 함수를 완성하세요.
setChoice(event.target.value)
};
return (
<div className="App">
<select value={choice} onChange={handleFruit}>
{options}
</select>
<h3>You choose "{choice}"</h3>
</div>
);
}
export default SelectExample;
import React, { useState } from "react";
import "./styles.css";
function App() {
const [showPopup, setShowPopup] = useState(false);
const togglePopup = () => {
// Pop up 의 open/close 상태에 따라
// 현재 state 가 업데이트 되도록 함수를 완성하세요.
if(showPopup===false){
setShowPopup(true)
} else(setShowPopup(false))
};
return (
<div className="App">
<h1>Fix me to open Pop Up</h1>
{/* 버튼을 클릭했을 때 Pop up 의 open/close 가 작동하도록
button tag를 완성하세요. */}
<button className="open" onClick = {togglePopup}>Open me</button>
{showPopup ? (
<div className="popup">
<div className="popup_inner">
<h2>Success!</h2>
<button className="close" onClick={togglePopup}>
Close me
</button>
</div>
</div>
) : null}
</div>
);
}
export default App;
리액트가 state을 통제할 수 있는 컴포넌트를 컨트롤 컴포넌트라고한다.
import "./styles.css";
import React, { useState } from "react";
export default function App() {
const [username, setUsername] = useState("");
const [msg, setMsg] = useState("");
return (
<div className="App">
<div>{username}</div>
<input
type="text"
value={username}
-----------------------------컨트롤 컴포넌트 -----------------------
onChange={(event) => setUsername(event.target.value)}
-----------------------------컨트롤 컴포넌트 -----------------------
placeholder="여기는 인풋입니다."
className="tweetForm__input--username"
></input>
<div>{msg}</div>
{/* TODO : 위 input과 같이 입력에 따라서 msg state가 변할 수 있게
아래 textarea를 변경하세요. */}
<textarea
placeholder="여기는 텍스트 영역입니다."
-----------------------------컨트롤 컴포넌트 -----------------------
onChange={(event) => setMsg(event.target.value)}
-----------------------------컨트롤 컴포넌트 -----------------------
className="tweetForm__input--message"
></textarea>
</div>
);
}