React
HOC, High Order Component
- 고차 컴포넌트라고 불리는 HOC는 컴포넌트의 재사용성을 높여 새 컴포넌트를 반환하는 함수를 말한다.
props
를 UI로 반환하는 것이 아닌, 새로운 컴포넌트로 변환하는 것을 말한다.- 아래의 예시처럼, 하나의 컴포넌트에
label, input, error
역할을 하는 3개의 태그가 사용된다. - 하나의 컴포넌트에서
label
을 보여주고,input
을 작성하고,error
를 나타내는 3개의 역할을 하는 것인데, 하나의 역할만 할 수 있도록 이를 분리해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export default function App() {
const [inputValue, setInputValue] = useState("");
const [err, setErr] = useState("");
return (
<TextInput
value={inputValue}
onChange={setInputValue}
label={"예시"}
err={"에러입니다."}
/>
);
}
function TextInput({ value, onChange, label, err }) {
return (
<div>
<label htmlFor="input-label">{label}</label>
<input value={value} onChange={(e) => onChange(e.target.value)}></input>
<span>{err}</span>
</div>
);
}
적용
TextWithLabel
을 통해highOrderComponent
함수가label
과TextInput
컴포넌트를 리턴한다.children
으로 들어가는 ‘라벨입니다.’는label
에 들어가고,TextWithLabel
에 전달되는props
는TextInput
에게rest
로 전달된다.- 이로 인해
label
과TextInput
을 분리할 수 있으며,children
에 들어갈 수 있는 로직의 범용성도 높아진다.- ex /
<h2>라벨입니다.</h2>
=> h2 태그의 ‘라벨입니다.’로 들어간다.
- ex /
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const TextWithLabel = highOrderComponent(TextInput);
export default function App() {
const [inputValue, setInputValue] = useState("");
const [err, setErr] = useState("");
return (
<TextWithLabel value={inputValue} onChange={setInputValue} err={err}>
라벨입니다.
</TextWithLabel>
);
}
function highOrderComponent(Component) {
return ({ chidren, ...rest }) => (
<div>
<label>{chidren}</label>
<Component {...rest}></Component>
</div>
);
}
function TextInput({ value, onChange, err }) {
return (
<div>
<input value={value} onChange={(e) => onChange(e.target.value)}></input>
<span>{err}</span>
</div>
);
}
응용
- 위 방법을 통해
error
또한 분리한다. - 똑같이 HOC를 활용하여 분리할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
const ErrorWithHOC = hocErr(highOrderComponent(TextInput))
function hocErr(Component){
return ({err = "에러입니다.", ...rest}) => (
<div>
<Component {...rest}>
<span>{err}</span>
</div>
)
}
// 이하동일