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

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
당근먹는하니
프론트엔드✏️/개인공부

setState 리렌더링이 일어나지 않아, 모멘텀의 투두를 리액트로 바꾸기

setState 리렌더링이 일어나지 않아, 모멘텀의 투두를 리액트로 바꾸기
프론트엔드✏️/개인공부

setState 리렌더링이 일어나지 않아, 모멘텀의 투두를 리액트로 바꾸기

2022. 12. 5. 16:49
728x90
반응형
 const onSubmit = () => {
    const addValue: any = props.value;

    const listArr = list;

    listArr.push(addValue);
    console.log("listArr:::", listArr);
    setList(listArr);
    console.log("list:::", list);
    inputRef.current.value = "";
  };
return (
    <div>
      <ol id="answer">
        {list?.map((el: any, i: number) => (
          <li key={i}>{el}</li>
        ))}
      </ol>
      <Input
        placeholder={placeholder}
        onChange={onChangeInput}
        onKeyDown={onKeyPress}
        ref={inputRef}
      />
    </div>
  );
}

콘솔로보면 리스트는 변하는데...왜 리렌더링이 안될까?!

 

검색을 해보니, 

위에서 const listArr = list; 를 받아옴 -> 가리키는 곳이 같은 애가 복사됨(1004번지를 가리키는 애가 둘이 됨)

1004번지를 가리키고 있는 복제된 애한테 push를 함

setList(복제된 애); 는 복제된 애가 가리키고 있는 곳으로 세팅해줄 것임

근데 복제된 애도 1004번지, 원래 list도 1004번지를 가리키고 있기 때문에 변화가 없는 것으로 판단되고 리렌더가 일어나지 않는다.

 

 

인 것 같다.

 

  const addValue: any = props.value;

    const listArr = [...list];

    listArr.push(addValue);

    setList(listArr);

이렇게 써도 되고

 

 const addValue: any = props.value;

    const listArr = list;

    listArr.push(addValue);

    setList([...listArr]);

이렇게 써도 된다! 

 

 

 

https://icecokel.tistory.com/22

 

setState로 리렌더링이 안 되는 이유..

안녕하세요. 현재 토이 프로젝트로 실시간으로 렌더링이 중요한 작업을 진행하고 있었습니다. 컴포넌트의 state를 수정해도 리 렌더링이 되지 않아 골머리를 싸맸었는데, 아주 간단한 이유였습

icecokel.tistory.com

 

 


  const onSubmit = () => {
    if (list.length > 2) return;
    const addValue: any = props.value;

    const listArr = list;

    listArr.push(addValue);

    setList([...listArr]);

    inputRef.current.value = "";
  };


  return (
    <div>
      <ol id="answer">
        {list?.map((el: any, i: number) => (
          <li key={i}>{el}<button>X</button></li>
        ))}
      </ol>
      <Input
        placeholder={placeholder}
        onChange={onChangeInput}
        onKeyDown={onKeyPress}
        ref={inputRef}
      />
    </div>
  );
}

이제 세 개까지만 받는 것도 되고, 지우는 걸 만들어줘야 하는데 느낌대로 해보겠다...

X버튼을 달아줌 

 

 

const onClickDelete = (event: any) => {
    // event 로 들어온 애랑 같은 애는 없애구
    console.log(event.target.value);
    const tempArr = list.filter((el) => el !== event.target.value);
    console.log(tempArr);
    setList([...tempArr]);
  };

생각없이 이렇게 썼는데 생각해보니 event.target.value하면 안되지,,,! 

 

target.parentelement도 쓰고 해봤는데 잘 안됐다...

 

const onSubmit = () => {
    if (list.length > 2) return;
    const addValue: any = props.value;

    setList([
      ...list,
      {
        id: Date.now(),
        text: addValue,
      },
    ]);
    
 }

일단 이렇게 아이디랑 같이 넣어주는 식으로 바꿨다.

 

    const tempArr = list.filter((el) => el.id !== event.target.id);

이건 왜 안되는거지? 

 

el.id는 넘버고 event.target.id는 스트링이었다..!!!! 

 

  const onClickDelete = (event: any) => {
 
    const tempArr = list.map((el) => {
      if (el.id !== Number(event.target.id)) return el;
    });

    setList([...tempArr]);
  };
  const onKeyPress = (event: any) => {
    if (event.key === "Enter") {
      onSubmit();
    }
  };

왜 filter는 안되는거지? 

 

이제 지워지긴 하는데 정말 텍스트만 지워진다. 

 

undefined기 때문에... 

 

근데 filter를 쓰면 통으로 다 사라져 왜??? 

어떤 요소도 테스트를 통과하지 못했다~~~~~~~~~~~~

그럼 전부 다 아이디가 같다는소리냐??~~!~!~@~뭔소리야 ㅠ ㅠ ㅠㅠ ㅠㅠ ㅠ

 

조건 바꿔도 전부 다 지워지네 내가 뭔갈 잘못쓰고 있는게 틀림없음

 

 

괄호 문제였다. 

{ } 괄호를 빼니 잘 작동~

 

const onClickDelete = (event: any) => {
    const tempArr = list.filter(
      (el) =>
        // if (el?.id !== Number(event?.target.id)) return el;
        el?.id !== Number(event?.target.id)
    );
    console.log(tempArr);
    setList([...tempArr]);
  };

 

일단 요기까지 

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

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

Styled-Components  (0) 2023.01.06
[firebase] send하고 fetch하고 ?  (0) 2022.12.16
카카오 로그인 🎃🎃🎃  (0) 2022.12.05
당신이 내년에 얻을 세 가지 - 랜덤 뽑기만들기 🎁  (1) 2022.12.01
[Styled-Components, Emotion] 컴포넌트 가져와서 일부만 수정하기(상속)  (0) 2022.11.25
    '프론트엔드✏️/개인공부' 카테고리의 다른 글
    • Styled-Components
    • [firebase] send하고 fetch하고 ?
    • 카카오 로그인 🎃🎃🎃
    • 당신이 내년에 얻을 세 가지 - 랜덤 뽑기만들기 🎁
    당근먹는하니
    당근먹는하니

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.