๐Ÿ“ ์˜ค๋Š˜ ํ•œ ๊ฒƒ

  1. react state

  2. unit converter

  3. array.filter(Boolean)


๐Ÿ“š ๋ฐฐ์šด ๊ฒƒ

1. STATE

state๋ž€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์„ ๋งํ•œ๋‹ค.

๋ฐ”๋‹๋ผ JS ์ฝ”๋“œ์—์„œ๋Š” counter๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ด๋ฅผ UI์— ๋””์Šคํ”Œ๋ ˆ์ด ํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋•Œ ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ• ๋‹น๋˜๋Š” counter ๋ณ€์ˆ˜๋ฅผ state๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

1) counter ๋ณ€์ˆ˜ ์—…๋ฐ์ดํŠธ ํ›„ render ํ•จ์ˆ˜ ํ˜ธ์ถœ

๋จผ์ €, state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • counter ๋ณ€์ˆ˜๋ฅผ App ํ•จ์ˆ˜ ๋ฐ–(React JS ์–ดํ”Œ ๋ฐ–)์— ์„ ์–ธํ•œ๋‹ค.
  • counter ๋ณ€์ˆ˜๋ฅผ JSX์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” {} ์•ˆ์— ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ ์œผ๋ฉด ๋œ๋‹ค.
  • counter ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด countUp ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  button์— click ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ UI์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” App์„ ๋‹ค์‹œ render ํ•ด์•ผ ํ•œ๋‹ค.
const root = document.getElementById("root");
let counter = 0;
function countUp () {
  counter++; // 3. counter ๊ฐ’์„ ์˜ฌ๋ฆฌ๊ณ 
  render(); // 4. ๋ฐ”๋€ counter ๊ฐ’์„ ๊ฐ€์ง€๋Š” App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ render ํ•œ๋‹ค
}
function render () {
  ReactDOM.render(<App />, root);
}
function App() {
  return (
    <div>
      <h3>Total Click: {counter}</h3>
      <button onClick={countUp}>ํด๋ฆญ</button>
    </div>
  );
} // 2. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
render(); // 1. ์ฒ˜์Œ App ์ปดํฌ๋„ŒํŠธ๋ฅผ render ํ•˜์—ฌ ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค

๋‹ค๋งŒ, ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด ReactDOM.render() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๐Ÿ’ก React JS์—์„œ์˜ ๋ฆฌ๋ Œ๋”๋ง

๋ฐ”๋‹๋ผ JS ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •ํ•œ ์š”์†Œ ์ „์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋ฉด span.innerText์— ์˜ํ•ด counter ๋ณ€์ˆ˜๋งŒ์ด ์•„๋‹ˆ๋ผ 'Total Click' ํ…์ŠคํŠธ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ span ์š”์†Œ ์ „์ฒด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด์—, React JS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด UI์—์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋ฉด counter ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
React JS๋Š” ์ด์ „์— ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ๋‹ค์Œ์— ๋ Œ๋”๋ง๋  ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฌด์—‡์ธ์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ, ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

๋‹ค์‹œ ๋งํ•ด, CountUp ํ•จ์ˆ˜์— ์˜ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พผ ํ›„ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ”๋€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” App ์ปดํฌ๋„ŒํŠธ ์ „๋ถ€๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์–ด root์— ๋ฐฐ์น˜๋˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์˜ค๋กœ์ง€ counter ๋ณ€์ˆ˜๋งŒ์ด ๋ฐ”๋€” ๋ฟ์ด๋‹ค.
์ด๋Š” ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋งค์šฐ ํฐ ๋„์›€์ด ๋œ๋‹ค.

2) React.useState() ์‚ฌ์šฉ

React.useState()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (render ํ•จ์ˆ˜๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•  ํ•„์š” ์—†์ด) React JS ์–ดํ”Œ ๋‚ด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ , ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • App ํ•จ์ˆ˜ ์•ˆ(React JS ์–ดํ”Œ ์•ˆ)์— React.useState()๋ฅผ ์ด์šฉํ•ด counter ๋ณ€์ˆ˜์™€ setCounter ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • counter ๋ณ€์ˆ˜๋ฅผ JSX์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” {} ์•ˆ์— ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ ์œผ๋ฉด ๋œ๋‹ค.
  • counter ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด button์— click ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์—์„œ๋Š” setCounter ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ counter ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋™์‹œ์— ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋„๋ก ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ, UI์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ReactDOM.render() ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
const App = () => {
  const [counter, setCounter] = React.useState(0);
  const onClick = () => {
    setCounter(counter + 1);
  };
  return (
    <div>
      <h3>Total Click: {counter}</h3>
      <button onClick={onClick}>ํด๋ฆญ</button>
   </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

React.useState()์€ ๋ฐฐ์—ด์„ return ํ•˜๋ฉฐ, ์ธ์ž๋กœ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
counter๋Š” ๋ฐ์ดํ„ฐ, setCounter๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

const [counter, setCounter] = React.useState(0);

// ์œ„์™€ ์•„๋ž˜๋Š” ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค

const data = React.useState(0);
const counter = data[0];
const setCounter = data[1];

React.useState()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ์š”์†Œ์ธ setCounter ํ•จ์ˆ˜๋Š”, counter ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พผ ํ›„, ์ด๋ฅผ ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง๊นŒ์ง€ ํ•ด์ค€๋‹ค.

const OnClick = () => {
  setCounter(counter + 1);
};

// ์œ„์™€ ์•„๋ž˜๋Š” ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค

const OnClick = () => {
  counter++;
  ReactDOM.render(<Container />, root);
};

๐Ÿ’ก React JS์—์„œ์˜ ๋ฆฌ๋ Œ๋”๋ง

(1)๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ UI์—์„œ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

App ์ปดํฌ๋„ŒํŠธ์˜ state, ์ฆ‰ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด App ์ปดํฌ๋„ŒํŠธ ์ „๋ถ€๋ฅผ ์žฌ์ƒ์„ฑ(๋ฆฌ๋ Œ๋”๋ง)ํ•œ๋‹ค.
(App ํ•จ์ˆ˜์—์„œ return ํ•˜๊ธฐ ์ „์— ์ฝ˜์†” ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์— ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋ฌผ๋ก  ์—ฌ๊ธฐ์„œ๋„ ์‹ค์ œ๋กœ๋Š” ์˜ค๋กœ์ง€ counter ๋ณ€์ˆ˜๋งŒ์ด ๋ฐ”๋€” ๋ฟ์ด๋‹ค.
(๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ elements ํƒญ์„ ์‚ดํŽด๋ณด๋ฉด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค counter ๋ณ€์ˆ˜ ๋ถ€๋ถ„๋งŒ์ด ๋ณ€ํ•œ๋‹ค.)

๐Ÿ”Ž ์ด์ „ ๋‹จ๊ณ„์˜ state๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ ๋‹จ๊ณ„์˜ state ๋ฐ”๊พธ๊ธฐ

state๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
ํ•˜๋‚˜๋Š” ์ง์ ‘ state ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ณ (ex. setCounter(333)), ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ด์ „ ๋‹จ๊ณ„์˜ state๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋‹จ๊ณ„์˜ state๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค.(ex. setCounter(counter + 1))

const onClick = () => {
  // setCounter(counter + 1);
  setCounter(current => current + 1);
};

์œ„์—์„œ๋Š” ์ด์ „ ๋‹จ๊ณ„์˜ state๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์Œ ๋‹จ๊ณ„์˜ state๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด setCounter(counter + 1)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ๋ชปํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ณณ์—์„œ state๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.
๋Œ€์‹ ์— setCounter(current => current + 1)์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค.


2. UNIT CONVERTER(๋‹จ์œ„ ๋ณ€ํ™˜ ์•ฑ) ๋งŒ๋“ค๊ธฐ

1) minutes๋ฅผ hours๋กœ ๋ณ€ํ™˜

(1) htmlFor / className

for๊ณผ class๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋„ ์กด์žฌํ•˜๋Š” ์˜ˆ์•ฝ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— JSX ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.
๋Œ€์‹ ์— JSX ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ htmlFor๊ณผ className์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

(2) React JS์—์„œ form์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

React JS ์„ธ๊ณ„์—์„œ ์ƒ์„ฑํ•œ input์˜ value๋Š” ์ง์ ‘ ํ†ต์ œํ•  ์ˆ˜ ์—†๋‹ค.(uncontrolled input)

๋”ฐ๋ผ์„œ, state๋ฅผ ๋งŒ๋“ค์–ด์„œ input์˜ value ์†์„ฑ์œผ๋กœ ์ „ํ•ด์ค€ ํ›„(์ด๋•Œ React.useState()์˜ ์ธ์ž๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ๊ฒฝ๊ณ ๊ฐ€ ์•ˆ๋œธ) ์‚ฌ์šฉ์ž๊ฐ€ input์— ๋‹ค๋ฅธ ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค input์˜ value๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ(onChange ํ•จ์ˆ˜) ๊ทธ ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.({minutes} ์ด์šฉ)

input์˜ value๋ฅผ state์™€ ์—ฐ๊ฒฐ์‹œํ‚ด์œผ๋กœ์จ, input์˜ value๋ฅผ ์™ธ๋ถ€์—์„œ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

const App = () => {
  const [minutes, setMinutes] = React.useState(0);
  const onChange = (event) => setMinutes(event.target.value);
  return (
    <div>
      <label htmlFor="minutes">Minutes</label>
      <input
        value={minutes}
        id="minutes"
        placeholder="Minutes"
        type="number"
        onChange={onChange}
      />
      <label htmlFor="hours">Hours</label>
      <input id="hours" placeholder="Hours" type="number" />
      <h4>minutes input์˜ value๋Š” {minutes} ์ž…๋‹ˆ๋‹ค</h4>
    </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

onChange ํ•จ์ˆ˜ ์•ˆ์—์„œ console.log(event) ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†” ์ฐฝ์— SyntheticBaseEvent ๊ฐ์ฒด๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
์ด๋Š” nativeEvent๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ์ด ์•ˆ์— target์ด input์„ ์˜๋ฏธํ•˜๊ณ  target์€ value๋ฅผ ๊ฐ€์ง„๋‹ค.

์ฆ‰, console.log(event.target.value) ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†” ์ฐฝ์— input์˜ value๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
์ด์ œ setMinutes ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด minutes๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ ํ›„ Appp ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ด์•ผ ํ•œ๋‹ค.

์ด์ œ minutes input์— ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ’์„ ์ž…๋ ฅํ•˜์—ฌ input์˜ value๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ๋ณ€ํ™”๊ฐ€ h4์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋˜์–ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

๐Ÿ’ก ์ด๋•Œ onChange={onChange} ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์•„๋ฌด๋ฆฌ minutes input์—์„œ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐ’์„ ์ž…๋ ฅํ•ด๋„ input ์ฐฝ์—๋Š” ๊ณ„์† 0๋งŒ ๋ณด์ธ๋‹ค.

์ด๋Š” ์›๋ž˜ input์˜ value์ธ {minutes}์˜ ๊ธฐ๋ณธ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•œ ํ›„
์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค onChange ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์˜ํ•ด minutes ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ์œผ๋กœ์จ
input์˜ value๋„ ๋ณ€๊ฒฝ๋˜๊ณ  App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ํ–ˆ๋Š”๋ฐ

onChange ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ญ์ œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— minutes์˜ ๊ฐ’์ด 0์ธ ์ƒํƒœ์—์„œ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹ค์‹œ ๋งํ•ด, minutes input์˜ ๊ฒฝ์šฐ โ‘  ๋จผ์ € change event๋„ ๋ฆฌ์Šค๋‹ ํ•ด์•ผ ํ•˜๊ณ , โ‘ก change event๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ input์˜ value๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  UI์— ๋ณด์—ฌ์ฃผ๊ธฐ๋„ ํ•ด์•ผ ํ•œ๋‹ค.
hours input์˜ ๊ฒฝ์šฐ input ์ฐฝ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก change event๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜์ง€ ์•Š๊ฒŒ๋” ํ–ˆ๋‹ค.

(3) ๋‹จ์œ„ ๋ณ€ํ™˜ / ๋ฆฌ์…‹ ๋ฒ„ํŠผ ๊ตฌํ˜„

const App = () => {
  const [minutes, setMinutes] = React.useState(0);
  const onChange = (event) => setMinutes(event.target.value);
  const onClick = () => setMinutes(0); // reset ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ minutes(input์˜ value) ์ดˆ๊ธฐํ™”
  return (
    <div>
      <h1>Super Converter</h1>
      <div>
        <label htmlFor="minutes">Minutes</label>
        <input
          value={minutes}
          id="minutes"
          placeholder="Minutes"
          type="number"
          onChange={onChange}
        />
      </div>
      <div>
        <label htmlFor="hours">Hours</label>
        <input
          value={Math.round(minutes / 60)} // ๋‹จ์œ„ ๋ณ€ํ™˜
          id="hours"
          placeholder="Hours"
          type="number"
        />
      </div>
      <button onClick={onClick}>Reset</button>
    </div>
  );
};
const root = document.getElementById("root");
ReactDOM.render(<App />, root);

2) hours๋ฅผ minutes๋กœ ๋ณ€ํ™˜

(1) disabled์˜ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” flip ๋ฒ„ํŠผ

๊ธฐ๋ณธ์ ์œผ๋กœ hours input์— disabled๋ฅผ ์ ์šฉํ•˜๊ณ  minutes input์€ enabled ์ƒํƒœ๋กœ ๋‘”๋‹ค.
state๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด flip ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด flipped ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ฐ˜๋Œ€๊ฐ€ ๋˜๋„๋ก ํ•œ๋‹ค.

const App () => {
  ...
  const [flipped, setFlipped] = React.useState(false); // ๊ธฐ๋ณธ๊ฐ’ false
  const onFlip = () => setFlipped(current => !current); // flipped ๋ณ€์ˆ˜ ๊ฐ’ ์—…๋ฐ์ดํŠธ & App ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง
  return (
    <div>
      <div>
        <label htmlFor="minutes">Minutes</label>
        <input
        id="minutes"
        ...
        disabled={flipped} // {flipped === true} ์™€ ๊ฐ™๋‹ค
        />
      </div>
      <div>
        <label htmlFor="hours">Hours</label>
        <input
        id="hours"
        ...
        disabled={!flipped} // {flipped === false} ์™€ ๊ฐ™๋‹ค
        />
      </div>
      ...
      <button onClick={onFlip}>{flipped ? "Turn back" : "Flip"}</button>
    </div>
  );
};

(2) hours input์— onChange ์ด๋ฒคํŠธ ๋“ฑ๋กํ•˜๊ธฐ

minutes input์— ๊ฐ’์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ์—๋งŒ hours input์— {Math.round(minutes / 60)}์˜ ๊ฐ’์ด ๋ณด์—ฌ์ง€๋„๋ก ํ•˜๊ณ , hours input์— ๊ฐ’์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” hours input์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.
minutes input์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด flipped ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ด์šฉํ•ด ์กฐ๊ฑด๋ถ€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ์˜ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ„์—์„œ ์„ ์–ธํ•œ minutes๋ฅผ amount๋กœ, setMinutes๋ฅผ setAmount๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค.
flip ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ™œ์„ฑํ™”๋œ input์˜ value์— amount ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด onFlip ํ•จ์ˆ˜์— reset() ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

const onFlip = () => {
  setAmount(current => !current);
  reset();
};
...
<input
  value={!flipped ? amount : amount * 60}
  id="minutes"
  ...
  disabled={flipped}
/>
...
<input
  value={flipped ? amount : Math.round(amount / 60)}
  id="hours"
  ...
  disabled={!flipped}
/>

3. airbnb/javascript: JavaScript Style Guide

1) array.filter(Boolean)

const array = [1, "hi", null, ``, false];

const truthyCount = array.filter(Boolean).length;
// ์œ„ ์•„๋ž˜๋Š” ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค.
// Boolean()์€ ๊ทธ ์ธ์ž๊ฐ€ true์ผ ๋• true๋ฅผ, false์ผ ๋• false๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
const truthyCount = array.filter((item) => Boolean(item)).length;

console.log(truthyCount); // ๋ฐฐ์—ด [1, "hi"]์˜ ๊ธธ์ด๋Š” 2

โœจ ๋‚ด์ผ ํ•  ๊ฒƒ

  1. ๋‹จ์œ„ ๋ณ€ํ™˜ ์•ฑ ์™„์„ฑ
profile
dev log

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN