Rendering User Interfaces
What is the DOM?
HTML 요소의 객체 표현
코드와 유저 인터페이스를 연결하는 다리 역할
부모와 자식 관계같은 트리 구조
DOM methods와 자바스크립트와 같은 프로그래밍 언어를 사용하여 유저의 이벤트를 듣고 유저 인터페이스에 특정 요소를 선택, 추가, 업데이트 및 삭제함으로써 DOM을 조작할 수 있습니다.
DOM 조작을 사용하여 해당 요소의 스타일과 내용도 변경할 수 있다.
script
태그 안에서 DOM methods getElementById()
를 사용하여 id
별로 div
요소를 선택 할 수 있다.
<html>
<body>
<div id="app"></div>
<script type="text/javascript"></script>
</body>
</html>
h1
요소를 만들 수 있다.<html>
<body>
<div id="app"></div>
<script type="text/javascript">
// 'app' id의 div요소를 선택
const app = document.getElementById('app')
// 새로운 h1 요소 생성
const header = document.createElement('h1')
// h1 요소의 새 텍스트 노드를 만든다
const headerContent = document.createTextNode('Develop. Preview. Ship, 🚀')
// h1 요소에 텍스트를 추가한다.
header.appendChild(headerContent)
// h1 요소를 div 안에 배치
app.appendChild(header)
</script>
</body>
</html>
HTML vs the DOM
h1
요소가 포함되어 있다. 페이지의 DOM은 HTML 파일과 다르다 <h1>
요소를 추가하기 위해 작성되었다.<!-- index.html -->
<script type="text/javascript">
const app = document.getElementById('app')
const header = document.createElement('h1')
const headerContent = document.createTextNode('Develop. Preview. Ship. 🚀')
header.appendChild(headerContent)
app.appendChild(header)
</script>
Imperative vs Declarative Programming 명령형 vs 선언형
React: A declarative UI library
Getting Started with React
<html>
<body>
<div id="app"></div>
// unpkg.com 외부 사이트를 이용해 react 사용가능
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script type="text/javascript">
const app = document.getElementById('app')
</script>
</body>
</html>
react-dom
의 ReactDOM.render()
메서드를 사용하여 app
요소 안의 h1
을 렌더링할 수 있다.<html>
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script type="text/javascript">
const app = document.getElementById('app')
ReactDom.render(<h1>리액트🚀</h1>, app) // 에러 발생 Uncaught SyntaxError: Unexpected token '<'
</script>
</body>
</html>
<h1>...</h1>
이 유효한 자바스크립트가 아니고 JSX 코드이기때문이다.What is JSX?
JSX는 HTML과 유사한 구문으로 UI를 설명할 수 있는 자바스크립트 구문 확장입니다.
JSX는 JS파일 내에 HTML과 같은 마크업을 쓸 수 있는 자바스크립트 구문 확장이다.
자바스크립트가 HTML을 담당하기 때문에 리액트에서 렌더링 로직과 마크업이 같은 컴포넌트 안에 있다.
JSX는 세가지의 JSX 규칙을 따른다.
Virtual DOM
에서 컴포넌트의 변화를 감지하여 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙이 있다.<>
<h1>Hedy Lamarr's Todos</h1>
<img
...
>
<ul>
...
</ul>
</>
// <> ... </>
// 빈태그는 React fragment라고 부른다.
// 브라우저 HTML 트리에 어떤 흔적을 남기지 않고 그룹화 할 수 있다.
브라우저는 JSX를 바로 이해하지 못 한다.
JSX코드를 일반 자바스크립트로 변환하려면 babel과 같은 자바스크립트 컴파일러가 필요하다.
Converting HTML to JSX
<h1>Hedy Lamarr's Todos</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
>
<ul>
<li>Invent new traffic lights
<li>Rehearse a movie scene
<li>Improve the spectrum technology
</ul>
export default function TodoList() {
return (
// This doesn't quite work!
<h1>Hedy Lamarr's Todos</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
>
<ul>
<li>Invent new traffic lights
<li>Rehearse a movie scene
<li>Improve the spectrum technology
</ul>
);
}
Adding Babel to your project
type=text/jsx
로 변경하여 변환할 코드르 Babel에게 알려야한다.<html>
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<!-- Babel Script -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<!-- Declarative Programming -->
<script type="text/jsx">
const app = document.getElementById('app');
ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app);
</script>
</body>
</html>
<!-- Imperative Programming -->
<script type="text/javascript">
const app = document.getElementById('app')
const header = document.createElement('h1')
const headerContent = document.createTextNode('Develop. Preview. Ship. 🚀')
header.appendChild(headerContent)
app.appendChild(header)
</script>
Essential JavaScript for React
React Core Concepts
Building UI with Components
Creating components
script
태그 안에 header
라는 함수를 입력한다.<script type="text/jsx">
const app = document.getElementById("app")
function header() {
}
ReactDOM.render(<h1>Develop. Preview. Ship. 🚀</h1>, app)
</script>
<script type="text/jsx">
const app = document.getElementById("app")
function header() {
return (<h1>Develop. Preview. Ship. 🚀</h1>)
}
ReactDOM.render(, app)
</script>
ReactDOM.render()
메서드에 첫번째 인수로 전달한다.<script type="text/jsx">
const app = document.getElementById("app")
function header() {
return (<h1>Develop. Preview. Ship. 🚀</h1>)
}
ReactDOM.render(header, app)
</script>
<script type="text/jsx">
const app = document.getElementById("app")
function Header() {
return (<h1>Develop. Preview. Ship. 🚀</h1>)
}
ReactDOM.render(Header, app)
</script>
<script type="text/jsx">
const app = document.getElementById("app")
function Header() {
return <h1>Develop. Preview. Ship. 🚀</h1>
}
ReactDOM.render(<Header/>, app)
</script>
Nesting Components
function Header() {
return <h1>Develop. Preview. Ship. 🚀</h1>
}
function HomePage() {
return (
<div>
{/* Nesting the Header component */}
<Header />
</div>
)
}
ReactDOM.render(<Header />, app)
Component Trees
HOMPAGE
컴포넌트에 HEADER
APTICLE
FOOTER
컴포넌트가 포함될 수 있다.HOMPAGE
가 최상위 컴포넌트로 ReactDOM.render()
메서드에 전달할 수 있다.Displaying Data with Props
props
를 사용해 정보를 속성으로 컴포넌트에 전달할 수 있다. props
전달Using props
HOMPAGE
컴포넌트에서 HTML 속성을 전달 때와 같이 Header
컴포넌트에 title
을 props
로 전달할 수 있다.Using Variables in JSX
{}
을 사용할 수 있다.// function Header({title}) {
// console.log(title)
return <h1>{title}</h1>
// }
{}
: JSX 안에 있을 때 자바스크립트로 갈수 있는 방법function Header(props) {
return <h1>{props.title}</h1>
}
function Header({ title }) {
return <h1>{`Cool ${title}`}</h1>
}
Iterating through lists
array.map()
메서드를 사용해서 배열을 반복하고 화살표 함수를 사용하여 목록의 이름을 맵핑할 수 있다.function HomePage() {
const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton']
return (
<div>
<Header title="Develop. Preview. Ship. 🚀" />
<ul>
{names.map(name => (
<li>{name}</li>
))}
</ul>
</div>
)
}
key
가 없다는 경고를 줄 것이다. 왜냐하면 리액트는 DOM에서 업데이트할 요소를 알 수 있도록 배열 내의 항목을 고유하게 식별할 수 있는게 필요하기 때문이다.Adding Interactivity with State
Listening to Events
onCick
이벤트를 사용할 수 있다.function HomePage() {
// ...
return (
<div>
{/* ... */}
<button onClick={}>Like</button>
</div>
);
}
onCick
이벤트는 사용자 상호 작용에 응답하느데 사용할 수 있는 많은 이벤트 중 하나이다.Handling Events
handleClick()
함수를 만든다.function HomePage() {
// ...
function handleClick() {
console.log("increment like count")
}}
return (
<div>
{/* ... */}
<button onClick={}>Like</button>
</div>
)
}
onClick
이벤트가 트리거될 때 handelClick
함수를 호출할 수 있다.State and Hooks
hooks
라고 부르는 기능이 있다. Hooks
는 state 같은 추가적인 로직을 컴포넌트에 추가할 수 있게 한다.state
를 사용해서 유저가 버튼을 클릭한 횟수를 저장하고 늘릴 수 있다. 이런 상태 관리 Hook은 useStae()
라고 부른다.function HomePage() {
React.useState()
}
useState
는 배열을 반환하고 배열 디스트럭처링을 사용하여 컴포넌트 안의 배열 값에 접근하고 사용할 수 있다.function HomePage() {
const [] = React.useState()
// ...
}
function HomePage() {
const [likes] = React.useState()
// ...
}
set
을 붙인다.function HomePage() {
const [likes, setLikes] = React.useState()
// ...
}
likes
의 초기값을 0으로 정할 수 있다.function HomePage() {
const [likes, setLikes] = React.useState(0)
}
function HomePage() {
// ...
const [likes, setLikes] = React.useState(0)
return (
// ...
<button onClick={handleClick}>Like({likes});</button>
)
}
handleClick()
함수 안에서 상태 업데이트 함수 setLikes
를 호출 할 수 있다.function HomePage() {
// ...
const [likes, setLikes] = useState()
function handleClick() {
setLikes(likes + 1)
}}
return (
<div>
{/* ... */}
<button onClick={handleClick}>Likes ({likes})</button>
</div>
)
}
handleClick
함수를 호출한다. 이 함수는 likes + 1 단일 인수를 사용하여 setLikes
상태 업데이트 함수를 호출한다.props
와 달리 state
는 컴포넌트 안에 저장한다. state
상태 정보를 props
로 자식 컴포넌트에 전달할 수 있지만 state
상태를 업데이트하는 로직은 처음 생성된 state
컴포넌트 안에서 유지되어야한다.Managing State
How to continue learning Reat
Getting Started with Next.js
import { useState } from 'react'
function Header({ title }) {
return <h1>{title ? title : 'Default title'}</h1>
}
function HomePage() {
const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton']
const [likes, setLikes] = useState(0)
function handleClick() {
setLikes(likes + 1)
}
return (
<div>
<Header title="Develop. Preview. Ship. 🚀" />
<ul>
{names.map(name => (
<li key={name}>{name}</li>
))}
</ul>
<button onClick={handleClick}>Like ({likes})</button>
</div>
)
}
https://nextjs.org/docs/upgrading#minimum-nodejs-version
https://beta.reactjs.org/learn/adding-interactivity
https://beta.reactjs.org/learn/managing-state
https://beta.reactjs.org/learn
Development and Production Environments
What is Compiling?
What is Minifying?
What is Bundling?
What is Code Splitting?
pages./
디렉토리 안의 각 파일은 빌드 단계에서 자바스크립트 번들로 자동적으로 코드를 분할한다.Build Time and Runtime
Client and Server
What is Rendering?
getServerSideProps
getStaticProps
What is the Network?