여러 라이브러리에서 제공하는 hoc
주의점
Stactic method를 따로 분리
npx create-react-app controlled-uncontrolled-example
cd controlled-uncontrolled-example
code . -r
npm start
src => components => ControlledComponent.jsx 생성
ControlledComponent : 상태를 컴포넌트가 관리 = 컴포넌트가 가지고 있는 태그가 가진 상태를 지속적으로 동기화
import React from 'react
class ControlledComponent extends React.Component {
state = {
value:""
}
render () {
const {value} = this.state;
return (
<div>
<input value={value} />
</div>
)
}
}
export default ControlledComponent
=> App.js
function App() {
...
<ControlledComponent/>
}
=> onChange라는 이벤트 핸들러를 사용하지 않고 value라는 props를 사용하고 있다는 경고창 활성 => readOnly를 쓰든 defaultValue를 써라
src => components => ControlledComponent.jsx
import React from 'react
class ControlledComponent extends React.Component {
state = {
value:""
}
render () {
const {value} = this.state;
return (
<div>
<input value={value} onChange={this.change />
<button onClick={this.click} >전송 </button >
</div>
)
}
change = (e) =>{
console.log(e.target.value); // => 키보드로 친 내용이 한글자씩 e로 들어옴
this.setState({value: e.target.value})
}
click = () => {
console.log(this.state.value)
}
}
export default ControlledComponent
components => UncontrolledComponent.jsx
import React from 'react'
class UncontrolledComponent extends React.Components{
inputRef = React.createRef();
render() {
console.log('initial render', this.inputRef)
// => ref객체. 최초 render시기에는 null
return (
<div>
// <input id='my-input' />
<input ref={this.inputRef}/>
<button onClick={this.click} >전송 </button>
</div>
)
}
componentDidMount() {
console.log('componentDidMount', this.inputRef
} // mount 후에는 input을 참조
click = () =>{
// input 엘리먼트의 현재 상태값(value)를 꺼내서 전송한다.
// const input = document.querySelector('#my-input');
// console.log(input)
// 가상돔이 아닌 리얼돔에 관여하는 방식이라 지양함 => ref사용
console.log(this.inputRef.current.value)
// 최초 render 후 button의 onClick 이벤트가 일어나면 mount후 ref에 저장된 참조 값을 불러옴
}
}
export default UncontrolledComponent
=> App.js
function App() {
...
<ControlledComponent/>
<UncontrolledComponent/>
}
ControlledComponent =>
UncontrolledComponent