ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] UI 디자인
    codeStates front-end/React 2023. 2. 15. 22:12
    반응형

     

    목차

       

       

      📌  UI 디자인

       

       

       

       

      📍 UI 디자인 패턴

       

      반복되는 문제점에 과거의 다른 사람이 해결한 결과물을 재사용하기 좋은 형태를 만든 패턴

      쉽게 말해 자주 사용되는 UI 컴포넌트

       

       

      🔗 자주 쓰이는 UI 디자인 패턴

       

       

       

      모달 (Modal)

       

       

      모들 윈도(Modal Window)는 사용자 인터페이스 디자인 개념에서 자식 윈도에서 부모 윈도로
      돌아가기 전에 사용자의 상호동작을 요구하는 창을 말한다.

       

      https://www.appcues.com/blog/modal-dialog-windows

       

      모달은 기존에 이용하던 화면 위에 오버레이 되는 창을 뜻한다.

      닫기 버튼, 혹은 모달 범위 밖을 클릭하면 모달이 닫히는 것이 일반적이다.

      모달을 닫기 전에는 기존 화면고 상호작용 X

      꼭 보여주고 싶은 내용이 있다면 모달을 사용하는 것이 좋다.

       

      //click 이라는 버튼을 눌러 onclick이 발생할 경우 modalHandler를 사용해 isModal이라는 state를 변경
      
      const [isModal, setIsModal] = usestate(false);
      const modalHandler = () => {
        setIsModal(!isModal);
      }
      
      ...
      
      <button onClick={modalHandler}>Click</button>

       

       

       

      Toggle (토글)

       

      Toggle Button을 On/Off Switch라고 생각하면 된다.
      우리 키보드에 [Caps Lock], [Num Lock], [Scroll Lock] 다 Toggle Buttons이다.
      색상, 스위치의 위치 등의 시각적인 효과를 주어 사용자가 직관적으로 파악할 수 있게 한다

       

       

      <ToggleBtn onClick={clickedToggle} toggle={toggle}>
              <Circle toggle={toggle} />
            </ToggleBtn>
            <h3>Toggle Switch {!toggle ? "OFF" : "ON"}</h3>

       

       

       

      탭 (Tab)

       

      탭은 콘텐츠를 분리해서 보여주고 싶을 때 사용하는 UI 디자인 패턴

      https://prod.velog.io/@fejigu/React-Tab-Component-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

       

      import { useState } from 'react';
      import styled from 'styled-components';
      
      ...
      
      export const Tab = () => {
        // Tab Menu 중 현재 어떤 Tab이 선택되어 있는지 확인하기 위한 currentTab 상태와 currentTab을 갱신하는 함수가 존재해야 하고, 초기값은 0.
        const [currentTab, clickTab] = useState(0);
      
        const menuArr = [
          { name: 'Tab1', content: 'Tab menu ONE' },
          { name: 'Tab2', content: 'Tab menu TWO' },
          { name: 'Tab3', content: 'Tab menu THREE' },
        ];
      
        const selectMenuHandler = (index) => {
          // parameter로 현재 선택한 인덱스 값을 전달해야 하며, 이벤트 객체(event)는 쓰지 않는다
          // 해당 함수가 실행되면 현재 선택된 Tab Menu 가 갱신.
          clickTab(index);
        };
      
        return (
          <>
            <div>
              <TabMenu>
                // 아래 하드코딩된 내용 대신에, map을 이용한 반복으로 코드를 수정
               // li 엘리먼트의 class명의 경우 선택된 tab 은 'submenu focused', 나머지 2개의 tab은 'submenu' 
                {/* <li className="submenu">{menuArr[0].name}</li>
                <li className="submenu">{menuArr[1].name}</li>
                <li className="submenu">{menuArr[2].name}</li> */}
                {menuArr.map((el,index) => (
                    <li className={index === currentTab ? "submenu focused" : "submenu" }
                    onClick={() => selectMenuHandler(index)}>{el.name}</li>
                  ))}
              </TabMenu>
              <Desc>
                <p>{menuArr[currentTab].content}</p>
              </Desc>
            </div>
          </>
        );
      };

       

      태그 (Tag)

       

      태그는 콘텐츠를 설명하는 키워드를 사용해서 라벨을 붙이는 역할
      사용자들은 자신이 작성한 콘텐츠에 태그를 붙임으로써 콘텐츠를 분류
      어떤 방식을 선택하든 태그의 추가와 제거는 자유롭게 할 수 있다

       

       

      const Tag = () => {
        const [tagItem, setTagItem] = useState('')
        const [tagList, setTagList] = useState([])
      
        const onKeyPress = e => {
          if (e.target.value.length !== 0 && e.key === 'Enter') {
            submitTagItem()
          }
        }
      
        const submitTagItem = () => {
          let updatedTagList = [...tagList]
          updatedTagList.push(tagItem)
          setTagList(updatedTagList)
          setTagItem('')
        }
      
        const deleteTagItem = e => {
          const deleteTagItem = e.target.parentElement.firstChild.innerText
          const filteredTagList = tagList.filter(tagItem => tagItem !== deleteTagItem)
          setTagList(filteredTagList)
        }
      
        return (
          <WholeBox>
            <Title text='Tag' />
            <TagBox>
              {tagList.map((tagItem, index) => {
                return (
                  <TagItem key={index}>
                    <Text>{tagItem}</Text>
                    <Button onClick={deleteTagItem}>X</Button>
                  </TagItem>
                )
              })}
              <TagInput
                type='text'
                placeholder='Press enter to add tags'
                tabIndex={2}
                onChange={e => setTagItem(e.target.value)}
                value={tagItem}
                onKeyPress={onKeyPress}
              />
            </TagBox>
          </WholeBox>
        )
      }

       

       

      자동완성 (Autocomplete)

       

      사용자가 내용을 입력 중일 때 사용자가 입력하고자 하는 내용과 일치할 가능성이 높은 항목을 보여주는 것

       

       

       

       

       

      이외의 드롭다운, 아코디언, 캐러셀, 페이지네이션, 무한스크롤, GNB, LNB 등 다양한 기능들이 있다

       

       

      📍 그리드 시스템(Grid System)

       

      그리드란 수직, 수평으로 분할된 격자무늬를 뜻하며, 말 그대로 화면을 격자로 나눈 다음 그 격자에 맞춰 콘텐츠를 배치하는 방법
      1970년대부터 사용
      웹 디자인 분야에서는 화면을 세로로 몉 개의 영역으로 나눌 것인가에 초첨을 맞춘 컬럼 그리드 시스템을 사용
      margin, column, gutter라는 세 가지 요소로 구성

       

       

      1. Margin : 화면 양쪽의 여백을 의미
      2. Column : 콘텐츠가 위치하게 될, 세로로 나누어진 영역
      3. Gutter : column 사이의 공간, 콘텐츠를 구분하는데 도움을 줌

       

      반응형

      'codeStates front-end > React' 카테고리의 다른 글

      [React] custom component/ Styled-Component  (0) 2023.02.20
      [React] UX 디자인  (0) 2023.02.15
      [React] UI/UX  (0) 2023.02.15
      [React] 실습 - StatesAirline Client  (0) 2023.02.04
      [React] Effect Hook  (0) 2023.02.02

      댓글

    Designed by Tistory.