토글 만들기

기여·2025년 1월 6일

소소한 개발팁

목록 보기
97/103

기본 상태가 꺼짐이고, 누르면 켜진 듯이 색상 변경하고,
스피너 위치도 직관적으로 이동하도록 하려고 한다.

1, Toggle.js

import React, { useState } from "react";
import "./ToggleStyles.css";

//stateless functional component
// function Toggle() {
//     return <div className="toggle"></div>
// }

// //stateful functional component
// function Toggle2() {
//     //const [count, setCount] = useState();
//     return <div className="toggle"></div>
// }

function Toggle() {
  //1. enabling state: useState(initialize value)

  //2. initialize state: useState(false)
  //초기화, gia tri khoi tao muon truyen vao
  //co the la boolean, number, string, object{title: "abc"}, array[1,2,3], undefined, null

  //3. reading state
  //4. update state

  const [on, setOn] = useState(false);
  console.log(on);
  // console.log(on, setOn);
  //khuyen dung on-setOn hon on-off

  const handleToggle = () => {
    setOn((on) => !on);
    // console.log("clicked");
  };

  return (
    <div>
      <div className={`toggle ${on ? "active" : ""}`} onClick={handleToggle}>
        <div className={`spinner ${on ? "active" : ""}`}></div>
        {/* `: backtick */}
      </div>

      {on ? "On" : "Off"}
      {/* 밑에서 On/Off 눌렀으면 On/Off 문구 표시 */}

      {/* <div className="toggle-ctrl">
        <div className="toggle-on" onClick={() => setOn(true)}>
          On
        </div>
        <div className="toggle-off" onClick={() => setOn(false)}>
          Off
        </div>
      </div> */}
    </div>
  );
}

export default Toggle;

2, ToggleStyles.css

.toggle {
  width: 100px;
  height: 50px;
  background-color: #ccc;
  padding: 5px;
  margin: 25px;
  border-radius: 100rem;
  cursor: pointer;
  transition: all 0.2s linear;
}

.toggle.active {
  background-color: plum;
}

.spinner {
  width: 50px;
  height: 50px;
  background-color: white;
  border-radius: 100rem;
  transition: all 0.2s linear;
}

.spinner.active {
  transform: translateX(50px);
}

.toggle-ctrl {
  margin: 0 25px;
  display: flex;
  align-items: center;
  gap: 0 10px;
}

.toggle-ctrl > * {
  cursor: pointer;
}
/* toggle-ctrl > *: toggle-ctrl 안의 전체 영역 */
profile
기기 좋아하는 여자

0개의 댓글