[React] 리액트 순위 매기기 만들기 (ranking)

2023. 2. 26. 02:25·Frontend/React
import React, { useState } from 'react';

function ProductItem({ name, rank, onClick }) {
  const isSelected = rank > 0;
  const remainingCount = 3 - rank;
  const countText = isSelected ? `(${rank}/3)` : ``;
  const buttonLabel = isSelected ? '취소' : '상품 비교';

  return (
    <li>
      {name} <span className="count">{countText}</span>
      <button type="button" className="compare-btn" onClick={onClick}>
        {buttonLabel}
      </button>
      {!isSelected && remainingCount === 0 && (
        <span className="warning">3개 이상 선택할 수 없습니다.</span>
      )}
    </li>
  );
}

export function App(props) {
  const [rank, setRank] = useState(Array(5).fill(0));

  const handleClick = index => {
    const newRank = [...rank];
    const selectedRank = newRank.filter(rank => rank > 0);

    if (newRank[index] === 0) {
      // 선택되지 않은 경우
      if (selectedRank.length >= 3) {
        alert('3개 이상은 선택할 수 없습니다.');
        return;
      }
      newRank[index] = selectedRank.length + 1;
    } else {
      // 선택된 경우
      newRank[index] = 0;
    }

    // 순위 재조정
    const remainingRank = newRank.filter(rank => rank > 0);
    remainingRank.sort((a, b) => a - b);
    newRank.forEach((_, i) => {
      if (newRank[i] === 0) return;
      newRank[i] = remainingRank.indexOf(newRank[i]) + 1;
    });

    setRank(newRank);
  };

  return (
    <ul>
      {rank.map((rank, index) => (
        <ProductItem
          key={index}
          name={`상품 ${index + 1}`}
          rank={rank}
          onClick={() => handleClick(index)}
        />
      ))}
    </ul>
  );
}
import React, { useState } from 'react';

export function App(props) {
  const [products, setProducts] = useState([
    { name: '상품1', rank: 0 },
    { name: '상품2', rank: 0 },
    { name: '상품3', rank: 0 },
    { name: '상품4', rank: 0 },
    { name: '상품5', rank: 0 },
  ]);

  const handleClick = (index) => {
    const newProducts = [...products];
    if (newProducts[index].rank === 0) {
      // 순위를 아직 부여하지 않은 경우
      const selectedProducts = newProducts.filter((product) => product.rank > 0);
      if (selectedProducts.length >= 3) {
        alert('3개 이상은 선택할 수 없습니다.');
        return;
      }
      newProducts[index].rank = selectedProducts.length + 1;
    } else {
      // 이미 순위를 부여한 경우
      newProducts[index].rank = 0;
    }
    // 나머지 상품들의 순위를 조정
    newProducts
      .filter((product) => product.rank > 0)
      .sort((a, b) => a.rank - b.rank)
      .forEach((product, i) => {
        product.rank = i + 1;
      });
    setProducts(newProducts);
  };

  return (
    <ul>
      {products.map((product, index) => (
        <li key={index}>
          {product.name} (<span className='count'>{product.rank}</span>/
          <span className='totalCount'>3</span>)
          <button type='button' className='compare-btn' onClick={() => handleClick(index)}>
            상품비교
          </button>
        </li>
      ))}
    </ul>
  );
}

 

https://playcode.io/react 

 

React Playground

Super sleek javascript playground with instant live preview and console. Start code within seconds. No “npm run start” or anything.

playcode.io

리액트 playground

반응형

'Frontend > React' 카테고리의 다른 글

[React Swiper] play, stop 버튼 만들기  (1) 2023.04.13
[React Swiper] 리액트에서 스와이퍼 사용하기  (0) 2023.04.13
리액트 연습하기  (1) 2022.11.16
[리액트] JSX란?  (0) 2022.11.16
리액트 참고하면 좋은 사이트들  (1) 2022.11.16
'Frontend/React' 카테고리의 다른 글
  • [React Swiper] play, stop 버튼 만들기
  • [React Swiper] 리액트에서 스와이퍼 사용하기
  • 리액트 연습하기
  • [리액트] JSX란?
전예방
전예방
  • 전예방
    예방이의 개발일기
    전예방
  • 전체
    오늘
    어제
    • All (125)
      • Info & Tip (2)
      • 유용한 사이트들 (5)
      • Mark Up & StyleSheet (23)
        • HTML (6)
        • CSS & SCSS (10)
        • 반응형 (6)
      • Frontend (66)
        • 전체 (10)
        • JavaScript & Jquery (18)
        • TypeScript (0)
        • React (26)
        • Next.js (3)
        • 성능최적화 (2)
        • 웹접근성 (2)
      • Backend (13)
        • Python (1)
        • JAVA (2)
        • node.js (0)
        • PHP (7)
        • 패키지매니저 (3)
      • Markdown (0)
      • SCM (1)
        • Git&Github (1)
        • SVN (0)
      • IDE (4)
        • VSCode (2)
        • IntelliJ (1)
        • Ecplise (1)
      • 취미생활 (3)
      • 정보처리기사 (2)
      • 코딩자율학습단 (5)
        • 12기 (파이썬) (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • velog
    • github
  • 공지사항

  • 인기 글

  • 태그

    swiper.js
    반응형
    코딩자율학습
    Admin
    php
    나도코딩
    Chart.js
    yarn berry
    CSS
    코딩자율학습단
    Python
    리액트
    파이썬
    TypeScript
    frontend
    react
    React Swiper
    회원가입
    NPM
    관리자 페이지
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
전예방
[React] 리액트 순위 매기기 만들기 (ranking)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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