π©π»π» Weekly I Learned π
μ΄μ μ 리μ‘νΈμ λΌμ΄ν μ¬μ΄ν΄μ λν΄μ ν¬μ€ν μ ν μ μ΄ μλλ°, μ΄λ²μλ 리μ‘νΈμ ν΄λμ€ν , ν¨μνμ λ°λ₯Έ μ¬μ΄ν΄μ λ©μλμ λν μμΈν μ΄μΌκΈ°λ₯Ό ν΄λ³΄λ €κ³ νλ€.
β λΌμ΄ν μ¬μ΄ν΄ (ν΄λμ€ν)
ν΄λμ€νμμ λΌμ΄ν μ¬μ΄ν΄μ μΈμΈνκ² λλλ©΄ μ΄ 9κ°κ° μ‘΄μ¬νλ€.
μ΄ μ€μμ μΉ΄ν
κ³ λ¦¬λ₯Ό λλ 보μλ©΄ ν¬κ²λ 3κ°μ§λ‘ λλλλ°, μμ±μ΄ λ λ(Mount), μ
λ°μ΄νΈ λ λ(Update), μ¬λΌμ§ λ(Unmount) μ΄λ€. μ΄ν΄λ₯Ό λκΈ° μν΄μ μμ μ 첨λΆνλ μ¬μ§μ΄μ§λ§ νλ² λ 첨λΆν΄λ³Έλ€.
β λΌμ΄ν μ¬μ΄ν΄ λ©μλ
1οΈβ£ constructor
- ν΄λμ€ν
μμ±μλΌλ λ§μ΄λ€. ν΄λμ€ν μ»΄ν¬λνΈλ₯Ό λ§λ€ λ μ²μμΌλ‘ μ€νλλ€. μ΄ λ©μλμ μ΄κΈ° stateλ₯Ό λ£μ μ μλ€.
- ν¨μν
ν¨μνμλ constructorκ° μλ€ λμ μ React Hook μ€ useState λ‘ μ΄κΈ° state κ°μ μ μΈν΄μ€ μ μλ€.
// Class
class Example extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
// Hooks
const Example = () => {
const [count,setCount] = useState(0);
2οΈβ£ getDerivedStateFromProps
μ μ°μ§ μλ λ©μλ μ€ νλλΌκ³ νλ€. μ΅μ΄ λ§μ΄λ μμ κ°±μ μ λͺ¨λμμ render λ©μλλ₯Ό νΈμΆνκΈ° μ§μ μ νΈμΆλλ€.
static getDerivedStateFromProps(props, state)
stateλ₯Ό κ°±μ νκΈ° μν κ°μ²΄λ₯Ό λ°ννκ±°λ, nullμ λ°ννμ¬ μ무 κ²λ κ°±μ νμ§ μμ μ μλ€. μκ°μ νλ¦μ λ°λΌ λ³νλ propsμ stateκ° μμ‘΄νλ μμ£Ό λλ¬Έ κ²½μ°λ₯Ό μνμ¬ μ‘΄μ¬νλλ°, stateλ₯Ό λμ΄μ€λ©΄ μ½λκ° μ₯ν©ν΄μ§κ³ , μ»΄ν¬λνΈλ₯Ό μ΄ν΄νκΈ° μ΄λ €μ μ§κΈ° λλ¬Έμ λ€λ₯Έ λμλ€μ μ°λ κ²μ λ κΆμ₯νλ€.
λμμΌλ‘ μ°λ κ²μ΄ componentDidUpdateμ΄λ€
3οΈβ£ shouldComponentUpdate
- ν΄λμ€ν
propsλ stateλ₯Ό λ³κ²½νμ λ, 리λ λλ§μ ν μ§ λ§μ§ κ²°μ νλ λ©μλμ΄λ€. μ΄ λ©μλμμλ λ°λμ true νΉμ falseλ₯Ό λ°νν΄μΌνλ€.
- ν¨μν
ν μμλ stateμ useMemoλ₯Ό νμ©νλ©΄ λ λλ§ μ±λ₯μ κ°μ ν μ μλ€
// Class
class Example extends React.Component {
shouldComponentUpdate(nextProps) {
return nextProps.value !== this.props.value
}
}
// Hooks
const Example = React.memo(() => {
...
},
(prevProps, nextProps) => {
return nextProps.value === prevProps.value
}
)
4οΈβ£ render
μ»΄ν¬λνΈλ₯Ό λ λλ§ν λ μ λμ μΌλ‘ νμν λ©μλμ΄λ€. ν¨μνμμλ renderμ μ μ°κ³ λ λ λλ§ ν μ μλ€.
// Class
class Example extends React.Component {
render() {
return <div>μ»΄ν¬λνΈ</div>
}
}
// Hooks
const example = () => {
return <div>μ»΄ν¬λνΈ</div>
}
5οΈβ£ getSnapshotBeforeUpdate
κ°μ₯ λ§μ§λ§μΌλ‘ λ λλ§λ κ²°κ³Όκ° DOM λ±μ λ°μλμμ λμ νΈμΆλ©λλ€. μ΄ λ©μλλ₯Ό μ¬μ©νλ©΄ μ»΄ν¬λνΈκ° DOMμΌλ‘λΆν° μ€ν¬λ‘€ μμΉ λ±κ³Ό κ°μ μ 보λ₯Ό μ΄ν λ³κ²½λκΈ° μ μ μ»μ μ μμ΅λλ€. μ΄ μλͺ μ£ΌκΈ° λ©μλκ° λ°ννλ κ°μ componentDidUpdate()μ μΈμλ‘ μ λ¬λλ€. ν¨μνμμλ μμ§ λμ ν hookμ΄ μλ€.
μ΄ λ©μλμ λν μ¬μ© μλ ννμ§ μμ§λ§, μ±ν νλ©΄μ²λΌ μ€ν¬λ‘€ μμΉλ₯Ό λ°λ‘ μ²λ¦¬νλ μμ μ΄ νμν UI λ±μ μκ°ν΄λ³Ό μ μλ€κ³ νλ€.
class ScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}
getSnapshotBeforeUpdate(prevProps, prevState) {
// Are we adding new items to the list?
// Capture the scroll position so we can adjust scroll later.
if (prevProps.list.length < this.props.list.length) {
const list = this.listRef.current;
return list.scrollHeight - list.scrollTop;
}
return null;
}
componentDidUpdate(prevProps, prevState, snapshot) {
// If we have a snapshot value, we've just added new items.
// Adjust scroll so these new items don't push the old ones out of view.
// (snapshot here is the value returned from getSnapshotBeforeUpdate)
if (snapshot !== null) {
const list = this.listRef.current;
list.scrollTop = list.scrollHeight - snapshot;
}
}
render() {
return (
<div ref={this.listRef}>{/* ...contents... */}</div>
);
}
}
6οΈβ£ componentDidMount
- ν΄λμ€ν
μ»΄ν¬λνΈλ₯Ό λ§λ€κ³ 첫 λ λλ§μ λ§μΉ ν μ€ννλ€.
- ν¨μν
Hooks μμλ useEffectλ₯Ό νμ©νμ¬ λ€μμ κΈ°λ₯μ ꡬνν μ μλ€. κ·Έλ°λ° μ΄λ, useEffectμ μμ‘΄κ° []λ₯Ό λΉμμΌμ§ λκ°μ λ©μλλ₯Ό ꡬνν μ μλ€
// Class
class Example extends React.Component {
componentDidMount() {
...
}
}
// Hooks
const Example = () => {
useEffect(() => {
...
}, []);
}
7οΈβ£ componentDidUpdate
- ν΄λμ€ν
리λ λλ§μ μλ£ν νμ μ€ννλ€. μ΅μ΄ λ λλ§μμλ νΈμΆλμ§ μλλ€. μ»΄ν¬λνΈκ° κ°±μ λμμ λ DOMμ μ‘°μνκΈ° μνμ¬ μ΄ λ©μλλ₯Ό νμ©νλ©΄ μ’λ€. μ¬κΈ°μ setState()λ₯Ό λ°λ‘ νΈμΆν μλ μμ§λ§, 쑰건문μΌλ‘ κ°μΈμ§ μμΌλ©΄ 무ν 리λ λλ§μ΄ λ°μν μ μλ€λ μ μ μ£Όμν΄μΌνλ€.
- ν¨μν
useEffectλ₯Ό μ¬μ©νλ©΄ λλ€
componentDidUpdate(prevProps) {
// μ νμ μΈ μ¬μ© μ¬λ‘ (props λΉκ΅λ₯Ό μμ§ λ§μΈμ)
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
8οΈβ£ componentWillUnmount
- ν΄λμ€ν
μ»΄ν¬λνΈλ₯Ό DOMμμ μ κ±°ν λ μ€νν©λλ€. omponentDidMountμμ λ±λ‘ν μ΄λ²€νΈκ° μλ€λ©΄ μ¬κΈ°μ μ κ±° μμ μ ν΄μΌνλ€.
- ν¨μν
μ»΄ν¬λνΈμμλ useEffect CleanUp ν¨μλ₯Ό ν΅ν΄ ꡬνν μ μμ΅λλ€
// Class
class Example extends React.Component {
coomponentWillUnmount() {
...
}
}
// Hooks
const Example = () => {
useEffect(() => {
return () => {
(cleanUp)
}
}, []);
}
9οΈβ£ componentDidCatch
μ΄ μλͺ μ£ΌκΈ° λ©μλλ μμ μ»΄ν¬λνΈμμ μ€λ₯κ° λ°μνμ λμ νΈμΆλλ©°, 2κ°μ 맀κ°λ³μλ₯Ό μ λ¬λ°μ΅λλ€. μ»΄ν¬λνΈ λ λλ§ λμ€μ μλ¬κ° λ°μ νμ λ μ ν리μΌμ΄μ μ΄ λ©μΆμ§ μκ³ μ€λ₯ UIλ₯Ό 보μ¬μ€ μ μκ² ν΄μ€λ€.
“컀바 λ¨κ³μμ νΈμΆλλ―λ‘, λΆμ ν¨κ³Όλ₯Ό λ°μμμΌλ λ©λλ€. μλμ κ°μ΄ μ€λ₯ λ‘κ·Έ κΈ°λ‘ λ±μ μνμ¬ μ¬μ©νλ©΄ λ©λλ€.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// stateλ₯Ό κ°±μ νμ¬ λ€μ λ λλ§μμ λ체 UIλ₯Ό νμν©λλ€.
return { hasError: true };
}
componentDidCatch(error, info) {
// Example "componentStack":
// in ComponentThatThrows (created by App)
// in ErrorBoundary (created by App)
// in div (created by App)
// in App
logComponentStackToMyService(info.componentStack);
}
render() {
if (this.state.hasError) {
// λ³λλ‘ μμ±ν λ체 UIλ₯Ό λ λλ§ν μλ μμ΅λλ€.
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
ν΄λμ€νμ μ΅μνμ§ μκ³ μ€νλ € ν¨μνμΈ hook useStateμ useEffectμ μ΅μν΄μ λΌμ΄ν μ¬μ΄ν΄μ΄ μ΄λ κ² μΈμΈνκ² λλμ΄μλμ§ μ²μ μμλ€. π§ ν΄λμ€νμ 보면 λΌμ΄ν μ¬μ΄ν΄μ νμ€νκ² μ΄ν΄ν μκ° μλ€
μ°Έμ‘°
리μ‘νΈ κ³΅μ λ¬Έμ – λΌμ΄νμ¬μ΄ν΄
π This Week
π 리μ‘νΈ μ
λ¬Έ 2μ£Όμ°¨ λ§λ¬΄λ¦¬κ° λμλ€. μ
λ¬Έμ΄ 2μ£Όμ°¨μΈκ±΄ λ무 λλνκ±° μλκ°? νμ§λ§ νμ€μ μλμλ€. γ
… 미리 리μ‘νΈλ‘ μμ νλ‘μ νΈλ₯Ό λ§λ€μ΄λ΄€μλ κ²½νμ΄ μλ λμ‘°μ°¨λ λμ μ μΈ μ£Όμκ³ . μ¬μ ν λ―ΈκΆ μμ ν€λ§€λ κΈ°λΆμ΄μλ€.
μ‘°κΈ μκ² κ°λ€κ³ μκ°νλ©΄ μλ‘μ΄ μ€λ₯λ₯Ό λ§μ΄νκ³ ν΄κ²°ν΄λ΄κ³ λμ λ μ΄μ μ κ² κ°μλ°? μ΄λ¬λ©΄ μλ‘μ΄ μ€λ₯κ° λλ₯Ό λ°κ²Όλ€ π΅
π μ΄λ² κ°μΈκ³Όμ λ κ³Όλ½μ΄ λμ§ μκΈ° μν΄μ μꡬμ¬ν λͺ©λ‘μ ν±μλ΄€λ€. μ§λ μ£Όμ μΉ μ΄ν λ€ λ§λ€μ΄λκ³ μΈλ°μλ κΈ°λ₯λν΄μ κ³Όλ½ γ
γ
….
κ³Όμ λ₯Ό νλ©΄μ μκ°ν건λ°, κΈ°λ³Έ κ°λ
μ λν μ΄ν΄κ° μ λ§ λΆμ‘±ν κ² κ°λ€. νμλ€μ΄ μ€λ₯κ΄λ ¨ν΄μ λ¬Όμ΄λ³΄λ©΄ λλ κ²ͺμλ μ€λ₯λΌμ ν΄κ²°μ±
μ μλ €μ€ μ μμλ€. νμ§λ§ κ·Έκ² μ κ·Έλ κ² λλμ§λ 100% νμ€νκ² λ§μ μ λ¬νμ§ λͺ» νλ€. λλμμ죡~?μ΄λ° λλμΌλ‘ μ€λͺ
μ νλ€λ³΄λ. λΉμ°ν λ£λ μ
μ₯μμλ μ΄ν΄λ₯Ό λͺ» ν μ λ°μ. κ²λ€κ° ν΄κ²°μ±
μ μ°Ύμλ κ·Έ ν΄κ²°μ±
μ΄ λ λ€λ₯Έ μ€λ₯λ₯Ό λ³μ νλ₯ λ μλ€λ³΄λ 100% μμ κ°μΌλ‘ μ€λͺ
ν΄μ£Όμ§ λͺ»νλ€λκ² …..π₯
λͺ
ννκ² μ΄λμ μ΄λ κ² λμ μ΄λ μ΅λλ€! λΌκ³ λ§ ν μ μλ λ μ΄ μ¬κ±°λΌκ³ λ―Ώμ§λ§. κ·Έκ² μ§κΈμ΄ μλλΌλκ² νμ μ«μ« λΉ μ§κ² νλ€.
'κ°λ° > β΅ νν΄99' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νν΄99] Day30. TIL (0) | 2022.02.19 |
---|---|
[νν΄99] Day29. TIL β 리μ‘νΈ μ¬νμ£Όμ°¨ μμ! (0) | 2022.02.19 |
[νν΄99] Day27. TIL β TDZ? / λ λ€λ₯Έ μ€λ₯μ λ°κ²¬? (0) | 2022.02.19 |
[νν΄99] Day25. μ΅μ λ 체μ΄λ(Optional Chaining)μ΄λ? (0) | 2022.02.19 |
[νν΄99] Day23. TIL β μλ°©ν₯ λ°μΈλ©μ΄λ? (0) | 2022.02.19 |