728x90
vscode확장 프로그램_ES7+ React/Redux/React-Native snippets
단축어로 코드를 자동완성 해주는 확장프로그램이다. 아래 단축키정도는 알고 작성을 하면 컴포넌트 형식을 자동완성 ㄱ시켜 편리하게 작업할 수 있다.
// rcc -> React 클래스 component 생성
import React, { Component } from 'react'
export default class index extends Component {
render() {
return (
<div>index</div>
)
}
}
// rafc -> 화살표 함수 컴포넌트 작성과 동시에 export
import React from 'react'
export const index = () => {
return (
<div>index</div>
)
}
// rafce -> export가 분리된 화살표 함수 컴포넌트가 생성
import React from 'react'
const index = () => {
return (
<div>index</div>
)
}
export default index
React 라이브러리
React 라이브러리 설치
- npx create-react-app [폴더명]
- 예) npx create-react-app test
라이브러리 사용하기 전 정리
- npx create-react-app exam으로 다운로드한 리엑트 라이브러리이다. 해당 구성 중, 우리가 작업에 필요한 파일만 남겨놓으면 된다.
- public 폴더
- 정적파일을 보관하는 폴더이다.
- 해당 폴더에서는 한 개의 index.html 외에 필요한 파일은 없으니 정리해서 작업하도록 하자.
- html이 한 개만 존재하는 이유는 SPA로 작업을 진행하기 때문이다.
- src 폴더
- 페이지와 컴포넌트 폴더를 만들어서 프로젝트를 구성하는 폴더이다.
React 라이브러리_사용예시
React 라이브러리를 설치받아 필요한 파일만 살려서 작업을 진행하였다. 사용한 파일은 "App.js, App.css, index.js" 와 "component / Mycom.jsx, Mycom3.jsx", "pages/Main.jsx", "public/index.html"이다.
라이프사이클을 간단하게 보여주는 페이지는 Mycom의 컴포넌트와 연결해서 사용하고, useState와 useEffect를 사용하는 페이지는 Mycom3의 컴포넌트와 연결해서 보도록 한다.
#. 폴더의 경로는 다음과 같다.
💙 라이프사이클 예시_componentDidMount / componentDidUpdate
1. Mycom.jsx_라이프사이클을 확인할 수 있는 함수를 생성한다.
- componentDidMount: 컴포넌트가 초기에 생성되면 동작하는 함수이다.
- componentDidUpdate: 컴포넌트의 상태가 변화되면 동작하는 함수이다.
- "상태변환" 버튼을 클릭하면 state의 num 값이 +1 되므로, 콘솔에서 componentDidUpdate 함수가 동작하는 것을 확인할 수 있다.
import { Component } from "react";
class Mycom extends Component {.
constructor(props) {
// super : 부모의 생성자 함수를 호출 해줘야 this를 사용할 수 있다.
super(props);
this.state = {
num: 0,
};
}
// 컴포넌트가 초기에 생성되면
// constructor -> render -> componentDidMount
componentDidMount() {
console.log("나 생성");
}
// componentDidUpdate: 컴포넌트의 상태가 변화되면 상태변환 후, componentDidUpdate
componentDidUpdate() {
console.log(this.props.name + "인데 나 상태 변함 리렌더링");
}
render() {
return (
<div className={"com " + this.props.Cname}>
{this.props.name}
<button
onClick={() => {
this.setState({ ...this.state, num: (this.state.num += 1) });
}}
>
상태 변함
</button>
</div>
);
}
}
class Mycom2 extends Component {
render() {
return <div>안녕 컴포넌트 2</div>;
}
}
// 다수의 컴포넌트를 내보낼 경우
export { Mycom, Mycom2 };
2. Main.jsx_Mycom.jsx의 컴포넌트를 받아 화면에 render 한다.
import { Component } from "react";
import { Mycom, Mycom2 } from "../components/Mycom";
export default class Main extends Component {
render() {
return (
<>
메인 페이지 <br />
<Mycom name="이름이" Cname="red" />
<Mycom2 />
</>
);
}
}
💙 useState / useEffect _ 예시
useState
- 함수형 컴포넌트에서 상태값을 관리할 수 있게 해 준다.
- 상태 값을 만들어주고, 수정할 때 사용하는 메소드를 만들어준다.
- 기본구조
- 배열의 비구조화 문법을 이용해 받기 때문에 state와 setState의 이름은 임의로 정할 수 있다.
- 첫 번째 반환값: 상태변수 / 두 번째 반환값 : 상태변수를 업데이트할 setState 함수
- 매개변수로 전달한 값이 초기값이다.
const [state, setState] = useState(initialState)
useEffect
- 라이프사이클을 지원해 주는 함수이다.
- 기본구조
- 첫 번째 매개변수: 수행하고자 하는 작업
- 두 번째 매개변수: 배열, 배열 안에서 검색하고자 하는 특정 or 빈 배열
- 보통 컴포넌트 state 값이 들어가는데 배열에 포함된 값이 변경되었을 때 해당 useEffect가 실행된다.
- 빈 배열을 넣는 경우, 컴포넌트가 처음 렌더링될 때, mount 될 때만 실행된다.
- 배열을 생략 시, 리렌더링 될 때마다 실행된다.
- useEffect는 필요한 만큼 만들어도 된다.
import React, { useEffect } from 'react';
useEffect(() => {
console.log('마운트 될 때만 실행된다.');
}, []);
useEffect(() => {
console.log('렌더링 될 때 마다 실행된다.');
});
1. Mycom3.jsx_라이프사이클을 확인할 수 있는 함수를 생성한다.
- "클릭" 버튼 클릭 시, num의 값이 1씩 증가한다.
- "활성화/비활성화" 버튼 클릭 시, active의 값이 true, false로 토글 된다.
import React, { useEffect, useState } from "react";
const Mycom3 = ({ newNum, newNum2, newNum3 }) => {
// count 변수 선언
// 다시 리렌더링되면 코드를 다시 실행시키는 과정(리렌더링)에서 변수가 다시 선언되어 다시 0의 값을 갖는다.
// 따라서 값을 계속 사용해야 한다면 상태값으로 보관을 해야한다.
let count = 0; // 따라서 count의 값은 계속 0일 것이다
const [num, setNum] = useState(0);
const [active, setActive] = useState(false);
// useEffect 라이프사이클 함수
// 처음 렌더링 될 때 실행되는 함수
useEffect(() => {
console.log("componentDidMount");
}, []);
// 처음 렌더링 되거나, num 값이 수정되면 실행되는 함수
useEffect(() => {
// num이 변경된 경우에는 이 업데이트 함수만 실행된다.
// 제어문을 사용해서 만들어주면 componentDidUpdate만을 사용할 수도 있다.
console.log("componentDidMount, componentDidUpdate");
console.log("나눈 num");
// componentDidUpdate: 상태가 변환 이후의 값을 사용하는 라이프사이클 함수
console.log("상태값", num);
}, [num]);
// 처음 렌더링 되거나, active 값이 수정되면 실행되는 함수
useEffect(() => {
// active이 변경된 경우에는 이 업데이트 함수만 실행된다.
console.log("나는 active");
}, [active]);
// 처음 렌더링 되거나, num이나 active 값이 수정되면 실행되는 함수
useEffect(() => {
// num이나 active 둘 중 하나라도 변경이 되면 업데이트
console.log("num이나 active가 변경됐어");
}, [num, active]);
// 클릭 시, num의 값이 1씩 증가한다.
function clickHandler() {
console.log("클릭함");
// 상태를 변경. 상태가 변경되므로 componentDidUpdate가 실행된다.
// 상태 값을 사용하는 이유
// 이전의 상태 값이 보관이 된다. == 상태값이 계속 유지가 된다.
setNum(num + 1);
count++;
console.log("변수", count);
// ❗ 실수가 많으니까 주의하자!
// 상태 값을 수정하고 바로 값을 사용하면 안된다. componentDidUpdate가 실행된 후에 사용해야한다.
// console.log("상태값", num);
}
// 클릭 시 active 값이 true, false로 토글된다.
function activeHandler() {
setActive(!active);
}
return (
<div>
<button onClick={clickHandler}>클릭</button>
<button onClick={activeHandler}>활성화/비활성화</button>
</div>
);
};
export default Mycom3;
2. Main.jsx_Mycom3.jsx의 컴포넌트를 받아 화면에 render 한다.
import { Component } from "react";
import Mycom3 from "../components/Mycom3";
export default class Main extends Component {
render() {
return (
<>
메인 페이지 <br />
<Mycom3 newNum={1} newNum2={2} newNum3={3} />
</>
);
}
}
처음 페이지 렌더 시, 나오는 콘솔메시지
"클릭"버튼 클릭 시, 나오는 콘솔메시지
"활성화/비활성화"버튼 클릭 시, 나오는 콘솔메시지
Hooks
- React에서 기존에 사용하던 클래스 컴포넌트를 사용할 필요 없이, 함수형 컴포넌트에서도 state와 여러 react 기능을 사용할 수 있도록 만든 라이브러리이다.
Hooks 사용규칙
💡 같은 Hook을 여러 번 호출할 수 있다.
export default function App(){
const [value1, setValue1] = useState()
const [value2, setValue2] = useState()
return {
<div>
<div>{value1}</div>
<div>{value2}</div>
</div>
}
}
💡 비동기 함수(async)는 콜백함수로 사용할 수 없다.
export default function App(){
// useEffect Hook 내부에, 비동기 함수가 들어가므로 에러 발생
useEffect(async () => {
await Promise.resolve(1)
}, [])
return {
<div>
<div>Test</div>
</div>
}
}
Hooks 종류
- useState : 컴포넌트의 state를 관리할 수 있다.
- useEffect : 렌더링 이후에 실행할 코드를 만들 수 있다. 어떤 변수가 변경될 때마다, 특정기능이 작동하도록 할 수 있다.
- useContext : 부모컴포넌트와 자식 컴포넌트 간의 변수와 함수를 전역적으로 정의할 수 있다.
- useReducer : state 업데이트 로직을 reducer 함수에 따로 분리할 수 있다.
- useRef : 컴포넌트나 HTML 요소를 레퍼런스로 관리할 수 있다.
- forwardRef : useRef로 만든 래퍼런스를 상위 컴포넌트로 전달할 수 있다.
- useImperativeHandle : useRef로 만든 래퍼런스의 상태에 따라, 실행할 함수를 정의할 수 있다.
- useMemo, useCallback : 의존성 배열에 적힌 값이 변할 때만 값, 함수를 다시 정의할 수 있다. (리렌더링 시 정의 안 함)
- useLayoutEffect : 모든 DOM 변경 후, 브라우저가 화면을 render 하기 전에 실행되는 기능을 정할 수 있다.
- useDebugValue : 사용자정의 Hook의 디버깅을 도와준다.
728x90
'블록체인_9기 > 🩵 React' 카테고리의 다른 글
48강_230706_React(Hook 함수(useNavigate, useLocation, useParams, useSearchParams), 상점 사이트 제작 ) (0) | 2023.07.06 |
---|---|
47강_230705_React(Router, 가위바위보 제작) (0) | 2023.07.05 |
45강_230703_React(babel, WebPack) (0) | 2023.07.03 |
44강_230629_React(import/export, 조건부 렌더링, React 라이브러리 다운로드, 토글버튼 구현, 댓글등록 구현) (0) | 2023.06.29 |
43강_230628_React(React?, Component, Babel, JSX문법, react 생명주기) (0) | 2023.06.28 |