당근먹는하니
귀엽고 행복해
당근먹는하니
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 다람쥐🐿 (26)
    • C++ 공부빵야 (7)
    • 공부👻 (5)
    • 프론트엔드✏️ (228)
      • 코드캠프 (120)
      • 팀 프로젝트✨ (31)
      • 개인공부 (67)
    • 프론트엔드 - 바닐라js (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 팀플
  • refreshtoken
  • 자바스크립트
  • 프론트엔드
  • react
  • 팀 프로젝트
  • 리액트
  • HTML
  • next.js
  • 배열
  • 코드캠프
  • 팀프로젝트
  • 회고
  • 코딩 부트캠프
  • CSS
  • javascrpit
  • ssg
  • javascript
  • 부트캠프
  • emotion
  • React-hook-form
  • JS
  • 알고리즘
  • typescript
  • graphql
  • algorithm
  • 배포
  • 공통 컴포넌트
  • 코딩
  • 프로그래머스

최근 댓글

최근 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
당근먹는하니

귀엽고 행복해

[react] 계산기/새로고침해도 선택값 유지하기
프론트엔드✏️/개인공부

[react] 계산기/새로고침해도 선택값 유지하기

2023. 3. 3. 14:38
728x90
반응형

 토큰을 선택했을 때 새로고침을 해도 초기값으로 바뀌지 않게 해보기!!!

 

 리액트에서 상태(state)가 새로고침될 때마다 초기값으로 돌아가는 것은 정상적인 동작이다. 페이지를 다시 로드할 때마다 새로운 인스턴스를 만들고 상태를 초기화한다. 

 

 그럼 값을 유지하려면? 그 값들을 컴포넌트 외부에 저장하기

 

<div className="flex flex-row justify-between">
                <input
                  type="number"
                  value={removeZeros(input)}
                  onChange={onChangeInput}
                  className="w-full text-xl bg-transparent text-zinc-200 appearance-none"
                  placeholder="0.0"
                />
                <div onClick={() => setTokenModalOpen(true)}>
                  <Label data={token} />
                </div>
              </div>

지금 코드는 이렇다... <Label/>에 token data를 넘기고 <Label/>안에선 이름만 출력해주는 식이다. 

 

const [token, setToken] = useState(tokens[0]);
const [token2, setToken2] = useState(tokens[1]);

...

{isTokenModalOpen && (
          <div>
            <Select setToken={setToken} setModalOpen={setTokenModalOpen} />
          </div>
        )}

Select라는 컴포넌트에 setToken을 전달해서 이 안에서 토큰을 세팅하게 한다. 

 

// 메인화면의 토큰 세팅
    props.setToken({
      id,
      name,
    });
       localStorage.setItem('token', JSON.stringify({ id, name }));
    props.setModalOpen(false);

이 부분에 로컬 스토리지를 이용하는 코드를 썼다. 

 

  useEffect(() => {
    const recentList = JSON.parse(sessionStorage.getItem("recentList") || "[]");
    setRecentTokens(recentList);

    const savedTokens = localStorage.getItem("token");

    if (savedTokens) props.setToken(JSON.parse(savedTokens));
  }, []);

useEffect에도 코드를 추가했다.

 

음 근데 새로고침해도 날라가네? 

 

useEffect를 쓴 곳이 Select 안이고, (Select는 라벨을 눌러야만 뜨기 때문에)라벨을 누르지 않고 새로고침을 하니 아예 useEffect 함수가 실행되지 않은 것이다.

 

그럼 savedTokens를 가져와서 세팅해주는 부분을 main으로 가져오면 될 것 같다.

그냥 잘라내서 부모 컴포넌트로 옮겼다. 

 

 

 

가져왔는데 반응이 없다.

savedTokens가 잘못됐나? 싶어서

setToken({ name: "HANI", id: "hani" });
 
로 해봤는데 적용되지 않는다. 
 
타이밍 차인가? 
근데 set함수를 쓰면 리렌더링이 일어나야 하는 거 아닌가?...
같은 값으로 바꾼 것도 아니고
 
 
    useEffect(() => {
      setToken(token);
      setToken2(token2);
    }, [token, token2]);

이런 대체 왜 있는지 모르겠는 그리고 의미가 없지않나 싶은 함수를 지우니 바로 해결됐다. 

뭘까... 왜 저렇게 써놨지? 조금 부끄럽네

 

 

728x90
반응형
저작자표시 비영리 동일조건 (새창열림)

'프론트엔드✏️ > 개인공부' 카테고리의 다른 글

[react] 계산기/ 무한 리렌더링, 맨 왼쪽의 0 좀 빼줘  (0) 2023.03.06
[react] 계산기/input 두 개가 서로 영향받게 하기  (0) 2023.03.03
[react] 리액트 리렌더링  (0) 2023.03.02
[firebase] googleLogin()  (0) 2023.02.07
[Next.js] tailwind 설치  (0) 2023.01.19
    '프론트엔드✏️/개인공부' 카테고리의 다른 글
    • [react] 계산기/ 무한 리렌더링, 맨 왼쪽의 0 좀 빼줘
    • [react] 계산기/input 두 개가 서로 영향받게 하기
    • [react] 리액트 리렌더링
    • [firebase] googleLogin()
    당근먹는하니
    당근먹는하니

    티스토리툴바