Today I Learned ... react.js
🙋 My Dev Blog
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
class Input extends PureComponent {
constructor(props) {
super(props);
this.setRef = this.setRef.bind(this);
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
const { name, onChange } = this.props;
if (onChange) {
onChange(name, e.target.value);
}
}
componentDidMount() {
if (this.props.autoFocus) { // autoFocus가 True면, 자동 포커스되게
this.ref.focus();
}
}
componentDidUpdate() {
if (this.props.autoFocus) {
this.ref.focus();
}
}
setRef(ref) {
this.ref = ref;
}
render() {
const { errorMsg, label, name, value, type, onFocus } = this.props;
return (
<label>
{label}
<input
type={type}
id={`input_${name}`}
ref={this.setRef}
onChange={this.handleChange}
onFocus={onFocus}
value={value}
/>
{errorMsg && <span className="error">{errorMsg}</span>}
</label>
);
}
}
Input.propTypes = {
type: PropTypes.oneOf(['text', 'number', 'price']),
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
errorMsg: PropTypes.string,
label: PropTypes.string,
onChange: PropTypes.func,
onFocus: PropTypes.func,
autoFocus: PropTypes.bool,
};
Input.defaultProps = {
onChange: () => {},
onFocus: () => {},
autoFocus: false,
type: 'text',
};
export default Input;
PureComponent
는 왜 사용하는지?true
를 반환해 render()을 호출함.true
를 반환해야 다음 render로 넘어가게 됨. (갱신)Component | PureComponent |
---|---|
항상 render()함수 호출 | 얕은 비교를 통해 데이터가 변경된 경우에만 render() 호출 |
- componentDidMount()
render() 함수가 JSX를 화면에 렌더링 한 이후에 호출되는 함수.
- componentDidUpdate()
컴포넌트가 화면에 실제로 출력된 이후 호출되는 함수
🙋♀️ componentDidMount() vs. componentDidUpdate()
1) the DOM is available (initial render) - componentDidMount
2) properties got changed - componentDidUpdate
constructor(props) {
super(props);
this.setRef = this.setRef.bind(this);
this.handleChange = this.handleChange.bind(this);
}
클래스의 constructor 함수 내에선 인스턴스 객체를 생성 및 초기화함.
this
는 전역객체(window)를 의미하고,this
는 자신을 호출한 객체(즉, . 앞에 객체)를 의미한다.this
는 자신이 생성할 인스턴스를 의미한다.그렇다면, 왜 클래스 컴포넌트에서 메서드에 this를 바인딩 해줘야 할까?
class Input extends PureComponent {
constructor() {
this.handleChange = this.handleChange.bind(this); // this 바인딩
}
handleChange(e) {
// 내용
}
}
render() {
return (
<input onChange={this.handleChange} />
);
}
클래스 내부에서 this.handleChange는 메소드로서 작동하기 때문에
this가 알아서 binding이 될 것이다.
하지만 다른 컴포넌트나 (window의)Event Handler가 함수를 사용한다면?
-> this를 바인딩하지 않았으므로 값이 전달되지 않는다.
예시 - this.state 쓰지 않고, constructor 쓰지 않고.
메서드를 화살표 함수로 선언시 - this 바인딩 필요 Xclass App extends React.Component { state = { count: 10, }; resetCount = () => { this.setState(({ count }) => ({ count: count + 10, })); };
{errorMsg && <span className="error">{errorMsg}</span>}
<span>
)을 반환함.AND (&&) | OR (||) |
---|---|
if문 대체 | 기본값 설정 |
1. AND (&&)
true && anything -> anything
false && anything -> false 이므로
좌항이 true면 우항을 반환하고, 좌항이 false면 false 반환.
2. OR (||)
true || anything -> true
false || anything -> anything 이므로
좌항이 false일때는 우항을 반환. (기본값으로 쓰임)
Input.propTypes = {
type: PropTypes.oneOf(['text', 'number', 'price']),
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
}