`한입 크기로 잘라 먹는 리액트(React.js)` 강의를 듣고 정리한 자료입니다
✨ 프로젝트 세팅
파일 생성
const DiaryEditor = () => {
return <></>;
};
export default DiaryEditor;
return <div className="DiaryEditor"></div>;
- 컴포넌트명과 최상위 태그인 div 클래스의 이름을 똑같이 맞춰준다
-> CSS 클래스를 활용해 스타일링할 경우 직관적으로 코드를 작성할 수 있다 (강사님의 방식)
사용
- 중심(?) 컴포넌트(강의에서는 App.js) 에 배치시켜야 사용이 가능하다!
-> 태그처럼 사용
-> ex) `<DiaryEditor />
- Auto Import 기능이 동작할 경우 알아서 임포트시켜주지만 동작하지 않을 수도 있으므로 import 꼭 확인할 것
-> import 컴포넌트명 from "경로";
✨ onChange
- 콜백 함수 전달
- 이벤트 `e` 매개변수 전달
- 값이 바뀌었을 때 수행하는 이벤트
- input 안에 왜 `value` 속성을 지정해야하나요?
-> input의 값을 쉽게 받아오기 위해 input 안에 `value` 값을 써주었다
- `value`를 사용했을 경우 왜 입력이 되지 않나요?
-> input 엘리먼트에 value 속성만 지정하면 value 속성으로 권한이 넘어가게 된다. 즉, 사용자의 입력으로 변화하는 것이 아닌, value에 들어온 값으로만 입력값이 변화하므로 아무리 사용자가 입력해도 input 안에 값이 입력되지 않는 것이다
-> 그래서 onChange 이벤트를 사용하는 것!
사용
- state + onChange
import { useState } from "react";
const DiaryEditor = () {
const [author, setAuthor] = useState(""); // 기본값 설정
return(
<div>
<input
value={author}
onChange={(e) => {
setAuthor(e.target.value);
}}
/>
</div>
);
};
1. import문
2. state 설정 (const [author, setAuthor] ...)
3. input에 value 속성 지정 (값 저장)
4. onChange 이벤트
-> author은 setAuthor로만 바꿀 수 있다
- input에 name={author} 처럼 따로 지정한 것도 불러올 수 있다
-> setAuthor(e.target.name);
- input 태그는 한 줄만 입력 받을 수 있으므로 여러 줄을 입력 받고 싶다면 `textarea` 사용
-> input 태그와 사용 방법이 똑같다
하나의 state로 묶기
- 동작이 비슷한 state는 하나의 state로 묶는 것이 효율적이다
const [state, setState] = useState({
author: "",
content: "",
});
// ... 중간 생략
value={state.author}
onChange={(e) => {
setState({
author: e.target.value,
content: state.content,
});
}}
1. input 태그 (혹은 textarea 태그) 안 value 속성 수정
2. (예시) setAuthor -> setState 값으로 변경
3. 객체 수정하기
-> spread 연산자를 활용할 것
...state,
content: e.target.value,
- 순서가 중요함!
- 원래 state를 먼저 펼쳐준 후 state를 바꿀 것
OnChange Handler 합치기
- 선택
- div -> select -> option
✨ 함수
- alert() : 경고창
- new Date() // 객체 생성
-> 현재 시간을 기준으로 생성
-> .getTime() : 시간을 받아서 milliseconds로 변환
-> 파라미터에 ms로 된 시간 쓰기 + .toLocaleString() : 2023.11.19. 오후~ 이런 식으로 나옴
✨useRef
- `current` 로 불러옴
- 아이디 값을 자동으로 증가시킬 때도 사용이 가능하다
아이디
1. useRef 호출
//ex
const dataId = useRef(0);
2. id 설정
//ex
id: dataId.current,
3. 증가
//ex
dataId.current += 1;
- focus 기능을 사용하기 위해서는 useRef가 필요하다 -> 리액트 기능이므로 react에서 import
import { useRef } from "react";
방법
const authorInput = useRef();
1. useRef 함수 호출
- authorInput 상수에는 React.MutableRefObject<undefined> 가 저장되게 된다.
- MutableRefObject : HTML 돔 요소에 접근할 수 있게 한다
2. return 문 안, 태그 안 변수 호출
- 변수 = { useRef() 담고 있는 변수 (ex, authorInput) }
- 강의에서는 텍스트에 포커스를 주므로 포커스를 주고 싶은 태그 (ex, input, textarea) 안에 변수를 선언해줬다
3. 선언
authorInput.current.focus();
- 변수.current.focus(); // 사용하고 싶은 기능
✨ 리스트 렌더링
- 렌더링 : 화면에 표시하는 것
map 이용
- return문에서 map으로 뿌리기
- map 관련 정리 자료 : https://ajeong7038.tistory.com/10
고유 키 값 설정
1. 최상위 태그 속성에 고유 키(아이디) 설정
<div key={it.id}>
// ... 내용
</div>
2. 기본 파라미터 사용
- map 함수의 기본 파라미터를 사용한다
- 배열의 몇 번째 요소를 순회하고 있는지 인덱스로 알려준다
{diaryList.map((it, idx) => (
// ... 내용
)};
- 수정, 삭제, 추가 시 인덱스에 문제가 생길 수 있으므로 고유한 아이디로 갖고 있을 경우 고유한 아이디로 키 값을 지정할 것
컴포넌트 트리
- 같은 레벨끼리는 데이터를 주고 받을 수 없다
- 단방향 데이터 흐름 : React는 단방향으로만 데이터가 흐른다
- 공통 부모와 `State`를 활용해 문제를 해결할 수 있다
- 추가, 수정, 삭제 같은 이벤트를 핸들링하는 setData 함수를 Props로 전달한다 (아래 -> 위) : 상태 변화 함수 호출
-> 데이터는 위에서 아래로, 이벤트는 아래서 위로
✨ window.confirm
사용
if(window.confirm(`${id}번째 일기를 정말 삭제하시겠습니까?`)){ }
- 대화 박스가 alert와 비슷하게 나오고, 확인 취소 버튼이 있다
✨ 데이터 수정
- 컴포넌트 트리에 전달되는 이름을 바꾸면 데이터를 전달 받는 트리에 대한 이름도 모두 바꿔줘야 한다
-> 이런 문제를 어떻게 해결할 수 있을까? (나중에 추가 예정_사유 : 아직 강의를 보지 않았다)
✨ Lifecycle
- 프로그램이 실행되고 종료되는 과정을 나타내기 위함
1. Mount
- 화면에 나타나는 것
- ComponentDidMount
2. Update
- 업데이트 (리렌더)
- ComponentDidUpdate
3. UnMount
- 화면에서 사라짐
- ComponentWillUnmount
Lifecycle 제어
- 예시
-> 1) 초기화 작업
-> 2) 예외 처리 작업
-> 3) 메모리 정리 작업
✨ React Hooks
- `State`와 같은 기능들은 함수형 컴포넌트를 사용하지 못하지만 키워드 `use`를 붙임으로써 함수처럼 불러와 사용할 수 있게 한다
- ex) useState, useEffect, useRef
- Class형 컴포넌트의 길어지는 코드 길이 문제로 중복 코드, 가독성 문제 등을 해결하기 위해 등장했다
✨ useEffect
- 파라미터 2개 (콜백 함수, 의존성 배열)
useEffect(()=>{
//todo... => 콜백 함수
}, []);
- useEffect의 두 번째 파라미터, 배열
-> Dependency Arrya (의존성 배열)
- 배열 내에 들어있는 값이 변화하면 콜백 함수가 수행
- unMount : 콜백 함수의 리턴 값으로 함수를 리턴
✨ 참고 자료
'FE > React' 카테고리의 다른 글
[React] S6 : React 기본 - 일기장 만들어보기 (2) (0) | 2024.01.09 |
---|---|
[React] 웹 제작 시 자주 쓰는 문법 정리 (0) | 2023.12.19 |
[React] S5 : React 입문 - State, Props (1) | 2023.11.14 |
[React] S4 : Node.js (0) | 2023.11.08 |
[React] S3: Javascript 응용 (2) (0) | 2023.11.07 |