recoil
https://recoiljs.org/ko/docs/introduction/getting-started
useRecoilState()
Atom 선언
- atom 상태(state) 저장소 생성 |함수|설명| |-|-| |useRecoilState | 읽고 쓰기| |useRecoilValue|읽기| |useSetRecoilState|쓰기|
const textState = atom({
key: 'textState', // unique ID (with respect to other atoms/selectors)
default: '', // default value (aka initial value)
})
function CharacterCounter() {
return (
<div>
<TextInput />
<CharacterCount />
</div>
)
}
function TextInput() {
const [text, setText] = useRecoilState(textState)
const onChange = (event) => {
setText(event.target.value)
}
return (
<div>
<input type="text" value={text} onChange={onChange} />
<br />
Echo: {text}
</div>
)
}
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++
}
function TodoItem({ item }) {
const [todoList, setTodoList] = useRecoilState(todoListState)
const index = todoList.findIndex((listItem) => listItem === item)
const editItemText = ({ target: { value } }) => {
const newList = replaceItemAtIndex(todoList, index, {
...item,
text: value,
})
setTodoList(newList)
}
const toggleItemCompletion = () => {
const newList = replaceItemAtIndex(todoList, index, {
...item,
isComplete: !item.isComplete,
})
setTodoList(newList)
}
const deleteItem = () => {
const newList = removeItemAtIndex(todoList, index)
setTodoList(newList)
}
return (
<div>
<input type="text" value={item.text} onChange={editItemText} />
<input
type="checkbox"
checked={item.isComplete}
onChange={toggleItemCompletion}
/>
<button onClick={deleteItem}>X</button>
</div>
)
}
function replaceItemAtIndex(arr, index, newValue) {
return [...arr.slice(0, index), newValue, ...arr.slice(index + 1)]
}
function removeItemAtIndex(arr, index) {
return [...arr.slice(0, index), ...arr.slice(index + 1)]
}