흐름을 잘 이해하기위해 수업끝나고 그려본 코드의 숲(?)이 오늘의 썸넬..!
Number.MAX_SAFE_INTEGER
int타입의 유효한 숫자 범위를 알려주는것
int는 2의 53제곱 -1까지만 유효하다...!
그래서 안쪽에 이렇게 나눠줘도 된다 !
((a%c) + (b%c))%c 는
(a+b)%c 와같다
<생각해보쟈>
Reduce를 사용한 풀이
function solution(n){
let prev = 0; //0번째 피보나치 수의 결과
let next = 1; //첫번째 피보나치 수의 결과
let sum = prev + next
const answer = new Array(n-1)
.fill(1)
.reduce((acc) =>{
sum = (prev + acc ) %1234567 //피보나치수
prev = acc; //n-2
next = sum;
return sum
},sum)
return answer
}
-useQuery
- 요청과 그림을 그려주는 부분(리렌더링) 모두 자동
화면이 그려질때 요청이가고 , data로 받아오고 자동으로 그 데이터를 가지고 화면에 그리게 된다-useLazyQuery
- 요청은 내가 하고싶을때 가능, 리렌더링 자동
함수를 실행할때 요청이 날아가서, 받아지게 되면 그때 data가 들어오는것
useQuery랑 같은데 실행을 원할때 (함수실행할때) 할수 있다-useApolloClient
- 요청도 수동으로 보내고, 리렌더링도 수동
데이터까지만 받아와주고 , 받아온애를 그리는건 내가 해야한다
axios랑 비슷한데 axios 쓸때 특정한 변수에 저장한 다음에 썼던것 기억 ! axios를 graphql로 쓴다고 생각!
어제했던 로그인페이지, 성공메인 페이지 부분에서
성공메인 페이지의 fetch쿼리를 recoil로 빼서 쓰면 더 편하지 않을까!
정보는 사이트별로 계속 불러와야하니까 !
- 그러면 로그인 버튼 누르는 순간 로그인하고, 유저정보까지 recoilState
에다가 저장해놓고 다른 사이트들에서는 한줄씩만 import해서 쓰자 !
- usequery는 자동으로 가고 오는거여서 안된다고 했지
그래서 useapolloclient를 사용해보겠어
로그인 페이지에서
const client = useApolloClient() 똑같이 해주고
client가 axios라고 생각해서 써보자
쿼리문(gql) 불러와주고
client.query({
query: FETCH_USER_LOGGED_IN
})
이렇게 쿼리를 보내면 될까?..로그인토큰을 같이 보내야 특정유저의 정보가 반영이 되겠지 !
(우리 이거 어제배운 토큰 로컬스토리지 저장했기 때문에 쓸수 있어 !)
그래서 우리가 어제 bearer 방식 써서 저장해서 보내준거고,,
context는 http같은 추가적인 부분의 요청을 보낼때 쓰는것``` client.query({ query: FETCH_USER_LOGGED_IN, context:{ headers: { Authorization: Bearer ${accessToken}, } } })```
이렇게 보내주고 담아주자
그럼 저 드디어 받아온 유저정보(resultUserInfo)를 변수에 담아서 recoilstate에 담아주자
localStorage.setItem("accessToken",accessToken)
localStorage.setItem("userInfo",userInfo)
똑같이 써주면 userInfo는 객체라서 안된다
문자열로 바꿔서 저장하고 그 문자열을 객체로 바꿔서 사용해야한다
localStorage.setItem("userInfo",JSON.stringify(userInfo))
문자열로 저장해주자
잊지말고 아폴로 설정가서 useEffect 해주자
(새로고침하면 날아가는거 말고 넣어주는거)
const userInfo = JSON.parse(localStorage.getItem("userInfo"))
객체로 바꿔서 넣어줘야하기때문에 이렇게 useEffect에 넣어주고
recoilstate 작성해주고!
흐름 파악하게 그림을 보면서 파악하자 !
후 수고했다 이제 브라우저로 가서 실행해보면
내가 정해준 userinfo까지 localstorge에 저장된걸 볼수 있다
form 태그와 button 타입
^ 예시 코드 기준으로 설명해보면
form 안에 있는것들을 대상으로
submit형식과 reset이 진행되는거고
원래 버튼누르면 함수가 실행되는 기능은
type이 button인 onclick한 함수만 실행된다 (나만의 버튼)
타입을 적지 않으면 default로 submit이 실행이 된다
form onsubmit에서는 buttob=button 해줘야 submit이 실행이 되지 않는다
form이 자동화된 라이브러리가 많다
react-form
redux-form
react-hook-form(가장간단)(훅폼이니까 함수형?)
formik...(가장유명)(클래스컴포넌트주로)
- 아주아주 친절한 react-hook-form
https://react-hook-form.com/
렌더카운트가 1이라고 자랑하는 모습이다
퍼포먼스가 훨씬 빠르다
어떻게 하길래 리렌더링이 안일어나지 ?
->컴포넌트에는
- 제어 컴포넌트 ( 내가 작성하는것마다 state를 줘서 작성할때마다 데이터가 저장)
일반 라이브러리가 사용하는것
- 비제어 컴포넌트 (작성을 input에 해도 state에 바로 저장 안하고 나중에 콕찍어서 가져오는것 )
리액트 훅 폼이 쓰고 있는거다 그래서 리렌더가 일어나지 않는다
- 우리는 공식 홈페이지의 advanced를 자주 볼 예쩡!
register 안에 onchange랑 저장하는 state랑 다 있어서
...register로 불러오고 (이름) 적어주면 된다
그럼 그 값들을 함수 안에서 써주려면 handlesubmit함수를 추가해주면
우리가 지금 입력한 state들이 함수 안으로 들어간다
그러면 이렇게 onchange~setstate~ input에 하나하나 적어줄 필요없이
form 태그로 16줄만에 완성 !!!
그리고 비제어 컴포넌트라서 리렌더가 글씨 쓸때 한번도 일어나지 않는걸 볼수 있다
- 우리 에러뜨는거 빨간색 줄! 조건문 넣어서 아니면
박스 띄워줬던 힘든것들! 그것도 폼이 있어 !
에러 검증해주는 라이브러리 yup !
yup에서 이름은 스트링이고,
나이는 숫자고 18넘어야하고.. 이렇게 간단하게 쓰면 에러 조건문 달필요없이 yup라이브러리를
이용해 검증해서 error 띄울수있다
얘는 독립적인 라이브러리라서
react -hook-form 혹은 formit이랑 같이 쓰는건데
리액트훅폼가면 yup같이쓰기가 따로 있다 ! (schema validation)
const {register, handleSubmit} = useForm({
여기에 활용할 리솔버를 써주면 된다
- 같이 쓰는 모습 resolver: yupResolver(schema)
다른거 쓰고싶으면 리솔버에 다른거 쓰면 된다
자자 설치가자
yarn add @hookform/resolvers yup
두개 한방에 설치
yup에러를 가져다가 쓴모습
이메일 검증(골뱅이와 . 과 문자형식은 yup에서 정해놓은규칙가져다가 쓴거!
나중에는 이 모든걸 컴포넌트형태로 만들어서.. story-book을 만든다
대표적인 크몽 스토리북 !
요런 스토리북은 프론트엔드 개발자가 만들어서 디자이너와 협업하는건데, 우리 회사엔 이런디자인들 있으니까 봐보시고 디자인하세요~ 하고 우리가 페이지를 만들어서 주소 보내주면 된다
yarn add storybook 이 있네..?!
컴포넌트로 빼서 쓴부분
props와 쓰는 방법들 정리하자