React

[React] Toggle Component ๋งŒ๋“ค๊ธฐ

ํ•˜์ด๋žŒ 2023. 7. 19. 23:59

 

๋‚ด๊ฐ€ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์•Œ๋ฆผ ์„ค์ •์„ ์œ„ํ•ด ํ† ๊ธ€ ์Šค์œ„์น˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค.

 

 

๋‚ด๊ฐ€ ๋งŒ๋“  Setting ํŽ˜์ด์ง€

 

 

1. ํ† ๊ธ€ ์Šค์œ„์น˜๋ž€?

๐Ÿ’ก ํ† ๊ธ€ ์Šค์œ„์น˜
ํ† ๊ธ€ ์Šค์œ„์น˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” ๋ฌผ๋ฆฌ์  ์Šค์œ„์น˜์ฒ˜๋Ÿผ "ON/OFF"์™€ ๊ฐ™์ด ๋‘๊ฐ€์ง€ ๋ฐ˜๋Œ€๋˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

 

 

 

2. ํ† ๊ธ€ ์Šค์œ„์น˜ ๊ตฌํ˜„ ๊ฒฐ๊ณผ

 

 

 

3. ์ค‘์š” Point

๐ŸŒฑ props ์ด์šฉํ•˜๊ธฐ
props๋กœ toggle์˜ ์ƒํƒœ(on/off)๋ฅผ ๋„˜๊ฒจ์ฃผ์–ด css ๋ถ€๋ถ„์—์„œ ์กฐ๊ฑด๋ถ€๋กœ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.
(ex) ${props => props.isToggleOn ? 'background-color: #7BAB6E' : 'background-color: #CECECE' };

๐ŸŒฑ transition ์‚ฌ์šฉํ•˜๊ธฐ
ํ† ๊ธ€ ๋ฒ„ํŠผ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก css์˜ transition ์†์„ฑ์„ ํ™œ์šฉํ•˜์˜€๋‹ค. 
(ex) transition: all 0.3s;

 

 

 

4. ์ „์ฒด ์ฝ”๋“œ

 

SettingToggle.js

import { useState } from "react";
import { Toggle, ToggleButton, ToggleWrap } from "./style";

const SettingToggle = () => {
  const [isToggleOn, setIsToggleOn] = useState(false);

  return (
    <ToggleWrap onClick={() => setIsToggleOn(!isToggleOn)}>
      <Toggle isToggleOn={isToggleOn}>
        <ToggleButton isToggleOn={isToggleOn}></ToggleButton>
      </Toggle>
    </ToggleWrap>
  );
};

export default SettingToggle;

 

Style.js

import styled from "styled-components";

export const ToggleWrap = styled.div`
  display: flex;
  flex-direction: row;
  align-items: center;
`;

export const Toggle = styled.div`
  transition: all 0.3s;
  position: relative;
  width: 34px;
  height: 18px;
  border-radius: 16px;
  outline: none;
  padding: 0 2px;
  ${props => props.isToggleOn ?
    'background-color: #7BAB6E'
    : 'background-color: #CECECE'
  };

`;

export const ToggleButton = styled.div`
  transition: all 0.3s;
  display: block;
  width: 14px;
  height: 14px;
  border-radius: 16px;
  margin-top: 2px;
  background-color: white;

  transform: ${props => props.isToggleOn ? 'translateX(20px)': 'translateX(0px)'};
`;