13년도에 발표
페이스북에 의해 만들어짐
개발자로서 가장 중요한 자원은 바로 시간이다.
공부할 분야를 정해서 시간을 투자하는 것이기 때문에 앞으로의 성장 가능성이 있는 개발 언어를 정해서 공부하는 것이 중요하다.
큰 회사에서는 오늘은 React JS를 썼다가 내일은 Angular를 썼다가 할 수 없다.
왜냐하면 이럴 시간이 없기 때문이다.
그래서 안정적이고, 작동하는 것을 선택해야 한다.
기술은 도구를 고치기 위해 만들어진다.
그래서 기술이 고치려고 하는 문제를 이해하면 그 기술을 더 잘 이해할 수 있게 된다.
만약 우리가 뭔가를 배우는데, 이것이 어떤 문제를 해결하는지 이해하지 못한다면 해결하려는 문제를 직접 겪어보지 못한다면 그저 암기를 해야 할 것이다.
(바닐라 JS 코드와 React JS 코드를 비교해볼 것이다.)
React를 쓰는 이유?
React JS는 UI를 interactive하게 만들어준다.
<!DOCTYPE html>
<html lang="ko">
<body>
<span>Total clicks : 0</span>
<button id="btn">Click me</button>
<script>
let counter = 0;
const button = document.getElementById("btn");
const span = document.querySelector("span");
function handleClick(){
console.log("i have been clicked");
counter++;
span.innerText = `Total clicks : ${counter}`;
}
button.addEventListener("click", handleClick);
</script>
</body>
</html>
계속 가져와서 eventlistener를 달고, 함수를 만들고 또 만들면 점점 양이 많아져 혼란스러워질 수도 있다.
그래서 이 코드보다 더 좋은 방식을 보여주려고 한다.
React JS를 설치하기 위해서는 두 개의 Javascript 코드를 import 해야 한다.
react와 react-dom이다.
<!DOCTYPE html>
<html lang="ko">
<body>
</body>
<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>
</script>
</html>
react & react-dom을 import하기
react가 우리 코드에 있는 것이다.
React JS의 규칙 중 하나는 HTML을 이 페이지(body(?))에 직접 작성하지 않는다는 것이다.
HTML 코드를 직접 작성하지 않을 것이다.
그 대신, Javascript와 React JS를 이용하여 element를 생성할 것이다.
이건 정말 유용한데 나중에 왜 그런지 알게 될 것이다.
React JS -> 어플리케이션이 아주 interactive하도록 만들어주는 library이다.
react-dom -> library 또는 package인데 모든 React element들을 HTML body에 둘 수 있도록 해준다. react element를
<!DOCTYPE html>
<html lang="ko">
<body>
<div id="root"></div>
</body>
<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>
const root = document.getElementById("root");
// span을 페이지에 두어야 한다. -> (body)는 비어 있으니까
const span = React.createElement("span");
ReactDOM.render(span, root);
// 여기 React element를 가지고 HTML로 만들어 배치한다.
</script>
</html>
span이 root안에 생겼다!
createElement에는 우리가 더 작성할 수 있는 argument가 있다.
예를 들어, 두 번째 argument로 둘 수 있는 것은 span의 property들이다.
무엇이 span의 property가 될 수 있을까?
property는 class name이 될 수도 있고 id가 될 수도 있다.
<!DOCTYPE html>
<html lang="ko">
<body>
<div id="root"></div>
</body>
<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>
const root = document.getElementById("root");
const span = React.createElement("span", {id: "cute"});
ReactDOM.render(span, root);
</script>
</html>
root 안에 span에 id (cute) 부여하기
React JS에서는 모든 것이 Javascript로써 시작한다.
그 다음에 HTML이 되는 것이다.
이것이 바로 React JS 파워의 핵심이다.
우리는 HTML을 만들고, 찾아서 가져오고 그리고 나서 업데이트하고.. 이런 식으로 하지 않을 것이다.
React JS에게 "업데이트해야 하는 HTML"을 업데이트하라고 할 것이다.
이렇게 하는 유일한 방식은 Javascript에서 시작하고, HTML에서 끝나는 것이다.
버튼을 한 번 만들어 볼 것이다!
그래서 버튼에서 일어나는 event를 어떻게 감지하는지도 알아볼 것이다.
<!DOCTYPE html>
<html lang="ko">
<body>
<div id="root"></div>
</body>
<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>
const root = document.getElementById("root");
const h3 = React.createElement("h3", {
onMouseEnter: () => console.log("mouse enter"),
}, "Hello I'm a span" );
const btn = React.createElement("button", {
onClick: () => console.log("im clicked"),
}, "Click me");
const container = React.createElement("div", null, [h3, btn]);
// h3 & btn 둘 다 render 하고 싶으면? -> array를 두면 된다.
ReactDOM.render(container, root);
//ReactDOM은 container element를 root div 안에 render 할 것이다.
</script>
</html>
javascript에 XML을 추가한 확장한 문법이다.
위에 있는 createElement를 대체할 수 있는 방법에 대해 알아볼 것이다.
굳이 createElement를 대체하려는 이유는 개발자들에게 좀 더 편리한 도구를 사용하기 위해서이다.
그 편리한 도구가 JSX이다.
기본적으로 React 요소를 만들 수 있게 해주는데 HTML에서 사용한 문법과 흡사한 문법을 사용한다.
생긴게 HTML이랑 비슷해서, JSX로 React 요소를 만드는 게 개발자들 입장에서는 굉장히 편하다.
코드를 변환해 주는 녀석!이다.
JSX로 적은 코드를 브라우저가 이해할 수 있는 형태로 바꿔준다.
https://babeljs.io/
코드를 알맞게 바꾸어 준다.
const Title = (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
Hello I'm a span
</h3>
);
//위와 아래는 동일한 기능을 하는 코드이다.
const h3 = React.createElement("h3", {
onMouseEnter: () => console.log("mouse enter"),
}, "Hello I'm a span" );
<!DOCTYPE html>
<html lang="ko">
<body>
<div id="root"></div>
</body>
<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 src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
const root = document.getElementById("root");
const Title = (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
Hello I'm a span
</h3>
);
const Button = (<button style={{
backgroudColor: "tomato",
}} onClick={() => console.log("im clicked")}>
Click me</button>);
const container = React.createElement("div", null, [Title, Button]);
ReactDOM.render(container, root);
</script>
</html>
컴포넌트의 첫 글자는 반드시 대문자여야 한다.
만약 소문자면 React랑 JSX는 이게 HTML button 태그라고 생갈할 것이기 때문이다.
우리가 직접 만든 요소는 전부 대문자로 시작해야 한다.
Title, Button을 렌더링(?) 하고 싶은데 이걸 Container에 포함시키기 위해서는 Title과 Button을 함수로 만들어줘야 한다.
Title & Button을 포함시키기 위해서 함수로 만들어 줘야 한다.
<!DOCTYPE html>
<html lang="ko">
<body>
<div id="root"></div>
</body>
<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 src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
const root = document.getElementById("root");
// () => 쓰면 함수로 바뀌게 해주는 것. 이건 arrow function 이라고 부른다.
const Title = () => (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
Hello I'm a span
</h3>
);
const Button = () => (
<button style={{
backgroudColor: "tomato",
}} onClick={() => console.log("im clicked")}>
Click me</button>);
const Container = () =>
<div>
// Title & Button을 렌더링
<Title />
<Button />
</div>
ReactDOM.render(<Container />, root);
</script>
</html>