-
๐ React ๊ณต๋ถํ๊ธฐ | React ์ค๋น์ด๋, ES6 & JSX๋ฆฌ์กํธ 2020. 11. 25. 20:33
React
๋ฆฌ์กํธ ๊ณต์ ํํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ๋ฆฌ์กํธ๋ '์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ๋ผ๊ณ ๋์์๋ค.
์นํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
1. html, css ํ์ผ์ ๋ง๋ค๊ณ javascript๋ก ๋์ ์ธ ์ก์ ์ ๋ฃ์ด์ ๋ง๋๋ ๋ฐฉ๋ฒ
2. vue, react, angular ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ
์นํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉ์๋ค๊ณผ ์ํธ์์ฉ์ ํ๊ฒ ๋๋ฉด์ ๋ง์ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ๊ฒ ๋๋ค.
๋ง์ฝ, ์ฌ์ฉ์๊ฐ ํ๋กํ ๊ด๋ฆฌ์์ ํ๋กํ ์ฌ์ง์ ๋ฐ๊พผ๋ค๊ณ ํ์. ๊ทธ๋ผ ์๋์ ๊ฐ์ ๊ณผ์ ์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
1. ๋ฐ๊ฟ ์ด๋ฏธ์ง DOM์ ์ฐพ๋๋ค.
2. ์ด๋ฏธ์ง DOM์ ์์ค๋ฅผ ์๋ก์ด ์ด๋ฏธ์ง๋ก ๋ฐ๊ฟ์ค๋ค.
3. ๋ฐ๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ๋ค์ ๋ ๋๋งํด์ค๋ค.
์ด๋ ๊ฒ ๋ฒํผ์ ํ๋๋ฅผ ๋๋ ์ ๋, ํ๋กํ์ ์ํ๊ฐ ๋ฐ๋๊ฒ ๋๋ค. ๋ฌผ๋ก ์ ์ ๊ฐ ์ฌ๋ฌ๋ช ์ด ์๋๋ผ๋ฉด html, css๋ง์ ๊ฐ์ง๊ณ DOM์ ์ง์ ์กฐ์ํ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ด๋ฆฌํด์ผ ํ ์ํ๊ฐ ํ๋๋ง์ด ์๋๋ผ๋ฉด, ๋ ์ ์ ๊ฐ ๋ง์์ง๋ค๋ฉด html,css๋ง์ ๊ฐ์ง๊ณ ์ํ๊ด๋ฆฌ๋ฅผ ํ๋๋ฐ๋ ํ๊ณ๊ฐ ์ฌ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ณต์กํ DOM ๊ด๋ฆฌ์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๊ฒ ๋์์ฃผ๊ธฐ ์ํด ๋์จ ๊ฒ์ด vue, react, angular ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
React์ ์ฅ์
React ๋ฅผ ๋ฐฐ์ฐ๋ฉด ๋์ค์ React-Native๋ก ์ฑ์ ๊ฐ๋ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ๋ฆฌ์กํธ ํ๋๋ก ์น๊ณผ ์ฑ ๋๊ฐ์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
1. Component
๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ผ๋ ๊ฒ์ ์ง์คํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ปดํฌ๋ํธ๋ ํ๋์ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์ฝ๋์ด๋ค.
div, li ์ ๊ฐ์ ํ๊ทธ๋ค์ ํ๋์ ์ปดํฌ๋ํธ๋ก ๋ณผ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ html ์ฝ๋๊ฐ ์๋ค.
<div class="tweet"> <span class="userId">@wow</span> <div class="contents">hello, my name is wow </div> <div class="time"> 10 seconds ago </div> </div>
์์ ์ฝ๋๋ฅผ react๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
<Tweet userId="wow" time="43"> hello, my name is wow </Tweet>
์ฌ๊ธฐ์ <Tweet> ์ด๋ผ๋ html ํ๊ทธ๋ ์กด์ฌํ์ง ์๋๋ค. ํ์ง๋ง Tweet์ด๋ผ๋ ํ๊ทธ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด <Tweet> ์ด ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๋ ์ฝ๋๋ฅผ ๋น๊ตํ๋ฉด, ํ์คํ ์๋์ ์ฝ๋๊ฐ ์ง๊ด์ ์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ <Tweet>์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ฑ๋ ๊ต์ฅํ ๋๋ค.
๋ฆฌ์กํธ์์๋ ์ด๋ ๊ฒ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐ์ ์งํํ๋ค.
2. ES6
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ES6 ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ ์๋ค.
import React, {component} from "react" class HelloWorld extends Component{ constructor(props){ super(props) this.state = {...} } render(){ return ( <div> <h1> hello, React </h1> </div> ) } }
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์์์ผ ํ๋ ES6์ ์ถ๊ฐ๋ 7๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ค.
Destructuring (๊ตฌ์กฐ ๋ถํด ํ ๋น)
๊ตฌ์กฐ ๋ถํด ํ ๋น ๊ตฌ๋ฌธ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ํผ์ณ์ ๊ทธ ๊ฐ์ ๊ฐ๋ณ ๋ณ์์ ๋ด์ ์ ์๊ฒ ํ๋ ํํ์์ด๋ค.
๋ฐฐ์ด์์ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ฌ์ฉํ ๋์๋ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์ฌ๋ฌ๊ฐ์ ๋ณ์๋ฅผ ํ ๋นํ ์ ์๋ค.
let [a, b] = [10, 20];
a,b ์ ์์๋๋ก 10, 20 ์ด๋ผ๋ ์ซ์๊ฐ ํ ๋น๋๊ฒ ๋๋ค.
๊ฐ์ฒด์์ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ฌ์ฉํ ๋์๋ ๊ฐ์ฒด ์์ ํค์ด๋ฆ์ผ๋ก ๋ณ์๋ฅผ ํ ๋นํ ์ ์๋ค.let obj = {p:42, q:true}; let {p, q} = obj; console.log(p); //42 console.log(q); //true
Spread operator(์ ๊ฐ ๊ตฌ๋ฌธ)
Spread ์ฐ์ฐ์๋ ...์ ์ฌ์ฉํ๋ ์ ๊ฐ ๊ตฌ๋ฌธ์ด๋ค. Spread ์ฐ์ฐ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํด๋ฅผ ํด์ผํ๋ค.
let numbers = [1,2,3]; console.log(Math.max(numbers));
numbers๋ผ๋ ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ์๋ฅผ ์ฐพ๊ณ ์ถ๋ค. ํ์ง๋ง Math.max๋ ์ธ์๊ฐ์ผ๋ก ์ซ์ ํ์ ๋ง ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ๋ธ๋ค.
์ฌ๊ธฐ์ Spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ ์ ์๋ค.
let numbers = [1,2,3]; console.log(Math.max(...numbers));
๋ฐฐ์ด ์์ Spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Math.max์ ์ธ์๊ฐ์ผ๋ก ๋ฐฐ์ด์ด ์๋ 1,2,3 ์ซ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
Rest parameters
Rest ํ๋ผ๋ฏธํฐ๋ ํจ์์์ ์ธ์๊ฐ์ ๋ฐ์ ๋ ์ฌ์ฉํ ์ ์๋ค. ๋ช ๊ฐ์ ์ธ์๊ฐ ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๋ ์ํฉ์ด๋ผ๋ฉด ์ด ํ๋ฆฌ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ ์ ์๋ค.
function sum(...numbers){ return numbers.reduce((acc, cur) => { return acc + cur; }) }
Rest ํ๋ฆฌ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์๊ฐ ๋ฐฐ์ด๋ก ๋ํ๋๊ฒ ๋๋ค.
default parameter (Default ํ๋ผ๋ฏธํฐ)
defualt parameter๋ ๊ธฐ๋ณธ๊ฐ ๋งค๊ฐ๋ณ์์ด๋ค. ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ ํด์ค ์ ์๋ค.
function sum(a, b = 1){ return a + b } console.log(sum(5,2)); //7 console.log(sum(5)); //6
์ฒ์ default parameter๋ฅผ ์ดํดํ์ง ๋ชปํ์ ๋๋ ์ ์ด๊ฒ ํ์ํ์ง ๋ชฐ๋๋ค. ๊ทธ๋ฅ ' return a + b ๋ฅผ , return a + 1 ๋ก ์์ ํ๋ฉด ๋์ง ์์๊น' ๋ผ๊ณ ์๊ฐํ์๋ค. ํ์ง๋ง default parameter๋ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํด์ค๋ค. ๊ธฐ๋ณธ๊ฐ!!
๋ง์ฝ ๋งค๊ฐ๋ณ์ b์ ์ธ์๊ฐ์ด ๋ค์ด์จ๋ค๋ฉด b์ ๊ฐ์ด 2๋ก ๋ฐ๋๊ฒ ๋๋ค. ํ์ง๋ง console.log(sum(5))์ฒ๋ผ b๊ฐ undefined๊ฐ ๋ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ๊ฐ์ด ์ธ์๊ฐ์ด ๋๋ค. (b = 5)
arrow function
ํ์ดํ ํจ์๋ ๊ธฐ์กด ํจ์๋ฅผ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
const numbers = [1,2,3,4]; console.log(number.reduce((acc, cur) => acc + cur)); //10
function ํํ์ ๋ฐฐํด ๊ตฌ๋ฌธ์ด ์งง๊ณ , ํญ์ ์ต๋ช ํจ์๋ผ๋ ํน์ง์ด ์๋ค. ์ด ํจ์๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ ์ ๋ ์ ํฉํ๋ค.
for-of loopfor...of ๋ฌธ์ ๋ฐ๋ณต๊ฐ๋ฅํ ๊ฐ์ฒด์ ๋ํด์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆด ์ ์๋ค. for..in๋ฌธ์ {...}๋ฅผ ๋ ์ ์๋ค๋ฉด, for...of๋ฌธ์ [...]์ ๋ ์ ์๋ค.
let arr = ['a','b','c']; for (let value of arr){ console.log(value); } //"a" //"b" //"c"
3. JSX (์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ ๋ฌธ๋ฒ)
JSX๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ฆฌ์กํธ ์ฝ๋๋ฅผ ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ด๋ค. ๋ฐ๋์ ์ปดํฌ๋ํธ์์๋ JSX๋ฅผ return ํด์ฃผ์ด์ผํ๋ค.
import React, {component} from "react" class HelloWorld extends Component{ constructor(props){ super(props) this.state = {...} } render(){ return ( <div> <h1> hello, React </h1> </div> ) //-> JSX } }
html ํ๊ทธ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ ๋ฌธ๋ฒ์ผ๋ก html ํ๊ทธ์๋ ๋ค๋ฅด๋ค.
๊ทธ๋ผ JSX๋ฌธ๋ฒ์ด ํ์ํ ์ด์ ๋ ๋ฌด์์ผ๊น? ๋ง์ฝ JSX๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค.
React.createElement("div", {className : 'name'}...); React.createElement("p",{className : "content"}...);
JSX๋ฌธ๋ฒ์ด๋ ๋น๊ตํ์ ๋, ํจ์ฌ ๋ณต์กํ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. div, h1ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ createElement๋ก ๋งค๋ฒ ํ๊ทธ๋ฅผ ๋ง๋ค์ด ์ค์ผํ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ JSX๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ํจ์ฌ ์ฝ๋์ ๋ณต์ก๋๊ฐ ๋ฎ์์ง๊ณ , ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๋ค. JSX์ฝ๋๋ฅผ ์ฐ๋ฉด babel์ด๋ผ๋ ๊ฒ์ด JSX์ฝ๋๋ฅผ React.createElement๋ก ๋ณํ์ ํด์ค๋ค.
์ฃผ์์ฌํญ๋ ๋ช๊ฐ์ง ์๋ค.
1. ๋ฐ๋์ ํ๋์ ์๋ฆฌ๋จผํธ๊ฐ ๊ฒ์ ๊ฐ์ธ๊ณ ์์ด์ผํ๋ค.
//์๋ชป๋ ์ฝ๋ xxx <div> <h1>hello</h1> </div> <div> <h1>hello</h1> </div>
<div> <div> <h1>hello</h1> </div> <div> <h1>hello</h1> </div> </div>
ํ๊ทธ ์ ์ฒด๋ฅผ ํ๋์ <div> ํ๊ทธ๋ก ๊ฐ์ธ์ฃผ๊ณ ์๋ค. -> 0
2. JSX์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ์ฉํ ๋ { }์์ ์์ฑํด์ผํ๋ค.
import React, {component} from "react" class HelloWorld extends Component{ constructor(props){ super(props) this.state = {...} } render(){ const name = "wow"; return ( <div> <h1>{name}!</h1> </div> ) } }
name์ด๋ผ๋ ๋ณ์๋ฅผ {name}๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ๊ณ ์๋ค.
3. JSX ๋ด๋ถ์์๋ if ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. IIFE(์ฆ์ ์คํ ํจ์) or ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
<div> { (1 + 1 === 2) ? (<h1> ์ ๋ต </h1>) : (<h1> ํ๋ฝ </h1>) } </div>
4. ์๋ฆฌ๋จผํธ์ ํด๋์ค ์ด๋ฆ์ ์ง์ ํ ๋, class ๊ฐ ์๋ className ์ ์ฌ์ฉํ์ฌ์ผํ๋ค.
<div> <div className="hello"> <h1>hello</h1> </div> </div>
'๋ฆฌ์กํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ