//atom.ts
import { atom } from "recoil";
export const isDarkAtom = atom({
key:"isDark",//고유 key
default:false //value
})
//App.tsx
//useRecoilValue는 value를 가져온다
const isDark = useRecoilValue(isDarkAtom);
return(
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
<GlobalStyled/>
<Outlet />
<ReactQueryDevtools initialIsOpen={true}/>
</ThemeProvider>
)
//useRecoilState은 value를 업데이트(수정) 가능하다
//useRecoilState은 배열형태 [원본값, 수정할Function(setFn)이름]
const [isDark, setterFn] = useRecoilState(isDarkAtom);
const toggleDarkMode = () =>setterFn((pre) => !pre)
export const toDoState = atom<IToDo[]>({
key:"todo",
default:[]
})
//atom의 toDoState를 가져와서 원하는 값들만 분류하여 return한다.
export const toDoSelector = selector({
key:"todoSelector",
get:({get}) => {
const toDos = get(toDoState)
return [
toDos.filter(i => i.category === "DOING"),
toDos.filter(i => i.category === "DONE"),
toDos.filter(i => i.category === "TO_DO")
]
}
})
//register는 value값 등 을 보여준다.
//onChange처럼 실시간으로 들어오는 인자 확인하고 싶다면 watch추가하여 확인console.log(watch())
//handleSubmit는 두개의 인자를 받는다. (유효할때 실행될 함수, 유효하지 않을때 실행될 함수)
//useForm(defaultValuse:{todo:"@naver"})기본값 설정 가능
const {register, handleSubmit, formState:{errors}} = useForm();
{/*
- HTML안의 required를 사용하면 개발자도구에서 삭제할 수 있기에 스크립트로 넣어준다
- pattern을 사용해 정규식 검사를 할 수 있다.
*/}
<input type="text" {...register("todo",{
required:"Please put text",
pattern:{
value:/^[A-Za-z0-9._%+-]+@naver\.com$/,
message:'only naver.com emails'
},
//validate : { (value) => !value.includes("nico") || "error message"}
validate:(value) => value.includes("kim") ? "No kim allowed" : true
})}/>
{/* formState의 errors를 사용해서 에러 메세지 노출 */}
<span>{errors?.todo?.message}</span>
<input type="text" {...register("name",{required:true,minLength:{
value:5,
message:"too short"
}})}/>
const onValid = (data:FormData) => {
if(data?password !== data?password1){
setError("password1",
{massage:"password are not the same"},
{shouldFocus:true}
)
}
}
validate : { (value) => !value.includes("nico") || "error message"}
recoil을 사용하면 복잡한 상태관리를 하지 않고 효율적이게 상태가 관리된다는것을 알게 되었고, Form을 사용하면서 복잡한 코드를 간결하게 작성할 수 있다는점을 알게되었다.
아직은 익숙하지 않지만 익숙해지도록 여러번 사용해봐야할거같다.