[메달 집계 관리] - return했는데도 왜 메달 리스트를 보여주는걸까

2025. 1. 22. 14:12·TroubleShooting

문제 상황

요구 사항

사용자가 이미 등록된 나라를 입력하려고 할 때 경고창을 띄우고, 해당 나라를 추가하지 마세요.
medalList.forEach((country) => {
  const { countryName } = country;
  if (countryName.includes(newCountry)) {
    alert("이미 존재하는 나라입니다.");
    return;
  }
});

사용자가 입력한 나라가 이미 리스트에 존재할 때,

"이미 존재하는 나라입니다."라는 경고창을 띄우는 코드를 짰다.

 

🚨 마지막에 return까지 넣어 줬는데도, 리스트에 추가되는 문제가 발생하였다.

 

 

문제 원인

✅ forEach 메서드를 통해서는 함수 전체의 실행을 막을 수가 없다.

forEach의 콜백 함수 내에서 return 하는 것은 콜백 함수의 실행을 멈추는 것 밖에 하지 못한다.

그렇기 때문에 메달 리스트를 추가하는 함수의 실행이 멈추지 않는 것이었다.

 

 

해결 과정

✅ forEach 대신에 some 메서드를 이용하였다.

const checkDuplication = medalList.some((country) => {
  const { countryName } = country;
  return countryName.includes(newCountry);
});

사용자가 입력한 나라가 이미 메달리스트 안에 존재하고 있다면 checkDuplication의 값은 true가 된다.

 

if (checkDuplication) {
  alert("이미 존재하는 나라입니다.");
  return;
}

조건문을 이용하여 해당 값이 true일 경우, 경고창을 띄운 뒤에 return을 한다.

이렇게 코드를 작성하면 함수 전체의 실행이 멈추게 된다.

 

 

전체 코드

// form 관리 함수
const submitHandler = (e) => {
  e.preventDefault();

  // 예외 상황 처리 1: 입력값이 없을 때
  if (
    newCountry === "" ||
    goldMedal === "" ||
    silverMedal === "" ||
    bronzeMedal === ""
  ) {
    alert("값을 모두 입력하세요.");
    return;
  }

  // 예외 상황 처리 2: 이미 추가된 나라일 때
  const checkDuplication = medalList.some((country) => {
    const { countryName } = country;
    return countryName.includes(newCountry);
  });
  if (checkDuplication) {
    alert("이미 존재하는 나라입니다.");
    return;
  }

  // medalList state 변환
  const newMedalList = [
    ...medalList,
    {
      countryName: newCountry,
      goldMedal: goldMedal,
      silverMedal: silverMedal,
      bronzeMedal: bronzeMedal,
    },
  ];

  setMedalList(
    newMedalList.sort((a, b) => {
      return b.goldMedal - a.goldMedal;
    })
  );

  // 입력값 초기화
  setNewCountry("");
  setGoldMedal("");
  setSilverMedal("");
  setBronzeMedal("");
};

 

 

결과

이전과 다르게 경고창이 나온 뒤에 리스트가 추가되지 않는 모습을 확인할 수 있다.

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'TroubleShooting' 카테고리의 다른 글

[메달 집계 관리] - 조건에 따라 컴포넌트 보여주기  (0) 2025.01.22
[메달 집계 관리] - React에서 Radio 버튼을 checked 하려면?  (0) 2025.01.22
[메달 집계 관리] - child in a list should have a unique "key" prop!!  (0) 2025.01.22
[메달 집계 관리] - 사용자가 입력한 모든 값을 배열에 어떻게 넣을까?  (0) 2025.01.22
[영화 검색 사이트] - 영화 카드 사이를 누르면 오류 메시지가 뜬다?!  (0) 2025.01.17
'TroubleShooting' 카테고리의 다른 글
  • [메달 집계 관리] - 조건에 따라 컴포넌트 보여주기
  • [메달 집계 관리] - React에서 Radio 버튼을 checked 하려면?
  • [메달 집계 관리] - child in a list should have a unique "key" prop!!
  • [메달 집계 관리] - 사용자가 입력한 모든 값을 배열에 어떻게 넣을까?
집으로 감자
집으로 감자
Hello World
  • 집으로 감자
    Potato to Home
    집으로 감자
  • 전체
    오늘
    어제
  • 링크

    • Github
    • 분류 전체보기
      • Front-end
        • TIL
        • Javascript
        • Typescript
        • React
        • Next.js
        • CSS
        • 라이브러리
      • Algorithm
        • 프로그래머스: 기초 트레이닝
        • 프로그래머스 LV1
      • TroubleShooting
      • Problem & Solution
      • Project
      • Programing Knowledge
        • 개발 용어
        • CS
        • 운영체제
        • 자료구조
        • 데이터 베이스
  • 태그

    http
    실행컨텍스트
    JavaScript
    트러블슈팅
    프로그래머스
    tanstackquery
    반응형웹
    styledcomponent
    CSS
    react
    문제해결
    개발용어
    Til
    회고
    코딩테스트
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
집으로 감자
[메달 집계 관리] - return했는데도 왜 메달 리스트를 보여주는걸까
상단으로

티스토리툴바