웹 사이트를 만들다 보면 화면에 보일 수 있는 데이터를 서버에서 받아오기도 해야 하고, state가 바뀔 때마다 함수를 실행시키거나, 이벤트 리스너를 달았다가 해제하는 등의 동작이 필요할 수 있다. useEffect hook은 바로 이럴 때 유용하게 쓸 수 있다.
//Class.js
import React, {Component} from 'react';
export default class PageTitle extends Component {
constructor(props) {
super(props);
this.state = {
name: ''
};
}
componentDidMount() {
document.title = this.state.name;
}
componentDidUpdate() {
document.title == `Hi, ${this.state.name}`;
}
render() {
return (
<div>
<p>Use the input field below to rename this page!</p>
<input
onChange={({target}) => this.setState({ name: target.value })}
value={this.state.name}
type='text' />
</div>
);
}
}
//Function.js
import React, {Component} from 'react';
export default class PageTitle extends Component {
constructor(props) {
super(props);
this.state = {
name: ''
};
}
componentDidMount() {
document.title = this.state.name;
}
componentDidUpdate() {
document.title == `Hi, ${this.state.name}`;
}
render() {
return (
<div>
<p>Use the input field below to rename this page!</p>
<input
onChange={({target}) => this.setState({ name: target.value })}
value={this.state.name}
type='text' />
</div>
);
}
}
componentDidMount()``componentDidUpdate()
로 구분해서 세팅된 것이 함수형에서는useEffect()
로 한번에 처리할 수 있어 효율적이다.import React, {useEffect} from 'react';
import React, { useState, useEffect } from 'react';
function PageTitle() {
const [name, setName] = useState('');
useEffect(() => {
document.title = `Hi, ${name}`;
});
return (
<div>
<p>Use the input field below to rename this page!</p>
<input onChange={({target}) => setName(target.value)} value={name} type='text' />
</div>
);
}
() => { document.title = name; }
가 된다.effect안에서 현재 state는 어떻게 사용될까?
useEffect(()=>{
document.addEventListener('keydown', handleKeyPress);
return () => {
document.removeEventListener('keydown', handleKeyPress);
};
})
useEffect(() => {
alert("component rendered for the first time");
return () => {
alert("component is being removed from the DOM");
};
}, []);
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
// Only re-run the effect if the value stored by count changes
Hooks을 쓸 때는 두 가지의 규칙이 있다.
1) top level에 쓴다.
- React에서 Virtual DOM을 빌드할 떄, 라이브러리는 유저 인터렉션에 따라 우리가 정의한 컴포넌트를 계속해서 정의한다. React는 정의된 컴포넌트의 함수에서 Hook으로 불러온 데이터를 계속 추적한다. 이러한 이유로, Hook을 가장 위에서 호출해야 한다.
- loops, conditions, nested functions 안에 쓸 수 없다.
if (userName !== '') {
useEffect(() => {
localStorage.setItem('savedUserName', userName);
});
}
useEffect(() => {
if (userName !== '') {
localStorage.setItem('savedUserName', userName);
}
});
2) React 함수형으로 쓴다.