Hook
을 더 많이 활용하는 추세컴포넌트
를 인자로 받아 새로운 컴포넌트
를 리턴
하는 함수
with
를 붙이는 경우가 많음주의
- render method 안에 HOC를 사용하지말자
: render될 때마다 새로운 컴포넌트를 만들기 때문- static method는 카피해서 써라(Feat. hoist-non-react-static)
- refs 통과시킬 수 없음(feat. React.forwardRef)
- 상태를 가지고 있는 엘리먼트
: input, select, textarea, ...- Controlled
: 엘리먼트를 가지고 있는 컴포넌트가 관리- Uncontrolled
: 엘리먼트의 상태를 관리하지 않고, 엘리먼트의 참조만 컴포넌트가 소유
// ControlledComponent.jsx
import React from 'react'
class ControlledComponent extends React.Component {
state = {
value: '',
}
render() {
const { value } = this.state
return (
<div>
<input type="text" value={value} onChange={this.change} />
<button onClick={this.click}>버튼</button>
</div>
)
}
change = (e) => {
console.log(e.target.value)
this.setState({ value: e.target.value })
}
click = () => {
console.log(this.state.value)
}
}
export default ControlledComponent
// UncontrolledComponent.jsx
import React from 'react'
class UncontrolledComponent extends React.Component {
// 방법2
inputRef = React.createRef()
render() {
console.log('initail render', this.inputRef)
return (
<div>
{/* <input id="my-input" /> 방법1 */}
<input ref={this.inputRef} />
<button onClick={this.click}>전송</button>
</div>
)
}
componentDidMount() {
console.log('componentDidMount', this.inputRef)
}
click = () => {
// 목표
// input 엘리먼트의 현재 상태 값 (value)를 꺼내서 전송함
// 방법 1 => real DOM에 직접적인 변경을 가함 => 지양
// const input = document.querySelector('#my-input')
// console.log(input.value)
// 방법 2
console.log(this.inputRef.current.value)
// inputRef
}
}
export default UncontrolledComponent