리액트가 무엇인지는 다른 포스팅인 https://velog.io/@dlife/react.js-react-dom-react-native 이것을 참고하고
본 포스팅에서는 최대한 짧고 간략하게 react 핵심 기능들을 요약하도록 하겠다.
package.json
파일의 dependencies에 들어있다.
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
root.render(<App />);
사용자 지정 element 떄문에.App.js
파일에 있는 내용을 return 하고 렌더링 한다. (아래 사진) function Todo() {
return (
<div className="card">
<h2>Learn React</h2>
<div className="actions">
<button className="btn">Delete</button>
</div>
</div>
);
}
export default Todo;
import Todo from "./component/Todo";
function App() {
return (
<div>
<h1>My Todos</h1>
<Todo text="aaaaaaaaaaaaaaa" />
<Todo text="bbbbbbbbbbbbb" />
<Todo text="cccccccc" />
</div>
);
}
export default App;
function Todo(props) {
return (
<div className="card">
<h2>{props.text}</h2>
<div className="actions">
<button className="btn">Delete</button>
</div>
</div>
);
}
export default Todo;
아래 코드를 보면 button 부분에 onClick 부분이 추가됐다. 추가한 목적은 해당 버튼을 눌렀을때 어떠한 동작을 실행하게 하려는 것이다. 나는 눌렀을떄 콘솔이 뜨게 해보겠다.
return 문 위에 바로 js 함수를 작성한다. (jsx 코드이고, 컴포넌트이지만, 자바스크립트 함수와 똑같이 작성 할 수 있다.)
주의할 점은 동적 표현식을 사용할떄 이벤트로 사용하려고 할 떄에는 함수 이름만 넣어야 하는것이다. 만약 ()를 추가해 함수를 실행한다면, js와 react가 실행될떄 같이 실행될 것이다.
그리고 동적 표현식에서 화살표 함수도 역시 가능하다. onCilck = ()=>{...}
function Todo(props) {
function deleteHandler() {
console.log("clicked here");
}
return (
<div className="card">
<h2>{props.text}</h2>
<div className="actions">
<button className="btn" onClick={deleteHandler}>
Delete
</button>
</div>
</div>
);
}
export default Todo;
해당 상태에 따라서 각각의 동작을 정해줄 떄 사용.
import { useState } from "react";
import Modal from "./Modal";
import Backdrop from "./Backdrop";
function Todo(props) {
const [modalIsOpen, setModalIsOpen] = useState(false);
function deleteHandler() {
setModalIsOpen(true);
}
return (
<div className="card">
<h2>{props.text}</h2>
<div className="actions">
<button className="btn" onClick={deleteHandler}>
Delete
</button>
</div>
{modalIsOpen ? <Modal /> : null}
{modalIsOpen && <Backdrop />}
{/* /* 위와 똑같음. 양쪽 모두 참이면 두번쨰 값을 반환*/}
</div>
);
}
export default Todo;
그니까 내 식대로 다시 정리하자면 이렇다.
- state는 무언가 상태가 변할때 쓰는 것이고,
그걸 useState를 이용해서 하는 것이다. 여기엔 2개 인자가 들어가는데 위에 보이는 것처럼, 초기값과 업데이트 해주는 함수다.
그리고 이 상태 변화를 리액트에서 어떻게 사용하냐면 , 변수에 값을 재할당하는 방식이 아니라,
컴포넌트를 재평가하는 방식으로 한다.- 그러면 재평가가 어떻게 되느냐하면은, 좀전에 말한 useState의 두번쨰 인자인 setTitle함수를 실행하면 된다. 예를들어 우리가 만든 사용자 정의 컴포넌트함수에서 setTitle을 넣어둔다면 그 사용자 정의 함수가 실행될때 setTitle 함수가 실행될 것이고, 그렇다면 setTitle이 포함된 컴포넌트 전체가 재 평가 되는것이다.
바로 아래코드에서 Todo.js 스크립트에서 처럼 사용할 수 없다.
function Todo(props) {
const [modalIsOpen, setModalIsOpen] = useState(false);
function closeModalHandler() { // 이 함수를 Backdrop.js에 전달 할 것임.
setModalIsOpen(false);
}
return(
<button className="btn" onClick={deleteHandler}> // 사용 가능
Delete
</button>
{modalIsOpen && <Backdrop onClick={closeModalHandeler} />} // 사용 불가능
);
5--1.
그래서 Todo.js 가 아니라 Backdrop.js 안에 있는 함수형 컴포넌트에서 정의해줘야한다.
아래 보이는 Backdrop.js에서 div 안의 onClick은 우리가 만든게 아니라 내장형 컴포넌트인 div안에 있기 때문에 이벤트 리스너인 onClick을 사용할 수 있다. 그리고 거기에 props로 받은 closeModalHandeler 함수를 value로 넣어준다.
function Backdrop(props) {
return <div className="backdrop" onClick={props.onCancel} />;
}
export default Backdrop;
function Modal(props) {
function cancelHandler() {
props.onCancel();
}
function confirmHandler() {
props.onConfirm();
}
return (
<div className="modal">
<p>Are you sure?</p>
<button className="btn btn--alt" onClick={cancelHandler}> // onClick은 내가 만든 컴포넌트가 아니라 내장 컴포넌트라 이름을 변경할 수 없음.
Cancle
</button>
<button className="btn" onClick={props.onConfirm}>
// <button className="btn" onClick={props.onConfirm}> >> 이렇게도 사용 가능함
Confirm
</button>
</div>
);
}
export default Modal;
요약하자면 , props는 재사용 가능한 컴포넌트를 만들 때 중요하고
state는 화면에 보이는 내용을 다이나믹하게 바꿀 때 아주 중요하다. 예를 들어 element를 추가하거나 제거하거나 화면에 보이는 텍스트를 변경하거나 이번처럼, 화면에 보이는 오버레이를 열고 닫을 때 특히.
그런데 이렇게 useState를 나누는것보다 객체 하나로 한개의 state처럼 관리 할 수 있다.
여기서 문제가 생길 수 있다. 동시에 수많은 상태 업데이트를 계획한다면 오래되었거나 잘못된 상태 스냅샷에 의존할 수도 있다.
상태 업데이트가 이전 상태에 의존하고 있다면 아래와 같은 함수의 형태를 사용해야한다. 해당 접근 방법을 사용한다면, 리액트는 이 안에 있는 함수에서 이 상태 스냅샷이 가장 최신 상태의 스냅샷이라는 것과 항상 계획된 상태 업데이트를 염두에 두고 있다는 것을 보장해준다.
react란?
react component와 특징.
그리고 그걸 사용하려면 어떻게 해야함?
그러면 리액트 컴포넌트에서 jsx 코드 사용하는 방법은 뭐야?
그리고 그런 표현식을 뭐라고 하지?
리액트에서 이벤트란?
그것의 사용방법은 무었이며
그것이 일반적인 HTML의 이벤트와 다른점은 무엇인가.
리액트 훅이 뭐야?
그리고 그건 어디에 쓰는거고 어떻게 사용하는건데?
useState가 뭐야?
js에서 && 연산자는 무엇이고 어떤 동작을 해?