์ด์ ์ ์ฐ๋ redux, redux-toolkit ์ด ๋๋ฌด ๋ถํธํ๊ธฐ ๋๋ฌธ
recoil์ ์ํ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ํธ๋ฆฌ ์ด๋๊ฐ์ ๋ํ๋๋ RecoilRoot
๊ฐ ์ฐ์
import React from 'react';
import {
RecoilRoot,
atom,
selector,
useRecoilState,
useRecoilValue,
} from 'recoil';
function App() {
return (
<RecoilRoot>
<CharacterCounter />
</RecoilRoot>
);
}
์ํ์ ๋จ์์ด๋ฉฐ ์
๋ฐ์ดํธ๋๋ฉด ์ด ๋จ์๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ ์๋ก์ด ๊ฐ์ ๋ฐ์ํ์ฌ
๋ค์ ๋ ๋๋ง
const fontSizeState = atom({
key: 'fontSizeState',
default: 14,
});
์ฌ์ฉํ๋ ค๋ฉด ๋ฆฌ์กํธ hook์ usestate์ฒ๋ผ useRecoilstate๋ผ๋ hook์ผ๋ก atom์ ์๋ ๊ฐ์ state๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ณ๊ฒฝ๋ ๊ฐ์ atomํ์ผ์ state๋ก ์ ์ฅํ์ฌ ๊ทธ ์ ์ฅ๋ ๊ฐ์ ๋ค๋ฅธ Components๋ก ์ฉ์ดํ๊ฒ ๋ณด๋ผ ์ ์๊ฒ ๋๋ค.
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
return (
// setFontSize์ ๋ณํ๋ฅผ ์ค์ atom์ state ๊ฐ์ ๋ณํํ๊ฒ ๋๊ณ , ๊ทธ์ ๋์์ ๊ฐ์ state๊ฐ์ ์ฐ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ฐ๋ ์ฆ๊ฐํ๊ฒ ๋๋ค.
<button onClick={() => setFontSize((size) => size + 1)} style={{fontSize}}>
Click to Enlarge
</button>
);
}
๋ค๋ฅธ ์ )
const todoListState = atom({
key: 'todoListState',
default: [],
});
function TodoItemCreator() {
const [inputValue, setInputValue] = useState('');
const setTodoList = useSetRecoilState(todoListState);
const addItem = () => {
setTodoList((oldTodoList) => [
...oldTodoList,
{
id: getId(),
text: inputValue,
isComplete: false,
},
]);
setInputValue('');
};
const onChange = ({target: {value}}) => {
setInputValue(value);
};
return (
<div>
<input type="text" value={inputValue} onChange={onChange} />
<button onClick={addItem}>Add</button>
</div>
);
}
// ๊ณ ์ ํ Id ์์ฑ์ ์ํ ์ ํธ๋ฆฌํฐ
let id = 0;
function getId() {
return id++;
}
atoms๋ ๋ค๋ฅธ selectors๋ฅผ ๋ฐ์๋ค์ด๋ ์์ ํจ์. ์ด์ ์ vuex์์ ์ผ๋ mutations
๋ ๋ง์ด ๋ฎ์ ์๋ ๋ฏ ํ๋ค.
const todoListFilterState = atom({
key: 'todoListFilterState',
default: 'Show All',
});
const filteredTodoListState = selector({
key: 'filteredTodoListState',
get: ({get}) => {
const filter = get(todoListFilterState);
const list = get(todoListState);
switch (filter) {
case 'Show Completed':
return list.filter((item) => item.isComplete);
case 'Show Uncompleted':
return list.filter((item) => !item.isComplete);
default:
return list;
}
},
});
ํ๋์ selector์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํธํ๋ค๊ณ ์ฌ๋ฃ.
atom ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด get
ํจ์๋ฅผ, selector๋ฅผ ํ์ฉํ๋ ค๋ฉด, useRecoilValue
ํจ์๋ฅผ ์ฌ์ฉ