230629 React Styled-Components

Yujung KimΒ·2023λ…„ 6μ›” 29일
0

React

λͺ©λ‘ 보기
7/17

styled-components

참고링크:
https://react.vlpt.us/styling/03-styled-components.html

[μ„€μΉ˜λ²•]

npm install styled-components
npm install --save-dev prettier
npm install --save-dev eslint

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ 정원 수용 인원 μž…ν‡΄μž₯ λ²„νŠΌ

Index.tsx

import Accommodate from './Component/Accommodate';
(...)
root.render(
  <React.StrictMode>
    <Accommodate />
  </React.StrictMode>
);

Accommodate.tsx

import React from 'react'
import { useState, useEffect } from 'react'
import App from '../App';

const MAX_CAPACITY = 10;

const Accommodate = (props) => {
  const [isFull, setIsFull] = useState(false);
  const [count, IncreaseCount, DecreaseCount] = App(0);

  useEffect(() => {
    console.log("==========");
    console.log("useEffect() is called");
    console.log(`isFull: ${isFull}`);
  })

  useEffect(() => {
    setIsFull(count >= MAX_CAPACITY)
    console.log(`Current count value: ${count}`);
  }, [count]);
  return (
    <div style={{ padding: 16 }}>
      <p>{`총 ${count}λͺ… μˆ˜μš©ν–ˆμŠ΅λ‹ˆλ‹€.`}</p>
      <button disabled={isFull} onClick={IncreaseCount}>μž…μž₯</button>
      <button onClick={DecreaseCount}>퇴μž₯</button>
      {isFull && <p style={{ color: 'red' }}>정원이 가득 μ°ΌμŠ΅λ‹ˆλ‹€.</p>}
    </div>
  )
}

export default Accommodate

App.tsx

import React from 'react'
import { useState } from 'react'

const App = () => {
  const [isConfirmed, setIsConfirmed] = useState(false);
  const handleConfirm = () => {
    setIsConfirmed((prevIsConfirmed) => !prevIsConfirmed);
  }
  return <button onClick={handleConfirm}>
    {isConfirmed ? "확인됨" : "ν™•μΈν•˜κΈ°"}
    </button>;
}

export default App

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

↓ useState μ˜ˆμ œλ“€ ↓

πŸ’ ν† κΈ€λ²„νŠΌ λ§Œλ“€κΈ°

App.tsx
import React from 'react'
import { useState } from 'react'

const App = () => {
  const [isConfirmed, setIsConfirmed] = useState(false);
  const handleConfirm = () => {
    setIsConfirmed((prevIsConfirmed) => !prevIsConfirmed);
  }
  return <button onClick={handleConfirm}>
    {isConfirmed ? "확인됨" : "ν™•μΈν•˜κΈ°"}
    </button>;
}

export default App

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ 둜그인/λ‘œκ·Έμ•„μ›ƒ ν† κΈ€λ²„νŠΌ


App.tsx

import React from 'react'
import LoginControl from './Component/LoginControl'

const App = () => {
  return (
    <div>
      <LoginControl />
    </div>
  )
}

export default App

Greeting.tsx

import React from 'react'
const UserGreeting = () => {
  return <h1>λ‹€μ‹œ μ˜€μ…¨κ΅°μš”!</h1>
}
const GuestGreeting = () => {
  return <h1>νšŒμ›κ°€μž…μ„ ν•΄μ£Όμ„Έμš”!</h1>
}
const Greeting = (props: any) => {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />
  }
  return <GuestGreeting />;
}

export default Greeting

LoginControl.tsx

import React, { useState } from 'react'
import Greeting from './Greeting'

const LoginButton = (props: any) => {
  return <button onClick={props.onClick}>둜그인</button>
}

const LogoutButton = (props: any) => {
  return <button onClick={props.onClick}>λ‘œκ·Έμ•„μ›ƒ</button>
}

const LoginControl = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const handleLoginClick = () => {
    setIsLoggedIn(true);
  }
  const handleLogoutClick = () => {
    setIsLoggedIn(false);
  }
  let button;
  if (isLoggedIn) {
    button = <LogoutButton onClick={handleLogoutClick} />
  } else {
    button = <LoginButton onClick={handleLoginClick} />
  }

  return (
    <div>
      <Greeting isLoggedIn={isLoggedIn} />
      {button}
    </div>
  )
}

export default LoginControl

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ μž…λ ₯κ°’ μ•Œλ¦Όμ°½μ— 좜λ ₯ν•˜κΈ°

App.tsx

import React, { useState } from 'react'

const App = () => {
  const [value, setValue] = useState('');
  const handleChange = (e) => {
    setValue(e.target.value);
  }
  const handleSubmit = (e) => {
    alert(`μž…λ ₯ν•œ 이름: ` + value);
  }
  return (
    <form onSubmit={handleSubmit}>
      <label>
        이름: 
        <input onChange={handleChange} value={value} type="text" />
      </label>
      <button type='submit'>제좜</button>
    </form>
  )
}

export default App

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ μž…λ ₯κ°’ μ•Œλ¦Όμ°½μ— 좜λ ₯ν•˜κΈ°2

App.tsx

import React, { useCallback, useState } from 'react'

const App = () => {
  const [value, setValue] = useState(`μš”μ²­μ‚¬ν•­μ„ μž…λ ₯ν•˜μ„Έμš”`);
  const handleChange = (e) => {
    setValue(e.target.value);
  }
  const handleSubmit = () => {
    alert(`μž…λ ₯ν•œ μš”μ²­μ‚¬ν•­: ` + value);
  }
  return (
    <form onSubmit={handleSubmit}>
      <label>
        μš”μ²­μ‚¬ν•­: 
        <textarea value={value} onChange={handleChange} />
      </label>
      <button>제좜</button>
    </form>
  )
}

export default App

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ select νƒœκ·Έ 선택값 좜λ ₯ν•˜κΈ°

App.tsx

import React, { useState } from 'react'

const App = () => {
  const [value, setValue] = useState('grape');
  const handleChange = (e) => {
    setValue(e.target.value);
  }
  const handleSubmit = () => {
    alert(`μ„ νƒν•œ 과일: ` + value);
  }
  return (
    <form onSubmit={handleSubmit}>
      <label>
        <select value={value} onChange={handleChange}>
          <option value="apple">사과</option>
          <option value="banana">λ°”λ‚˜λ‚˜</option>
          <option value="grape">포도</option>
          <option value="watermelon">μˆ˜λ°•</option>
        </select>
      </label>
      <button>제좜</button>
    </form>
  )
}

export default App

πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨πŸ’¨

πŸ’ μ²΄ν¬λ°•μŠ€&숫자 μž…λ ₯κ°’ 좜λ ₯ν•˜κΈ°

App.tsx

import React, { useState } from 'react'

const App = () => {
  const [haveBreakfast, setHaveBreakfast] = useState(true);
  const [numberOfGuest, setNumberOfGuest] = useState(2);
  const handleSubmit = (e) => {
    alert(`아침식사 μ—¬λΆ€: ` + haveBreakfast + `, 방문객 수: ` + numberOfGuest);
  }
  return (
    <form onSubmit={handleSubmit}>
      <label>
        아침식사 μ—¬λΆ€: 
        <input
          type="checkbox"
          checked={haveBreakfast}
          onChange={(e) => {
            setHaveBreakfast(e.target.checked);
          }}
        />
      </label>
      <br />
      <label>
        방문객 수: 
        <input
          type="number"
          value={numberOfGuest}
          onChange={(e: any) => {
            setNumberOfGuest(e.target.value);
          }}
        />
      </label>
      <button type='submit'>제좜</button>
    </form>
  )
}

export default App

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보