// const [writer, setWriter] = useState('');
// const [title, setTitle] = useState('');
// const [contents, setContents] = useState('');
const [inputs,setInputs] = useState({
writer:"",
title:"",
contents:""
})
const profile = {
name: "철수",
age: 12,
school: "다람쥐초등학교",
age: 13
console.log(profile) //{name: "철수", age: 13, school: "다람쥐초등학교"}
const profile = {
name: "철수"
}
const profile = {
event.target.id = "훈이"
}
profile[name] // 철수
profile[event.target.id] // 훈이
event.target.id
가 들어가면 안되고 변수로 봐야한다. 대괄호로 감싸줘야 한다.
class는 화면을 보여주는 기능이 없고 리액트가 제공하는 render를 통해 화면에 보여줄 수 있다.
render 사용을 위해너느 import {Component} from "react"
+ extends Component
해주어야 한다.
다중 상속 X
extends Component
를 통해 state
생성하고 this.setState
를 사용하여 state값을 바꿨고 render
를 통해 화면에 보여주었다. 18번째 줄 {this.state.count}
로 화면에 보여주었으나 onClickCountUp
을 하니 에러가 발생했다. -> this에 대한 이해가 필요하다.
리액트의 작동원리에서 html을 직접 만들지 않는다. 만드는 것은 javascript이고 화면에 보여지는 것은 html이다. 자바스크립트로 jsx가 Html이 만들어지는 방식이다.
window.onload = function() {...}
은 html 코드가 읽히고 나면 등록된 함수를 실행시켜줘!
counter를 만들고 counter 안에 있는 render를 실행시키면, 버튼이 만들어지고 안에 '클릭하세요', onClick 눌렀을때 등록이 되고 button이 자식으로 추가가 되어 화면에 나타난다.
this는 실행을 시킨 실행 주체에 따라서 동적으로 달라진다.
this.innerText
는 클릭하세요.
가 나온다.해결방법(this 고정 방법)
1. bind(this)
를 통해 여기서 지금 사용하고 있는 this를 onClickButton에 연결시킨다.
2. onClickButton을 화살표 함수
로 사용하면 된다.
Component 안에 기능이 내장되어 있어 이름이 반드시 동일해야 용도에 맞게 실행시켜준다.
componentDidMount() : 화면이 그려지고 나서 실행해라
- ex1) input 태그가 그려지고 input 태그에 focus가 깜박깜박하도록 실행
componentDidUpdate() : state를 올리면 바뀐 state로 화면이 리렌더(수정)되면 실행해라
- ex) state의 count가 5가 되었을 때 특정 알림을 준다
componentDidWillUnmount() : 페이지를 나갈 때 지금 컴포넌트가 사라지기 전에 실행해라
- ex) 채팅방을 나가기 버튼을 클릭했을 때 백엔드 api를 날려서 '철수가 나갔습니다.' 요청을 보낸다.
굳이 여기서 말고 아래 그림과 같이 만들면 되지 않을까?
결과 먼저 말하면 안된다. 이렇게 되면 채팅방 나가기 버튼을 눌러 나가는 것 이외에 상품을 보러 나가거나, 마이페이지로 이동하여 나가거나, 브라우저를 끄고 나갈 때 마다 모든 api를 요청해야 하므로 유지보수가 안된다.
따라서 눈 앞에서 페이지가 사라지게 되면 componentWillUnmount가 실행되고 사라지도록 한다.
state: 클래스형에서는 반드시 state로 쓰고 객체형태로 묶여져 있으나 함수형은 자유롭게 개별 state로도 사용 가능하다.
setState : 클래스형에서는 this.setState를 통해서 컴포넌트에서 상속을 받아 사용했었으나 함수형은 자유롭게 만들어서 사용한다.
Hook : 클래스형에서 Component에서 제공하는 기능들이 함수형에서는 hook으로 대체 되었다.
this : 함수형에서 this가 없어 state,setState를 바로 가져다 사용할 수 있고 클래스형처럼 바로 장착 되어 있는 것이 아니기 때문에 변수형으로 만들어줘야 한다.
Router 기능도 함수형에서는 바로 사용할 수 없고 useRouter를 가져와야 한다.
클래스형의 componentDidUpdate가 함수형의 useEffect로 대체되는데 약간 차이가 있다. componentDidUpdate는 처음에 실행 안되고 state가 변경되고 나서 실행인데, useEffect는 처음 실행되는 것도 변경으로 본다. 그렇기에 처음 실행되도 실행되고 변경되고 나서도 실행된다.
아래가 기본, 의존성 배열이 없기 때문에 아무거나 바뀌면 실행된다.
클래스형의 componentDidMount는 함수형의 useEffect에 조건을 달아서(의존성 배열) 실행한다
그리고 한 번만 실행되고 나서 뒤로는 실행되면 안되기 때문에 의존성 배열을 빈칸으로 둔다.
의존성 배열 안의 원소가 변경 되어야 실행되는데 없기 때문에 처음에만 실행되고 두 번째부터는 변경 없다.
componentWillUnmount는 이 컴포넌트가 사라질 때 실행시켜줘라고 등록을 시키는 것이다. 함수형 useEffect 안에서 return 에서 함수를 리턴하면 WillUnmount와 같이 등록이 된다.
처음 한 번만 등록하면 되기 때문에 의존성 배열에 빈값을 넣어준다.
위에 것을 하나의 useEffect로 합치게 되면 의존성 배열이 없기 때문에 한 번만 실행이 되고 의존성 배열이 바뀌어야 하는 변경되고 나서 실행은 따로 만들어줘야 한다.
useEffect 안에서 setState는 두 번 렌더링 되기 유지보수 차원에서 지양하는 것이 좋으나 물론 필요한 경우도 있다.
useEffect 안에서 setState 한 state를 의존성 배열에 들어간 경우, 바뀐 state가 또 들어가기 때문에 무한루프에 빠진다.
또는 useEffect에서 setState를 사용할 때 의존성 배열이 없으면 바뀔 때마다 useEffect가 실행되는 것인데, 바뀌면 useEffect 실행되므로 무한루프에 빠진다.
// useEffect의 잘못된 사용 예제(1. 추가렌더링, 2. 무한루프)
// 1. 추가 렌더링
useEffect(()=>{
setCount(prev=>prev+1)
},[count]);
// 2. 무한루프
useEffect(() => {
setCount(prev=>prev+1)
});
restapi 사용시 graphqlapi 요청 useQuery와 같은 역할을 한다.
react-query
라이브러리이다.