State Pattern - ChoDragon9/posts GitHub Wiki
React Hook, Vue Composition API, Recoil์ ๋ฐ์ ์๊ธฐ์ ์ด์ ์ ๋ํ ์ ๋ฆฌ์๋ฃ๋ค.
https://ko.reactjs.org/docs/hooks-intro.html#video-introduction
- 2018.10.25 09:00AM ์ธ์
- React Conf 2018์์ Sophie Alpert์ Dan Abramov๋ Hook๋ฅผ ์๊ฐํ์๋ค.
์ฌ๊ธฐ์ useState
๊ฐ ๋ฐ๋ก Hook ์
๋๋ค.
import React, { useState } from 'react';
function Example() {
// "count"๋ผ๋ ์ ์ํ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
https://ko.reactjs.org/docs/hooks-overview.html#but-what-is-a-hook
Hook์ ํจ์ ์ปดํฌ๋ํธ์์ React state์ Lifecycle Features์ ์ฐ๋(hook into) ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์๋ค. Hook์ Class์์์๋ ๋์ํ์ง ์๋๋ค. ๋์ Class ์์ด React๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค.
React ์ปดํฌ๋ํธ ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ตฌ๋ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ํ DOM์ ์ง์ ์กฐ์ํ๋ ์์ ์ ํ ์ ์๋ค. ์ด๋ฐ ๋ชจ๋ ๋์์ side effects ๋๋ effects๋ผ๊ณ ํ๋ค. ์๋๋ฉด ์ด๋ฐ ๋์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ค ์ ์๊ณ , ๋ ๋๋ง ๊ณผ์ ์์ ๊ตฌํํ ์ ์๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
useEffect
๋ ํจ์ ์ปดํฌ๋ํธ ๋ด์์ ์ด๋ฐ side effects๋ฅผ ์ํํ ์ ์๊ฒ ํด์ค๋ค.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate์ ๋น์ทํฉ๋๋ค
useEffect(() => {
// ๋ธ๋ผ์ฐ์ API๋ฅผ ์ด์ฉํด ๋ฌธ์์ ํ์ดํ์ ์
๋ฐ์ดํธํฉ๋๋ค
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
https://ko.reactjs.org/docs/hooks-overview.html#rules-of-hooks
Hook์ JS ํจ์์ด์ง๋ง, ๋ ๊ฐ์ง ๊ท์น์ ์ค์ํด์ผ ํ๋ค.
- ์ต์์์์๋ง Hook์ ํธ์ถํ๋ค.
- ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ์คํํด์๋ ์๋๋ค.
- React ํจ์ ์ปดํฌ๋ํธ ๋ด์์๋ง Hook์ ํธ์ถํด์ผ ํ๋ค.
- ์ผ๋ฐ JS ํจ์์์๋ Hook์ ํธ์ถํด์๋ ์๋๋ค.
- ์ปดํฌ๋ํธ ์ฌ์ด์์ ์ํ์ ๊ด๋ จ๋ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
- React๋ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋์ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๋๋ค.
- render props๊ณผ HOCs ํจํด์ ์ฌ์ฉํด๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํ๋ฉฐ ์ฝ๋๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
- ๋ค๋ฅธ ์ถ์ํ ๋ ์ด์ด์ ๋๋ฌ ์์ฌ Wrapper Hell์ ๋ณผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๋ณต์กํ ์ปดํฌ๋ํธ๋ค์ ์ดํดํ๊ธฐ ์ด๋ ต๋ค.
- ์ ์งํ๊ธฐ ํ๋ ์ํ์ ์ฌ์ด๋ ์ดํํธ๋ก ์ธํด ๋ฒ๊ทธ๊ฐ ์ฝ๊ฒ ๋ฐ์ํ๊ณ ๋ฌด๊ฒฐ์ฑ์ ์ฝ๊ฒ ํด์น๋ค.
- ์ํ ๊ด๋ จ ๋ก์ง์ด ๋ชจ๋ ๊ณต๊ฐ์ ์๊ธฐ ๋๋ฌธ์ ์๊ฒ ๋ง๋ค๊ธฐ ํ๋ค๊ณ , ํ ์คํธํ๊ธฐ๋ ์ด๋ ต๋ค.
- Class๋ ์ฌ๋๊ณผ ๊ธฐ๊ณ๋ฅผ ํผ๋์ํจ๋ค.
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ฝ๋ ๊ตฌ์ฑ์ ์ข ๋ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
- React๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐ ํฐ ์ง์ ์ฅ๋ฒฝ์ด๋ค.
- JS์ this๊ฐ ์ด๋ป๊ฒ ๋์ํ๋ ์ง ์์์ผ ํ๋ค.
- ์๋ จ๋ React ๊ฐ๋ฐ์ ์ฌ์ด์์๋ Class ์ปดํฌ๋ํธ๋ค์ ๊ตฌ๋ณํ๊ณ ๊ฐ ์์๋ฅผ ์ธ์ ์ฌ์ฉํ๋์ง ์๊ฒฌ์ด ์ผ์นํ์ง ์๋๋ค.
- HMR์์ ๊นจ์ง๊ธฐ ์ฝ๊ณ ์ ๋ขฐํ ์ ์๊ฒ ๋ง๋ ๋ค.
https://vue-composition-api-rfc.netlify.app/#composition-api-rfc
- 2019.07.10
- Composition API RFC ์์ ๋ ์ง
์ปดํฌ๋ํธ ๋ก์ง์ ์ ์ฐํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ๋ถ๊ฐ์ ์ธ ํจ์๊ธฐ๋ฐ API ์ธํธ๋ค. reactive
, computed
๊ฐ Composition API ์ค ํ๋์ด๋ค.
<template>
<button @click="increment">
Count is: {{ state.count }}, double is: {{ state.double }}
</button>
</template>
<script>
import { reactive, computed } from 'vue'
export default {
setup() {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
})
function increment() {
state.count++
}
return {
state,
increment
}
}
}
</script>
- Composition API์ ์ง์
์ ์
setup
ํจ์๋ฅผ ์ฌ์ฉํ๋ค. - Lifecycle Hook์
setup
ํจ์์ ๋ฑ๋กํ๋ค.
- ๋ก์ง ์ฌ์ฌ์ฉ & ์ฝ๋ ๊ตฌ์ฑ
- ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ ์ปดํฌ๋ํธ๋ ์ถ๋ก ํ๊ธฐ ์ด๋ ต๋ค.
- ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ์ถ์ถํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๊นจ๋ํ๊ณ ๋น์ฉ์ด ๋ค์ง ์๋ ๋ฉ์ปค๋์ฆ์ Vue์์ ์ฌ๊ณตํ์ง ์๋๋ค.
- ๋ ์ข์ ํ์
์ถ๋ก
- Vue2 API๋ ๋จ์ํ ํ์
์ถ๋ก ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ง ์์ TS์ ์ ์๋ํ๋๋ก ๋ง๋ค ๋ ๋ง์ ๋ณต์ก์ฑ์ ๋ง๋ ๋ค.
- Vue2 API๋
this
์ปจํ ์คํธ๋ฅผ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ TS ํตํฉ์ด ์ด๋ ต๋ค. - Vue2์
this
๋ JS ๋ณด๋ค ๋ง์ ์ ์ผ๋ก ๋์ํ๋ค. - ์๋ฅผ ๋ค์ด
methods
์๋์ ์ค์ฒฉ๋ ํจ์์this
๋methods
์ค๋ธ์ ํธ๊ฐ ์๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- Vue2 API๋
- Class API๋ก ์ ๊ณตํ๋ ค๊ณ ์๋ํ์ผ๋ Decorator๋ฅผ ์์กดํด์ผ ํจ์ผ๋ก Vue3์ ๊ธฐ๋ฐ์ ์ธ์ฐ๋ ๋ฐ, ์ํํ๋ค๊ณ ํ๋จํ๋ค.
- ์์ฐ์ค๋ฝ๊ฒ ์น์ํ ์ผ๋ฐ ๋ณ์์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฉ๋ด์ผ ํ์ ํํธ๊ฐ ๊ฑฐ์ ํ์์๋ ํ์ ์ถ๋ก ์ ํ ์ ์๊ฒ ํ๋ค.
- Vue2 API๋ ๋จ์ํ ํ์
์ถ๋ก ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์ง ์์ TS์ ์ ์๋ํ๋๋ก ๋ง๋ค ๋ ๋ง์ ๋ณต์ก์ฑ์ ๋ง๋ ๋ค.
- 2020.05.14 18:00 ์ธ์
- ReactEurope์์ Dave McCabe๋ Recoil์ ์๊ฐํ๋ค.
Recoil์ ์ํ๋จธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. Atoms๊ณผ Selectors๋ก ๊ตฌ์ฑ๋๋ค.
const fontSizeState = atom({
key: 'fontSizeState',
default: 14,
});
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
return (
<button onClick={() => setFontSize((size) => size + 1)} style={{fontSize}}>
Click to Enlarge
</button>
);
}
function Text() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
return <p style={{fontSize}}>This text will increase in size too.</p>;
}
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({get}) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
},
});
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
const fontSizeLabel = useRecoilValue(fontSizeLabelState);
return (
<>
<div>Current font size: ${fontSizeLabel}</div>
<button onClick={() => setFontSize(fontSize + 1)} style={{fontSize}}>
Click to Enlarge
</button>
</>
);
}
- key๋ ๊ณ ์ ํ ํค๋ฅผ ํ ๋นํ๋ค.
- ๋๋ฒ๊น ๊ณผ ์์์ฑ์ ์ด์ ์ ์ํจ์ด๋ค.
- Selectors๋ ์์ํจ์๋ก ์ ์ํ๋ค.
- React ์ปดํฌ๋ํธ๋ ๊ณตํต ์กฐ์์ ํตํด ๊ณต์ ํ ์ ์๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋ ๊ฑฐ๋ํ ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ ๋๋งํด์ผ ํ ์ ์๋ค.
- Context๋ ๊ฐ๊ฐ ์์ฒด Consumer๊ฐ ์๋ ๋ฌดํํ ์ธํธ๋ฅผ ๊ฐ์ง๋ ๊ฒ ์๋ ๋จ์ผ ๊ฐ๋ง ์ ์ฅํ ์ ์๋ค.
- ํธ๋ฆฌ์ ์๊ณผ ๊ผญ๋๊ธฐ์ ์ฝ๋๋ถํ ์ ํ๋ค๊ฒ ํ๋ค.