Selectors
20251 ワード
src/atoms.tsx
toDoSelectorはarrayを返さないため、
import { atom, selector } from "recoil";
export const categoryState = atom({
key: "category",
default: "TO_DO",
});
export interface IToDo {
text: string;
id: number;
category: "TO_DO" | "DOING" | "DONE";
}
export const toDoState = atom<IToDo[]>({
key: "toDo",
default: [],
});
//toDo를 카테고리 별로 분류
export const toDoselector = selector({
key: "toDoSelector",
get: ({ get }) => {
const toDos = get(toDoState);
const category = get(categoryState);
return toDos.filter((toDo) => toDo.category === category);
},
});
components/ToDoList.tsximport { useRecoilValue } from "recoil";
import { toDoselector, toDoState } from "../atoms";
import CreateToDo from "./CreateToDo";
import ToDo from "./ToDo";
function ToDoList() {
const [toDo, doing, done] = useRecoilValue(toDoselector);
return (
<div>
<h1>To Dos</h1>
<hr />
<CreateToDo />
<h2>To DO</h2>
<ul>
{toDo.map((toDo) => (
<ToDo key={toDo.id} {...toDo} />
))}
</ul>
<hr />
<h2>Doing</h2>
<ul>
{doing.map((toDo) => (
<ToDo key={toDo.id} {...toDo} />
))}
</ul>
<hr />
<h2>Done</h2>
<ul>
{done.map((toDo) => (
<ToDo key={toDo.id} {...toDo} />
))}
</ul>
</div>
);
}
export default ToDoList;
atom
は単純な配列です.selector
は原子のoutput
を変形させる.toDoSelectorはarrayを返さないため、
[toDo,doing,done]
でエラーが発生します.import { useRecoilValue, useRecoilState } from "recoil";
import { toDoselector } from "../atoms";
import CreateToDo from "./CreateToDo";
import { categoryState } from "./../atoms";
import ToDo from "./ToDo";
function ToDoList() {
const toDos = useRecoilValue(toDoselector); 👉 수정
const [category, setCategory] = useRecoilState(categoryState);
const onInput = (event: React.FormEvent<HTMLSelectElement>) => {
//Select의 value를 알려주는 함수
setCategory(event.currentTarget.value);
};
return (
<div>
<h1>To Dos</h1>
<hr />
<select value={category} onInput={onInput}>
<option value="TO_DO">To Do</option>
<option value="DOING">Doing</option>
<option value="DONE">Done</option>
</select>
<CreateToDo />
{toDos?.map((toDo) => (
<ToDo key={toDo.id} {...toDo} />
))} 👉 toDos.map() 이용
</div>
);
}
export default ToDoList;
Reference
この問題について(Selectors), 我々は、より多くの情報をここで見つけました https://velog.io/@gktmd652/Selectorsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol