- Adding Interactivity
- Responding to Events
- State: A Component's Memory
- Render and Commit
- State as a Snapshot
- Queueing a Series of State Updates
- Updating Objects in State
- Updating Arrays in State
Note
'Adding Interactivity' ์ฑํฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
- ์ฌ์ฉ์์ ์ด๋ฒคํธ์ ์๋ตํ๋ ๋ฐฉ๋ฒ
- ์ปดํฌ๋ํธ๊ฐ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ฒ ํ๋ ๋ฐฉ๋ฒ
- UI๋ฅผ ํ๋ฉด์ ํ์ํ๋ ๋ ๊ฐ์ง ๋จ๊ณ
- ์ค๋ ์ท์ฒ๋ผ ๋์ํ๋ ์ํ
- ์ํ ์ ๋ฐ์ดํธ๋ฅผ ํ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ๊ฐ์ฒด ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
- ๋ฐฐ์ด ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
-
Unlike regular JavaScript variables, React state behaves more like a snapshot. Setting it does not change the state variable you already have, but instead triggers a re-render. This can be surprising at first!
- ๋ฒ๊ทธ๋ฅผ ๋ง์ด ๊ฒช์๋ ๋ถ๋ถ์ด๋ผ ๊ณต๊ฐ๋๋ค.
-
replacing setScore(score + 1) with setScore(s => s + 1)
- ๋ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ๋ช ํํ๊ฒ ๋ชฐ๋๋๋ฐ ์ด๋ฒ์ ์๊ฒ ๋์๋ค. ๋๋ฒ์งธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ๋์ ๋ฒ๊ทธ๋ฅผ ํผํ ์ ์์ด ๊ถ์ฅ๋์๋ค.
- Immer?
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ์ ์ฉํด๋ณด์ด์ง๋ง ์ฝ๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ฌ์ฃผ์ง๋ ์๋ ๋ฏ ๋ณด์ธ๋ค. ์ฃผ๋ณ์์ ์ฌ์ฉํ๋ ์ผ์ด์ค๋ฅผ ๋ณด์ง ๋ชปํจ
- ์ด์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ฒด ๊น์ ๋ณต์ฌ๋ฅผ ์ํํด์ฃผ๋ structuredClone()๋ฅผ ์ ๊ณตํด์ฃผ๋ ์ฌ์ฉํ ์ด์ ๊ฐ ๋ฑํ ์์ง ์์๊น
-
By convention, it is common to name event handlers as handle followed by the event name. Youโll often see onClick={handleClick}, onMouseEnter={handleMouseEnter}, and so on.
- ์ปจ๋ฒค์ ๊ด๋ จ๋ ๋ด์ฉ์ด ๋ค์ ๋ณด์ฌ ํจ์ ๊ด๋ จํ์ฌ convention์ ์ ํ ๋์ react docs๋ฅผ ๋ ํผ๋ฐ์ค ์ผ์ ์ ์์ ๊ฒ ๊ฐ๋ค.
-
In the second example, the
()
at the end ofhandleClick()
fires the function immediately during rendering, without any clicks. This is because JavaScript inside the JSX{
and}
executes right away. If you want to define your event handler inline, wrap it in an anonymous function like so:- ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ํจ์๋ฅผ ์คํํ๋๊ฑธ ์ง์ํด์ผ ํ๋จ ๊ฑธ ๋ฌด์ง์ฑ์ผ๋ก ์๊ณ ์์๋๋ฐ, docs์ ๋ช ํํ๊ฒ ์์ผ๋ ์ด์ ๋ฅผ ํ์คํ ์ ์ ์์๋ค.
-
By convention, event handler props should start with on, followed by a capital letter.
- handle, on์ด ํผํฉ๋์ด ์ฌ์ฉ๋๊ณ ๋ฐฉ๋ํ๋ฐ ๊ท์น์ด ์์๊ณ ๋ฆฌํฉํ ๋ง ์์๋ ๊ธฐ์ค์ด ์์๋๋ฐ docs์์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ์ฌ ์ค๋ช ํด์ฃผ๋๊น ํ์ค์ ์ผ๋ก ๋์์ด ๋ง์ด ๋๋ค.
-
We say that an event โbubblesโ or โpropagatesโ up the tree: it starts with where the event happened, and then goes up the tree.
- ๋ฉด์ ์์ ํด๋น ์ง๋ฌธ์ ๋ง์ด ๋ฐ์ ๊ฒ ๊ฐ๋ค. (์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ค๋ช ํ๋ผ, ์ด๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง๋ฅผ ์ค๋ช ํ๋ผ)
-
All events propagate in React except onScroll, which only works on the JSX tag you attach it to.
- ํ๊ธ ๋ฒ์ญ์ด ์กฐ๊ธ ์ด์ํ ๋๋...
- on์ผ๋ก ์์ํ๋ ์ด๋ฒคํธ๊ฐ ๋ง์๋ฐ, onClick, onChange ๋ฑ๋ง ์ ํ์ ์ผ๋ก ์ฐ๋๊ฒ ๊ฐ์์ ์์ฝ๋ค.
- onScroll, onDrop ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ ์์ธ์ผ์ด์ค ๊ฐ๋ฐ ์ ์ฌ์ฉํ๊ฒ ๋๋ ๋ฏ
-
By convention, itโs usually called e, which stands for โeventโ.
- ๊ทธ๋์ event๋ error๋ ๋ชจ๋ ํ๋ค์์ ์ ์๋๋ฐ docs์์ e๋ก ์ถ์ฝํด์ ์ฌ์ฉํ๋ ๋ด์ฉ์ ์ ์๋ค.
- ๋ค๋ค e๋ก ์ถ์ฝํ์ฌ ์ฐ๋ ๊ฑธ ์ ํธํ๋ ํธ!
- e.stopPropagation ์ฌ์ฉ ์ฌ๋ก ๊ณต์
- ํฐ div์ card๊ฐ 4๊ฐ ์๊ณ , card ๋ด๋ถ์ ์ด๋ฏธ์ง์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์๊ณ ๊ฐ๊ฐ์ card์๋ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์๋ ํํ
- ์ด๋ฏธ์ง ํด๋ฆญ ์ด๋ฒคํธ์ e.stopPropagation์ ์ฌ์ฉํ์๋ค
<div> <Card onClick={} /> <Card onClick={} /> <Card onClick={} /> <Card onClick={} /> </div>
-
In rare cases, you might need to catch all events on child elements, even if they stopped propagation. For example, maybe you want to log every click to analytics, regardless of the propagation logic. You can do this by adding Capture at the end of the event name:
- Capture๊ฐ ๋ถ์ ์ด๋ฒคํธ๊ฐ ์ด๋ค ์ฉ๋์ธ์ง ๋ชฐ๋๋๋ฐ, ๋ถ์ ๋๊ตฌ ์ฌ์ฉํ ๋์ ์ ์ฉํ ๊ฒ ๊ฐ๋ค!
- Q: ํ์ฌ์์ ์ ๊ทผ์ฑ ์ด๋ป๊ฒ ์ฑ๊ธฐ๋์ง?
- A:
- ํน์ํ๊ฒ ์ฑ๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ฑ๊ธฐ์ง ๋ชปํ๊ฒ ๋๋ ๊ฒ ๊ฐ๋ค.
- eslint์ ์ ๊ทผ์ฑ ์ฑ๊ธฐ๋ ์ปจ๋ฒค์ ์ ์ ๋ฆฝํ๋๊น Error ํ์์ ๋ง์ถฐ ์์ ํ๋ฉด ๋์ด ์๊ธดํ๋ค.
- chrome ๋ผ์ดํธํ์ฐ์ค์์ ๊ฐ๋จํ๊ฒ ์ ๊ทผ์ฑ ์ฒดํฌํ๋ ๋ฐฉ์
- ์คํ ๋ฆฌ๋ถ ์ ๊ทผ์ฑ ์ฒดํฌ์ฉ addon์ ์ฌ์ฉ
- Q: ํ์ฌ์์ ์ฌ์ฉํ๋ ๋ถ์ ๋๊ตฌ?
- A:
- ๋ณดํต์ GA ์ฌ์ฉ, vercel analytics ์ ์ ๋ฐ์์ผ๋ ๊ธ์ก ๋ถ๋ด์ผ๋ก ์ฌ์ฉํ์ง ์์. (tagmanager์์ ์ ํ ํ๋ ๊ฑธ ์์์ ํด์ฃผ๋ ์ด์ ์ด ์๋ ๋ฏ)
- GA ๋ถ์์ ๋ํ ์ฑ ์์์ฌ๊ฐ ๋ช ํํ์ง ์์์ ํผ๋์ค๋ฝ๊ธฐ๋ ํ๋ค. (๊ฐ๋ฐ์ธก์์ ๊ด๋ฆฌํด์ผ ํ๋์ง ๋ง์ผํ ์ธก์์ ๊ด๋ฆฌ ํด์ผ ํ๋์ง?)
- ๋ง์ผํ ํํธ์์ GA๋ฅผ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ฐ์๋ฅผ ๋ฐ๋ก ํ์๋ก ํ๊ธฐ๋ ํ๋ค.
-
- Aย state variableย to retain the data between renders. 2. Aย state setter functionย to update the variable and trigger React to render the component again.
- ๊ด์ต์ ์ผ๋ก ์ฌ์ฉํ๋ useState๋ฅผ 2depth๋ก ๋๋์ด์ ๋ณด์ฌ์ฃผ๋๊ฒ ์ธ์ ๊น์๋ค.
-
Hooksโfunctions starting with use โcan only be called at the top level of your components or your own Hooks.
- ์ปค์คํ ํ ์ด ํ์์ ์ด๋ผ๊ณค ์๊ฐ์ ์ํ๋๋ฐ (๋ฆฌํฉํ ๋ง์ ์ผ์ข ์ผ๋ก ์ฌ๊น) ๋ญ๊ฐ docs์์ ์ปค์คํ ํ ์ ์ ๊ทน์ ์ผ๋ก ์ธ๊ธ ํ๋๊ฒ ๊ฐ์์ ์ฌ๋ฐ๋ค.
- toss์ slash๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ปค์คํ ํ ์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๋ ์ฌ์ง๋ฅผ ์ ๊ณตํด์ฃผ์ด ์ ์ฐ๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ๋ค.
-
- Your component renders the first time.ย Because you passedย
0
ย toยuseState
ย as the initial value forยindex
, it will returnย[0, setIndex]
. React remembersย0
ย is the latest state value. 2. You update the state.ย When a user clicks the button, it callsยsetIndex(index + 1)
.ยindex
ย isย0
, so itโsยsetIndex(1)
. This tells React to rememberยindex
ย isย1
ย now and triggers another render. 3. Your componentโs second render.ย React still seesยuseState(0)
, but because Reactย remembersย that you setยindex
ย toย1
, it returnsย[1, setIndex]
ย instead. Instead, to enable their concise syntax, Hooks rely on a stable call order on every render of the same component. This works well in practice because if you follow the rule above (โonly call Hooks at the top levelโ), Hooks will always be called in the same order. Additionally, a linter plugin catches most mistakes. Internally, React holds an array of state pairs for every component. It also maintains the current pair index, which is set to 0 before rendering. Each time you call useState, React gives you the next state pair and increments the index. You can read more about this mechanism in React Hooks: Not Magic, Just Arrays.
- ๋ฑํ ์๋ฌธ์ ๊ฐ์ง๊ณ ์์ง ์์๋๋ฐ ์ฒ์ ์๊ฒ ๋ ๋ถ๋ถ. ๋ ๋๋ง ์ ๋ฐฐ์ด ๊ธฐ๋ฐ์ ํธ์ถ ์์๋ก ๋ ๋๋งํ๋ค๋ ๋ถ๋ถ์ด ์ธ์๊น์๋ค.
- ์ด๋ฐ ์ง์์ ์ฐจ์ด๊ฐ ๋ ๋ฒจ ์ฐจ์ด๋ฅผ ๋ง๋๋ ๊ฒ ๊ฐ๋คโฆ!
- Your component renders the first time.ย Because you passedย
-
How does React know which state to return?
- ์ฒ์์ ์ ๋ชฉ์ด ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ํ์ ์ ๋ชปํ๋๋ฐ, ์ฝ์ด๋ณด๋ ์ ํ ์๊ฐ์น๋ ๋ชปํ ๋ถ๋ถ์ด์ด์ ์ธ์ ๊น์๋ค.
- React hooks: not magic, just arrays ๊ธ์ ์ด๋ฏธ์ง์ ํจ๊ป ๋ณด๋ฉด ์ดํด๊ฐ ์ฝ๋ค.
- ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์์์ ํด๋นํ๋ ์์ญ์ ์ฝ๋ ๋ด๋ถ์ ํ๋จ๋ถ์ ์์น์ํค๋ ๊ฒ๋ ๊น๋ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
-
Unlike props, state is fully private to the component declaring it. The parent component canโt change it.
- ์บก์ํ๊ฐ ์๊ฐ๋๋ค.
- ์์ญ์ ์๊ด์์ด ์ ์ง์ธ ์ฝ๋์ ์๋ฆฌ๋ ๋น์ทํ๋ค
-
- Triggeringย a render (delivering the guestโs order to the kitchen) 2. Renderingย the component (preparing the order in the kitchen) 3. Committingย to the DOM (placing the order on the table)
- state ์ํ๋ฅผ DOM์ ๋ฐ์ํ๋ ๋ก์ง์ ํต์ฌ
- ์ด ๋จ๊ณ์ Real dom์ ๊ทธ๋ ค์ง๋ painting ๋จ๊ณ๋ฅผ ๊ตฌ๋ถํ๋๊ฒ ์ธ์ ๊น์๋ค. (virtual dom)
-
โRenderingโ is React calling your components.
- ๋ ๋๋ง์ ํ ๋ง๋๋ก ํํํ๋ฉด ์ปดํฌ๋ํธ ํธ์ถ
- ์ปดํฌ๋ํธ๋ ๊ฒฐ๊ตญ ํจ์๋๊น ์ด ํจ์๋ฅผ ํธ์ถ -> ์๊ฐ jsx ๋ฆฌํด -> ํ๋ฉด์ ๋ณด์ฌ์ง ์ ๊ณผ์ ๋๋ฌธ์ '๋ ๋๋ง' ์ด๋ผ๊ณ ํ ๋จ์ด๋ก ๋งํ๋ ๊ฑด๊ฐ ์ถ๊ธฐ๋
- ๊ฒฐ๊ตญ jsx๋ js๋ก ๋ง๋ค์ด์ง ํจ์...
-
This process is recursive: if the updated component returns some other component, React will render that component next, and if that component also returns something, it will render that component next, and so on.
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ฉด ์์ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง๋๋ค๋ ๊ฑด ์๊ณ ์์๋๋ฐ ๊ทธ ์ด์ ๊ฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ผ๋ ๊ฑด ๋ชฐ๋๋ค.
-
React only changes the DOM nodes if thereโs a difference between renders. For example, here is a component that re-renders with different props passed from its parent every second. Notice how you can add some text into the
<input>
, updating its value, but the text doesnโt disappear when the component re-renders:- controlled component๊ฐ ์๋ชป ์ฌ์ฉํ๋ฉด ์ ํ์ ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์์ธ์ด๋ผ ๋ฆฌ๋ง์ธ๋ ํ ์ ์์ด ์ข์๋ค.
- ๋ฒ๊ฑฐ๋ก์๋ Form library๊ฐ์๊ฑธ ๋ถ์ฌ์ ๊ฐ์ ์ฒ๋ฆฌํด์ผ๊ฒ ๋ค. (react-hook-form์ ์ฃผ๋ก ์ฌ์ฉ)
- ์ต๊ทผ react-hook-form๊ณผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋๋ฐ, reset ํจ์ ๊ด๋ จํ์ฌ ๋์์ด ์ ๋๋ก ๋์ง ์์ ํ๋ค์๋ค. react-hook-form์ ์ฌ์ฉํ๋ฉด ๊น๋ค๋ก์ด ์๊ตฌ์ฌํญ์ด์ด๋ ํด๊ฒฐ ๊ฐ๋ฅํ๊ธด ํ๋ docs๊ฐ ์น์ ํ์ง ์์ ๊ฐ๋ ์ด๋ ๊ฒ ์ ๋ฅผ ๋จน๊ธฐ๋...
- MUI์ ๊ฐ์ ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ controller์ ํจ๊ป ์ฌ์ฉํ๋ ํธ
- Q: ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น์?
- ์ ๋ ฅ ์นธ์ด ์ฌ๋ฌ๊ฐ์ผ ๋, ๋ชจ๋ ๋ถ๊ธฐ์ ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํด์ ์น๋ค๋ณด๋ฉด state์ ์์ด ๋๋ฌด ์ปค์ง๊ณ , ํธ๋ค๋ฌ์ ์์ด ๋๋ฌด ๋ง์์ง
- customHook์ ์ง์ ์ง๋ ๊ฒ๋ณด๋ค ๊ณต์๊ฐ ์ ๊ฒ ๋ ๋ค.
- ํผ์ด ๋ค๋ฅธ ํผ์ ์ํฅ์ ๋ฐ๋ ์์ด๋ฉด ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๋๋ฐ ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์์ ํจ์ฌ ํธํ๊ฒ ์์ฑ ๊ฐ๋ฅํ๋ค.
- ์ ํจ์ฑ ๊ฒ์ฆ๋ ํจ์ฌ ์์ฑํ๊ธฐ๊ฐ ์ฝ๋ค. (customํ validation๋ ๊ฐ๋ฅ) โ ์ดํ์ ๋์์ formState๋ก ๊ด๋ฆฌํ๋๋ฐ ์ด ์ ์ด ์ ์ฉ
- Q: ํ์ฌ์์ ์ฑ๋ฅ ์ต์ ํ ์ด๋ป๊ฒ ์ฑ๊ธฐ๋์ง?
- A: ๊ฐ์ธ ์ญ๋์ ๋ฌ๋ฆฐ ๋๋... ๊ฐ๋ฐ์๊ฐ ์ต์ ํ ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ฌ์์ ์ ๊ฒฝ์จ์ฃผ์ง ๋ชปํ๋ ๋๋์ด๋ค. (ํ์์ ์ธ ์์ญ์ด๋ผ๊ณ ์๊ฐ์ ๋ชปํ๋ ๋ฏ)
- Q: ํ ์ด๋ธ ํํ ์ ๋ณด์ด์ง ์๋ ๋ถ๋ถ ๋ ๋๋ง ๋์ง ์๋๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ?
- A:
react-hook-form์ useFieldArray ์ฌ์ฉ ์ฌ๋ก
- https://tech.inflab.com/202207-rallit-form-refactoring/react-hook-form/#2-2-2-๋ฐฐ์ด-๊ด๋ฆฌ---usefieldarray
- https://youtu.be/4MrbfGSFY2A (7๋ถ 50์ด ์ฏค)
-
์ฌ์ง์ด๋ ๋์์ ํ๋ ์๊ณผ ๋ฌ๋ฆฌ ๋ฐํํ๋ UI โ์ค๋ ์ทโ์ ๋ํํ์ ๋๋ค.
- ์ญ์ ์ฌ์ฉ์์์ ์ธํฐ๋์ ์ ์ฑ ์์ง๋ ํํธ๋ผ๋ ๊ฒ ํ๋ก ํธ์๋์ ๋ฌ๋ฏธ๋ผ๊ณ ์๊ฐ
- ์ฌ์ฉ์์ ๊ฐ์ฅ ๋ง๋ฟ์ ์๋ ์ง๋ฌด
- ์ ์ ์ ๋ํ ์ ๋ขฐ๋ฅผ ์์ด๊ฐ๊ณ ์์ด์. ใ ใ ์์์น ๋ชปํ ๋์๊ณผ ์ ๋ ฅ๋ค
-
React๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ ๋,
- React๊ฐ ํจ์๋ฅผ ๋ค์ ํธ์ถํฉ๋๋ค.
- ํจ์๊ฐ ์๋ก์ด JSX ์ค๋ ์ท์ ๋ฐํํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด React๊ฐ ๋ฐํํ ์ค๋ ์ท๊ณผ ์ผ์นํ๋๋ก ํ๋ฉด์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ง๊ด์ ์ผ๋ก๋ ์ดํด๊ฐ ๋์ง๋ง, ์ ํํ๊ฒ ๋ฌด์จ ํ๋ก์ธ์ค์ธ์ง ์ดํด๊ฐ ๋์ง๋ ์๋ค์. ์ฌ๋ฌ๋ฒ ์ฝ์ผ๋ฉฐ ์๊ฐํด๋ด์ผ๊ฒ ์ด์.
-
์ปดํฌ๋ํธ์ ๋ฉ๋ชจ๋ฆฌ๋ก์จ state๋ ํจ์๊ฐ ๋ฐํ๋ ํ ์ฌ๋ผ์ง๋ ์ผ๋ฐ ๋ณ์์ ๋ค๋ฆ ๋๋ค. state๋ ์ค์ ๋ก ํจ์ ์ธ๋ถ์ ๋ง์น ์ ๋ฐ์ ์๋ ๊ฒ์ฒ๋ผ React ์์ฒด์ "์กด์ฌโํฉ๋๋ค.
- ์ํ๋ฅผ ์ปดํฌ๋ํธ ๋ด์ ์ ์ํ๋ค ๋ณด๋๊น ์ปดํฌ๋ํธ์ ์ข ์๋๋ค๊ณ ์๊ฐํ๋๋ฐ React๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ด ๋ ๋ง์ด ๋๋ค์.
- ๊ทธ๋ฆผ์ด ์์์ผ๋ฉด React๊ฐ ์๊ธฐ ์ ๋ฐ์ ์ํ๋ฅผ ๊ฐ๊ณ ์๋ค๋ ๊ฑธ ์ดํดํ๊ธฐ ์ด๋ ค์ ์ ๊ฒ ๊ฐ๋ค.
- ๋ค๋ฅธ ๊ณต์ ๋ฌธ์๋ ์ด๋ ๊ฒ ์ผ๋ฌ์คํธ๊น์ง ๋ง๋ค๋ฉด์ ๊ณต๋ค์ด๋ ๊ฑธ ๋ชป ๋ณธ ๊ฒ ๊ฐ๋ค.
- ๋ฌธ์๊ฐ ์๋๋ผ ์ ํ์ฒ๋ผ ์๊ฐํ๊ณ ๋ง๋ ๊ฒ ๊ฐ๋ค.
- React์ ์ ์ง๋ฅผ ์ ์งํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ ์ผํ์ด ์๋๊น?
-
์ฝ๋์์ state ๋ณ์๋ฅผ ํด๋น ๊ฐ์ผ๋ก ๋์ ํ์ฌ ์ด๋ฅผ ์๊ฐํํ ์๋ ์์ต๋๋ค.
<button onClick={() => { setNumber(0 + 1); setNumber(0 + 1); setNumber(0 + 1); }} > +3 </button>
- ๋ณ์์ ๊ฐ์ ๋์ ํ๋ ๊ฒ์ด ์ดํดํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ์๊ฐํ์ ๊ฐ๋ ฅํ ํ์ ๋๊ผ์ด์!
- ์ ๋ ์ด ๋ถ๋ถ ๋ณด๋ฉด์ ์ ์ด๊ฑฐ๊ตฌ๋! ํ๊ณ ๊ฐํํ์ด์.
-
React๋ state ์ ๋ฐ์ดํธ๋ฅผ ํ๊ธฐ ์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
- setState ํธ์ถ๊ณผ ๋ ๋๋ง ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋ชจ๋ฅด๋ค๋ณด๋ ์ฌ๋ฌ setState ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ญ๊ฐ ๊ด์ฐฎ๋ ํ๋ ์ฐ์ฐํจ์ด ์์์ด์. ๊ทธ๋ฐ๋ฐ ์ค๋๋ถ๋ก ๊ฑฑ์ ์์ด ์ฌ์ฉํด๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
-
๋ฆฌ๋ ๋๋ง์ ๋ชจ๋ setNumber() ํธ์ถ์ด ์๋ฃ๋ ์ดํ์๋ง ์ผ์ด๋ฉ๋๋ค. ์ด๋ ์์์ ์์ ์ฃผ๋ฌธ๋ฐ๋ ์จ์ดํฐ๋ฅผ ์๊ฐํด ๋ณผ ์ ์์ต๋๋ค. ์จ์ดํฐ๋ ์ฒซ ๋ฒ์งธ ์๋ฆฌ๋ฅผ ๋งํ์๋ง์ ์ฃผ๋ฐฉ์ผ๋ก ๋ฌ๋ ค๊ฐ์ง ์์ต๋๋ค! ๋์ ์ฃผ๋ฌธ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฃผ๋ฌธ์ ๋ณ๊ฒฝํ๊ณ , ์ฌ์ง์ด ํ ์ด๋ธ์ ์๋ ๋ค๋ฅธ ์ฌ๋์ ์ฃผ๋ฌธ๋ ๋ฐ์ต๋๋ค.
- ๊น๋ํ ๋น์ ๋ผ ์ดํด๊ฐ ์ ๋๋ค์.
- ๊ธฐ์ต์ ๋จ๊ฒจ๋๊ณ ์ถ์ ๋น์ ๋ค.
- ๋ง์ง๋ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ๊ฑด ์ฃผ๋ฌธ์ด ๋ชจ๋ ๋๋ ๋ค๋ผ๋ ๊ฑธ ํ ์ฅ๋ฉด์ผ๋ก ์ ์ค๋ช ํ๋ค.
-
ํํ ์ฌ๋ก๋ ์๋์ง๋ง, ๋ค์ ๋ ๋๋ง ์ ์ ๋์ผํ state ๋ณ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ์ดํธ ํ๊ณ ์ถ๋ค๋ฉด setNumber(number + 1) ์ ๊ฐ์ ๋ค์ state ๊ฐ์ ์ ๋ฌํ๋ ๋์ , setNumber(n => n + 1) ์ ๊ฐ์ด ์ด์ ํ์ state๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ state๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
- ๊ณต์ ๋ฌธ์๋ ํํ ์ฌ๋ก๊ฐ ์๋๋ผ๊ณ ํ์ง๋ง, ์ ๋ ์ด๊ฑธ ์์ฒญ ์์ต์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ด์ ๋ฐ์ฑํ๊ฒ ๋๋ค์. ๋ณ์ ๊ด๋ฆฌ ์ ๋ฐ๋์ state๋ก ๊ด๋ฆฌํด์ผํ๋์ง, ์๋๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณ ๋ฏผํด๋ณด๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ์ต๋๋ค.
- ๋น์ฆ๋์ค ๋ก์ง์ด ์ด๊ธฐ ๊ธฐํ๊ณผ ๊ณ์ ๋ฌ๋ผ์ง๊ณ ์ธ๋ถ ์ฌํญ์ด ๋ถ์ผ๋ฉด์ ์ฒ์ ์ค๊ณ๋ณด๋ค ํฌ๊ณ ๋ณต์กํด์ง๋ฉด ๋ณ์๋ฅผ ํ๋ ํ๋ ๊ณ ๋ คํ๊ธฐ ์ด๋ ค์ ์ผ๋จ state์ ๋๋ ค๋ฐ๊ธฐ๋ ํ๋ค.
-
์ฌ๊ธฐ์ n => n + 1 ์ ์ ๋ฐ์ดํฐ ํจ์(updater function)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด๋ฅผ state ์ค์ ์ ํจ์์ ์ ๋ฌ ํ ๋,
- React๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ค๋ฅธ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋ ํ์ ์ด ํจ์๊ฐ ์ฒ๋ฆฌ๋๋๋ก ํ์ ๋ฃ์ต๋๋ค.
- ๋ค์ ๋ ๋๋ง ์ค์ React๋ ํ๋ฅผ ์ํํ์ฌ ์ต์ข ์ ๋ฐ์ดํธ๋ state๋ฅผ ์ ๊ณตํฉ๋๋ค.
- updater function๋ ๊ทธ๋ฅ ์ด์ ๊ฐ์ ๊ฐ์ ธ์์ ๊ณ์ฐํ๋ ค๊ณ ํ ๋๋ง ์ฌ์ฉํ๋๋ฐ ๋ ๋๋ง๊ณผ ๊ด๋ จ์ด ๊น์๋ค์. ํจ์๊ฐ ๊ทธ๋ฅ ์คํ๋๋ค๊ณ ์๊ฐํ์ง ํ์ ๋ฃ๋ ๋์์ด ๋นํ์ธ๋์์ ๋ฒ์ด์ง๊ณ ์๋ค๋ ๊ฑธ ๋ชฐ๋๊ณ ์์ ์์ ์ฒ๋ผ ๊ฐ์ setState๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ณธ ์ ์ด ์์ด์ ์์ ๋ฐ์ ๊ฒฐ๊ณผ์ ๋นํฉํ์ต๋๋ค.
-
- setNumber(number + 5): number ๋ 0 ์ด๋ฏ๋ก setNumber(0 + 5)์ ๋๋ค. React๋ โ5๋ก ๋ฐ๊พธ๊ธฐโ ๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
- setNumber(n => n + 1): n => n + 1 ๋ ์ ๋ฐ์ดํฐ ํจ์์ ๋๋ค. React๋ ์ด ํจ์๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
- setNumber(42): React๋ โ42๋ก ๋ฐ๊พธ๊ธฐโ ๋ฅผ ํ์ ์ถ๊ฐํฉ๋๋ค.
- ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋๋ฐ ์์ธ๋ฅผ ํ์ ํ๊ธฐ ํ๋ค ๋, ์ด๋ฐ ์์ผ๋ก ํด๋น ์ฝ๋๊ฐ ์ํํ๋ ๊ณผ์ ์ ์์ฐ์ด๋ก ๋ฐ๊พธ์ด ์ ์ด๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์์.
- Rubber duck debugging์ด ๋ ์ฌ๋๋ค.
- ์ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ค๋ฅธ ๊ฐ๋ฐ์ ๋ถ์๊ฒ ์ค๋ช ํ๋ ค๊ณ ์์ฑํ๋ค๊ฐ ๊ฐ์๊ธฐ ๋ฒ๊ทธ์ ์์ธ์ ๊นจ๋ซ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
-
์ ๋ฐ์ดํฐ ํจ์๋ ์์ํด์ผ ํ๋ฉฐ ๊ฒฐ๊ณผ๋ง ๋ฐํ ํด์ผ ํฉ๋๋ค. ์ ๋ฐ์ดํฐ ํจ์ ๋ด๋ถ์์ state๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ค๋ฅธ ์ฌ์ด๋ ์ดํฉํธ๋ฅผ ์คํํ๋ ค๊ณ ํ์ง ๋ง์ธ์.
- ์ ๋ฐ์ดํฐ ํจ์ ๋ด์์ ๋ค๋ฅธ๊ฑธ ํ๋ ค๊ณ ํ๋ ์ ์์ ์ ๋ฐ์ฑํฉ๋๋ค..
-
๋ช ๋ช ๊ท์น ์ ๋ฐ์ดํฐ ํจ์ ์ธ์์ ์ด๋ฆ์ ํด๋น state ๋ณ์์ ์ฒซ ๊ธ์๋ก ์ง์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
setEnabled(e => !e); setLastName(ln => ln.reverse()); setFriendCount(fc => fc * 2);
์ข ๋ ์์ธํ ์ฝ๋๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ setEnabled(enabled => !enabled)์ ๊ฐ์ด ์ ์ฒด state ๋ณ์ ์ด๋ฆ์ ๋ฐ๋ณตํ๊ฑฐ๋, setEnabled(prevEnabled => !prevEnabled)์ ๊ฐ์ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ท์น์ ๋๋ค.
- ์ด๋ฐ ์ปจ๋ฒค์ ์ด ์๋ ์ค ์ฒ์ ์์๋ค์.. ์ง๊ธ๊น์ง setData(prev => !prev) ๊ฐ์ ์์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋๋ฐ ์ข ๋ ์๋ฉํฑํ๊ฒ ์์ฑํ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ์ต๋๋ค~
- ์ฝ๊ธฐ ์ข์ ์ฝ๋๋ ์ด๋ฐ ๋ํ ์ผ์ด ๋ชจ์ฌ์ ๊ฒฐ์ ๋๋ค.
- prev์ ๊ฐ์ ํํ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฐฐ์์ ๊ทธ๋ ๊ฒ ์จ์๋๋ฐ ์ข์ ์ปจ๋ฒค์ ์ ๋ฐฐ์๊ฐ๋๋ค! ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ปจ๋ฒค์ ์ผ ๊ฒ ๊ฐ์์.
-
Challenge 1 of 2: ์์ฒญ ์นด์ดํฐ๋ฅผ ๊ณ ์ณ๋ณด์ธ์.
- ์ด ์ฑ๋ฆฐ์ง ์ฌ๋ฐ์ด๋ณด์ด๋ค์! ์คํฐ๋ ๋๋๊ณ ํผ์ ์๋ํด๋ด์ผ๊ฒ ์ต๋๋น
-
ํ์ง๋ง ๋ฆฌ์กํธ state์ ๊ฐ์ฒด๋ค์ด ๊ธฐ์ ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ง๋ผ๋, ์ซ์, ๋ถ๋ฆฌ์ธ, ๋ฌธ์์ด๊ณผ ๊ฐ์ด ๋ถ๋ณ์ฑ์ ๊ฐ์ง ๊ฒ์ฒ๋ผ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ๊ต์ฒดํด์ผ ํฉ๋๋ค.
- ์ค์ํ ํฌ์ธํธ๋ค์.
- ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ์ฐธ์กฐ์ ๋ํด ๋ถ๋ณ์ฑ์ ์ ์งํด์ฃผ์ง ์๋ ๊ฒฝ์ฐ๋ ์ฃผ์ํด์ผ๊ฒ ์ด์.
-
๋ค์ ๋งํ๋ฉด, state์ ์ ์ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ์ด๋ค ๊ฒ์ด๋ผ๋ ์ฝ๊ธฐ ์ ์ฉ์ธ ๊ฒ์ฒ๋ผ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.
- ์ฝ๊ธฐ์ ์ฉ์ด๋ผ๊ณ ํ๋๊น ์๋ฟ์์ ์ข์์.
-
<div onPointerMove={(e) => { position.x = e.clientX; position.y = e.clientY; }} />
- ์ด๋ฐ ์ด๋ฒคํธ๊ฐ ์๊ตฐ์..! ์ง๋ ์๊ฐ์ ํ๋ ์ด์ผ๊ธฐ์ ์ด์ด, ์ด๋ฐ html๊ธฐ๋ณธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฐ๋ ๊ฑธ ๋ง์ด ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ์์
-
ํ์ง๋ง ์ด ์ฝ๋๋ ๋ฐฉ๊ธ ์์ฑํ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ์ ์ ํฉ๋๋ค.
const nextPosition = {}; nextPosition.x = e.clientX; nextPosition.y = e.clientY; setPosition(nextPosition);
- setState ์์ ๋ค์ด๊ฐ ๋ก์ง์ด ์กฐ๊ธ ๋ณต์กํ๋ฉด ๊ฐ๋ ์ฑ์ ์ํด์ ์๋ก ๋บ๋๋ค. ๊ณต์ ๋ฌธ์๊ฐ ๊ถ์ฅํ๋ ๋ฐฉ์์ด๋ผ๋ ์ข๋ค์!
-
์ด๊ฒ์ โ์ง์ญ ๋ณ๊ฒฝ local mutationโ ์ด๋ผ๊ณ ํฉ๋๋ค. ๋ ๋๋งํ๋ ๋์ ์ง์ญ ๋ณ๊ฒฝ์ ํ ์๋ ์์ผ๋ฉฐ, ์ด๋ ์์ฃผ ํธ๋ฆฌํฉ๋๋ค!
- ์ด๋ฏธ ์ด๋ฐ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ๊ณ ์์๋๋ฐ ์ง์ญ ๋ณ๊ฒฝ local mutation์ด๋ผ๋ ๋ช ์นญ์ด ์์๋ค์. ๊ณต์์ด ํ๋ฝํ ๋ฐฉ์์ด๋ผ๋ ์๊ฐ์ ๋ง์์ด ํธํด์ก์ต๋๋ค
- ์๋ํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์์ ์ฝ๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค. ๊ธฐ์กด ์ฝ๋์ ์ผ๊ด์ฑ์ ๋ง์ถ๊ธฐ ์ํด ๋ฐ๋ผํ๋๋ฐ ์ ๋ฌธ์ ๊ฐ ์๋์ง ์ดํดํ๊ฒ ๋๋๊น ๋ถ์๊ฐ์ด ์ฌ๋ผ์ก๋ค.
-
Using a single event handler for multiple fields
์๋์๋ ์ด์ ์์ ์ ๊ฐ์ง๋ง, ์ธ ๊ฐ์ ๋ค๋ฅธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋์ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๋ ์์ ๊ฐ ์์ต๋๋ค.
function handleChange(e) { setPerson({ ...person, [e.target.name]: e.target.value, }); }
- react-hook-form์์ name์ ํญ์ ์์ฑํ๋๋ก ํ๋๋ฐ ๊ทธ๊ฒ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ ์ดํ๊ธฐ ์ํด์์๊ตฐ์.
-
obj1 ๊ฐ์ฒด๋ obj2 โ์โ์ ์์ต๋๋ค. obj3 ๋ํ obj1์ โ๊ฐ๋ฆฌํฌโ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์ด ๋ฌธ์์ ๊ฐ๋ณด๋ ์ญ์ point๋ผ๊ณ ๋์ด ์๋ค์. ํฌ์ธํฐ ๋ฐฐ์ธ ๋ ๋จธ๋ฆฌ๋ฅผ ์ธ๋งธ๋ ๊ธฐ์ต์ด ์๋ก์๋ก ๋ฉ๋๋ค.
-
ํ๋กํผํฐ๋ฅผ ํตํด ์๋ก๋ฅผ โ๊ฐ๋ฆฌํค๋โ ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋๋ค.
- ์ค์ฒฉ๋๊ฒ ์๋๋ผ ์๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๋ค ๋ผ๋ ์๋ก์ด ๊ฐ๋ ์ ์ป์ด๊ฐ๋ค์!
-
Immer๋ ํธ๋ฆฌํ๊ณ , ๋ณ๊ฒฝ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ ๋ณต์ฌ๋ณธ ์์ฑ์ ๋์์ฃผ๋ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Immer๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑํ ์ฝ๋๋ โ๋ฒ์น์ ๊นจ๊ณ โ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
- ์ด๋ฒ์๋ immer์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ๋์๋๋ฐ, ์์ ์ฝ๋์ ๊ฐ์ ์ํฉ์์๋ผ๋ฉด ๊ฝค ์ ์ฉํด๋ณด์ด๋ค์๐ฒ ์ค์ฒฉ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ์ฝ๋๋ฅผ useImmer๋ผ๋ ์ผ์ข ์ ์ถ์ํ๋ hook์ ์ด์ฉํด ๊ด๋ฆฌํ ์ ์์ด ์ฝ๋๊ฐ ๊น๋ํด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค
-
Immer๊ฐ ์ ๊ณตํ๋ draft๋ Proxy๋ผ๊ณ ํ๋ ์์ฃผ ํน๋ณํ ๊ฐ์ฒด ํ์ ์ผ๋ก, ๋น์ ์ด ํ๋ ์ผ์ โ๊ธฐ๋กโ ํฉ๋๋ค.
- react-hook-form์์ formState๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋๋ฐ ์ด๊ฒ๋ Proxy๋ฅผ ์ด๋ค๊ณ ์๊ณ ์์ด์. design and philosophy ์ฐธ๊ณ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ณต๋ถํ ๊ฒ ๋ง์์ ๊นจ๋ซ์ต๋๋ค.
-
Why is mutating state not recommended in React?
- ๋ฅ ๋ค์ด๋ธ ๋ด์ฉ์ ํตํด ๋ฒ๊ทธ ๋ฐฉ์ง ์ธ์๋ ๋ถ๋ณ์ฑ์ ๊ถ์ฅํ๋ ์ด์ ๋ฅผ ๋ ์๊ฒ ๋์ด ์ข์์ต๋๋ค.
-
๋ณดํธ์ ์ธ ๋ฆฌ์กํธ ์ต์ ํ ์ ๋ต
- ์์ด ๊ณต์ ๋ฌธ์์์๋ memo ํ์ด์ง๋ก ๋งํฌ๋ฅผ ๊ฑธ์ด๋๋๋ฐ ์ฌ๊ธฐ์๋ ์์ง ํ์ด์ง๊ฐ ์๋๋ด์!
- ๋งํฌ ๊นจ์ง ๊ฑฐ PR ์ฌ๋ ค๋ณด๋ฉด ์ข๊ฒ ๋ค์ ใ ใ
-
Challenge 1 of 3: ์๋ชป๋ state ์ ๋ฐ์ดํธ ๊ณ ์น๊ธฐ Challenge 2 of 3: ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ์ ๊ณ ์น์ธ์
- ์ธ ๋ฒ์งธ ์ฑ๋ฆฐ์ง๋ immer๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ ์ต์ํ์ง ๋ชปํด์ ํ์ง ๋ชปํ๋๋ฐ ๋๋จธ์ง ์ฑ๋ฆฐ์ง๋ค ์ฌ๋ฏธ์์ด์.
- Q: ์คํ ์์ค ์ฝ๋๋ฅผ ๋ฏ์ด ๋ณธ ์ ์ด ์๋์ง?
- A: ํ์ ์คํฌ๋ฆฝํธ ์ง์์ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ ๋์์ ํ์ธํ๊ณ ์ฝ๋๋ฅผ ์์ฑํด๋ณธ ์ ์ด ์๋ค. ์ ๋ง ์ด๊ฑฐ ์์ผ๋ฉด ์ผ์ด ์ ๋๋ค ํ๋ ๊ฒฝ์ฐ์ ๋ฏ์ด ๋ณด๊ฒ ๋๋ค.
- A: lodash์ debounce๋ throttle์ ์ฌ์ฉํ ๋ CTO๋์ด ์ด๋ป๊ฒ ๋ง๋ค์๋์ง ์๊ณ ์ฐ๋ ๊ฒ์ด ์ข๋ค๊ณ ํด์ ์ฝ๋๋ฅผ ์ฐพ์ ๋ณธ ์ ์ด ์๋ค.
- A: ํ ์ค์ slash๋ react์์ ์ธ ์ ์๋ ๋ค์ํ ์ ํธ ์ปดํฌ๋ํธ ๋ชจ์๋ ๋๋์ด๋ผ ํ์ํ ๋ ์กฐ๊ธ์ฉ ๊น์ ๋ณธ๋ค. ๊ตญ๋ด์์๋ ์ด๋ ๊ฒ ์คํ์์ค๋ฅผ ๊ณต๊ฐํ๊ณ ๋ฉ์ธํ ์ด๋๋ก ์ฐธ์ฌํ๋ ์ฌ๋๋ค์ด ์๋ค๋!
- React๋ ์ถ์ฒํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ต ์๋ฃ
- ๋ฒ์ญ ํ๋ก์ ํธ๋ฅผ ์ถ์งํ ์ด๋ณด๋ผ๋์ ์๊ฐ ๊ธ
-
๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐฐ์ด ์ ๋ฐ์ดํธํ๊ธฐ
- ๋ฐฐ์ด์ state๋ก ๊ฐ์ง ๋ ์ผ์ด๋ ๋งํ ์ํฉ์ ๋ํ ์์ ๋ค์ด ์๋์ ์ ๋์์์ด์ ๋ง์ด ์ฐธ๊ณ ํ๊ฒ ๋ ๊ฒ ๊ฐ์์!
- ์ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ธ ๋ ์ด๋ฐ ์ผ์ด์ค๋ฅผ ํ๋์ฉ ๋ง๋ฅ๋จ๋ฆด ๋๋ง๋ค ๊ตฌ๊ธ๋งํ๋ฉฐ ํ์๋ ๊ธฐ์ต์ด ๋๋ค์.
-
๋ค์์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด ์ฐ์ฐ์ ๋ํ ์ฐธ์กฐ ํ์ ๋๋ค. React state ๋ด์์ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋, ์ผ์ชฝ ์ด์ ์๋ ํจ์๋ค์ ์ฌ์ฉ์ ํผํ๋ ๋์ , ์ค๋ฅธ์ชฝ ์ด์ ์๋ ํจ์๋ค์ ์ ํธํด์ผ ํฉ๋๋ค.
๋น์ ํธ (๋ฐฐ์ด์ ๋ณ๊ฒฝ) ์ ํธ (์ ๋ฐฐ์ด์ ๋ฐํ) ์ถ๊ฐ push, unshift concat, [...arr] ์ ๊ฐ ์ฐ์ฐ์ (์์) ์ ๊ฑฐ pop, shift, splice filter, slice (์์) ๊ต์ฒด splice, arr[i] = ... ํ ๋น map (์์) ์ ๋ ฌ reverse, sort ๋ฐฐ์ด์ ๋ณต์ฌํ ์ดํ ์ฒ๋ฆฌ (์์) - ํ๋์ ๋ณผ ์ ์๊ฒ ํ๋ก ์ ๋ฆฌ๋์ด ์์ด์ ์ข์์! ๊ทธ๋ฌ๊ณ ๋ณด๋ UI ์์ ํ ๋๋ ์ค๋ฅธ์ชฝ๋ง ๊ฑฐ์ ์ฌ์ฉํ๋ค์.
-
๋๋ ๋ ์ด์ ํจ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ Immer๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ณต์ ๋ฌธ์๊ฐ ์์ฒญ ์ ๊ทน์ ์ผ๋ก Immer๋ฅผ ์์ ํ๋๊ตฐ์.. Immer ๋ฉ์ธํ ์ด๋๊ฐ ๊ถ๊ธํด์ ธ์ ์ฐพ์๋ดค๋๋ฐ ๋ฉํ ๊ทผ๋ฌดํ๋ ๊ฐ๋ฐ์์๋ค์ Github ๋งํฌ
- ๋ค ์ด์ ๊ฐ ์์๊ตฐ์. ๐ ์ํ์ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ผ๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ์๋ฐ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ณต์กํด์ง๋ฉด ์ ๋๋ ๊ฑฐ ์๋๊ฐ ํ๋ ์๊ฐ์ด ๋ค์ด์.
-
์ํ๊น์ง๋ง, slice์ splice ํจ์๋ ์ด๋ฆ์ด ๋น์ทํ์ง๋ง ๋ชน์ ๋ค๋ฆ ๋๋ค.
- slice๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด ๋๋ ๊ทธ ์ผ๋ถ๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค.
- splice๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํฉ๋๋ค. (ํญ๋ชฉ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํฉ๋๋ค.)
React์์๋, state์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ ์ข๊ธฐ ๋๋ฌธ์ slice (p๊ฐ ์์ต๋๋ค!)๋ฅผ ํจ์ฌ ๋ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
- ์ด ๋๊ฐ๋ฅผ ์ ๋ ์ข ์ข ํท๊ฐ๋ ค์ ๋ฆฌ๋ง์ธ๋๋ฅผ ์ํ ๊ธฐ๋ก์ฐจ ์ด๋ ธํ ์ด์ ๋ฌ์๋ก๋๋ค
-
์ค์ฒฉ๋ state๋ฅผ ์ ๋ฐ์ดํธํ ๋, ์ ๋ฐ์ดํธํ๋ ค๋ ์ง์ ๋ถํฐ ์ต์์ ๋ ๋ฒจ๊น์ง์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
- ์์ ์๋ ์ด ์์ ์ ๊ฐ๋จํ๊ฒ ํ๊ธฐ ์ํด lodash์ deepClone๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์์ฆ์๋ ๊ฑฐ์ ์ง๋ ์๊ฐ์ ์๊ฐ๋๋ฆฐ structuredClone ๋ฉ์๋๋ก ๋์ฒดํ๊ณ ์์ต๋๋ค~
-
map์ ์ฌ์ฉํ๋ฉด ์ด์ ํญ๋ชฉ์ ๋ณ๊ฒฝ ์์ด ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ผ๋ก ๋์ฒดํ ์ ์์ต๋๋ค.
- ๊ตณ์ด ๊น์ ๋ณต์ฌ๊น์ง ๊ณ ๋ คํ์ง ์์๋ ์์ฝ๊ฒ+์์ ํ๊ฒ ๊ฐ์ฒด์ ๋ถ๋ณ์ ฉ์ ์ ์งํ๋ฉฐ state๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ตฐ์! ๊ด์ต์ ์ผ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํ๊ณ ์๊ธฐ๋ ํ๋๋ฐ, ์ ํํ ์ด์ ๋ฅผ ์๊ฒ๋์ด ์ข์ต๋๋น