class WordRelay extends Component {
state = {
word: '',
value: '',
result: '',
};
onSubmitForm = (e) => {
e.preventDefault();
if (this.state.word[this.state.word.length - 1] === this.state.value[0]) {
this.setState({
result: '딩동댕',
word: this.state.value,
value: '',
});
this.input.focus();
} else {
this.setState({
result: '땡',
value: '',
});
this.input.focus();
}
};
onChangeInput = (e) => {
this.setState({ value: e.target.value });
};
input; // this.input을 생성
onRefInput = (c) => {
this.input = c;
};
render() {
return (
<>
<div>{this.state.word}</div>
<form onSubmit={this.onSubmitForm}>
<input ref={this.onRefInput} value={this.state.value} onChange={this.onChangeInput} />
<button>클릭!!!</button>
</form>
<div>{this.state.result}</div>
</>
);
}
}
module.exports = WordRelay;
const React = require("react");
const { useState, useRef } = React;
const WordRelay = () => {
const [word, setWord] = useState("워드");
const [value, setValue] = useState("");
const [result, setResult] = useState("");
const inputRef = useRef(null);
const onSubmitForm = (e) => {
e.preventDefault();
if (word[word.length - 1] === value[0]) {
setResult("딩동댕");
setWord(value);
setValue("");
inputRef.current.focus();
} else {
setResult("땡");
setValue("");
inputRef.current.focus();
}
};
const onChangeInput = (e) => {
setValue(e.target.value);
};
return (
<>
<div>{word}</div>
<form onSubmit={onSubmitForm}>
<input ref={inputRef} value={value} onChange={onChangeInput} />
<button>클릭!!!</button>
</form>
<div>{result}</div>
</>
);
};
module.exports = WordRelay;
추가로 콘솔창
[HMR] = Hot Module Reload
[WDS] = Webpack Dev Server
코드의 간결성 및 길이
Class에 비하여 Hook 이 간결해보이고 길이도 짧게 나온다.
Logic의 재사용성
Class는 부분적인 DOM 관련 처리나 API사용 및 state을 다루는 등의 logic에 있어서는 경우에 따라 같은 로직을 2개 이상의 Life Cycle method에 중복해서 넣어야하는 등 재사용에 제약이 따릅니다.
이에 반해 hooks를 활용한 함수형 컴포넌트에서는 원하는 기능을 함수로 만든 후(hook) 필요한 곳에 훅 집어 넣어주기만 하면 되기 때문에 로직의 재사용이 가능해집니다.
성능
리액트에서 퍼포먼스 부분 관련 하여 Hook을 밀어 주고 있다.