서론
아래에 글은 참고 링크의 강의를 공부하며 overview한 내용입니다.
참고
react는 interactive를 위한 것.
워크스페이스 만들기
$ mkdir react-for-beginners
cd $_
touch index.html
요약
<script>
태그로 JS 코드를 추가할 수 있음. JS에서 document
는 웹 페이지를 나타내는 객체 모델(DOM, Document Object Model)의 최상위 객체로, 웹 페이지의 모든 요소에 대한 접근과 조작을 가능하게 해주는 객체임. document 객체는 다양한 속성과 메서드를 가지고 있기에 이를 이용하여 웹 페이지의 내용을 동적으로 조작할 수 있음..addEventListener()
의 첫번째 인자는 click
, mouseEnter
등 다양한 이벤트를 참조함.script
태그에 src 속성으로 url을 입력하여 설치할 수도 있음. (좋은 방법은 아님)목표
vanilla.html
<!DOCTYPE html>
<html>
<body>
<span>Total clicks: 0</span>
<button id="btn">Click me</button>
</body>
<script>
let counter = 0;
const button = document.getElementById("btn");
const span = document.querySelector("span");
function handleClick() {
counter += 1;
span.innerText = `Total clicks: ${counter}`;
}
button.addEventListener("click", handleClick)
</script>
</html>
확인
이 방법의 단점
이제 react로 작성해보자.
index.html
<!DOCTYPE html>
<html>
<body>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
</script>
</html>
react 설치 확인
요약
목표
vanilla.html
을 react로 작성해보자.react의 규칙 중 하나는 HTML을 index.html의 body 안에 직접 작성하지 않는다는 것. 대신에 javascript와 react를 사용해 element로 작성해야 함.
이제, react element를 작성해보자. 여기서 하는 방법은 좀더 근본적인 방법으로 이해를 위한 것이고 추후에는 좀더 쉬운 방법을 사용할 것임.
index.html
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
const root = document.getElementById("root");
const span = React.createElement(
"span",
{ id: "sexy-span", style: { color: "red"} },
"Hello I'm a span"
);
ReactDOM.render(span, root);
</script>
</html>
React.createElement()
의 인자는 만들려는 html의 태그 이름과 일치해야 함.ReactDOM.render()
는 react element를 가지고 html에 배치한다는 것. 즉, 사용자에게 보여준다는 것. 이 함수의 첫번째 인자로 span
을, 두번째 인자로 root
를 넣어서 span
엘리멘트를 root
에 뿌려주자는 것. 여기서 root
는 html body 에서 id가 root
인 div 태그를 말하며 우리가 body 에 적는 유일한 태그가 될 것임. 이런 root
에 대해 react는 const를 만들어서 사용한 것.React.createElement()
의 두번째 인자에는 첫번째 인자로 들어간 해당 tag의 property를 넣을 수 있음. 예를 들면, id나 className이 있음. style color 도 추가해보자. 세번째 인자는 해당 태그의 내용이 됨.확인
이 예제의 의미
요약
목표
index.html
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
const root = document.getElementById("root");
const h3 = React.createElement(
"h3",
{
id: "title",
onMouseEnter: () => console.log("mouse enter"),
},
"Hello I'm a span"
);
const btn = React.createElement(
"button",
{
onClick: () => console.log("im clicked"),
style: {
backgroundColor: "tomato",
}
},
"Click me"
);
const container = React.createElement("div", null, [h3, btn])
ReactDOM.render(container, root);
</script>
</html>
container
element를 만들고 여기에 세번째 인자인 content로써 render할 element들을 array로 넣어준 뒤 이 container
element를 ReactDOM.render() 의 첫번째 인자로 활용하자.btn
에 대한 React.createElement() 함수의 두번째 인자로 property를 줄 수 있다고 했는데 여기에 함수를 넣어서 클릭 시에 동작할 수 있도록 하자. 그리고 이 property에서 tag에 들어갈 property는 render된 HTML에 보이지만 on+이벤트의 경우에는 eventlistener인 것을 알고 HTML에 보여주지 않음.확인
복습
요약
목표
JSX에 대해
이제, JSX로 h3 엘리멘트를 대체해보자.
index.html
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.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 h3 = React.createElement(
"h3",
{
id: "title",
onMouseEnter: () => console.log("mouse enter"),
},
"Hello I'm a span"
);
*/
const Button = (
<button
style={{
backgroundColor: "tomato",
}}
onClick={() => console.log("im clicked")}
>
Click me
</button>
)
/*
const btn = React.createElement(
"button",
{
onClick: () => console.log("im clicked"),
style: {
backgroundColor: "tomato",
}
},
"Click me"
);
*/
const container = React.createElement("div", null, [Title, Button])
ReactDOM.render(container, root);
</script>
</html>
요약
목표
index.html
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.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 h3 = React.createElement(
"h3",
{
id: "title",
onMouseEnter: () => console.log("mouse enter"),
},
"Hello I'm a span"
)
*/
const Button = () => (
<button
style={{
backgroundColor: "tomato",
}}
onClick={() => console.log("im clicked")}
>
Click me
</button>
)
/*
const btn = React.createElement(
"button",
{
onClick: () => console.log("im clicked"),
style: {
backgroundColor: "tomato",
}
},
"Click me"
);
*/
const Container = () => (
<div>
<Title />
<Button />
</div>
);
/*
const container = React.createElement("div", null, [Title, Button])
*/
ReactDOM.render(<Container />, root);
</script>
</html>
일반 function 과 arrow function 차이
const Title = () => (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>Hello I'm a span</h3>
);
function Title() {
return (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
Hello I'm a span
</h3>
);
}
실제 랜더링된 babel 부분 보기
실제 렌더링된 head 부분 보기