Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

브이로그

2024년 5월 16일 React-Counter 본문

React

2024년 5월 16일 React-Counter

황수환 2024. 5. 17. 01:49

 

1. Counter.js

import React, {useState} from "react";

function Counter() {

    // let number = 0
    const [number, setNumber] = useState(0) // 값이 변할 때마다 갱신(가상DOM)
    // 가상 DOM을 업데이트 => 전체 화면이 갱신
    const onIncrease = () => {
        // number++
        // console.log(number)
        setNumber(number + 1)
        console.log('+1')
    }

    const onDecrease = () => {
        // number--
        // setNumber(number + 1)
        setNumber(number - 1)
        console.log('-1')  
    }
    
    return (
        <div>
            <h1>{number}</h1> 
            <button onClick={onIncrease}>+1</button>
            <button onClick={onDecrease}>-1</button>
        </div>
    )
}

export default Counter

 

2. Input.js

import React, {useState} from "react";

function Input(){

    const [string, setString] = useState('')

    const inputString = (e) => {
        setString(e.target.value)

    }

    const outputString = () => {
        setString('')
    }

    return (
        <div>
            <input onChange={inputString} value={string}/>
            <button onClick={outputString}>초기화</button>
            <div>
                <b>값 : {string}</b>
            </div>
        </div>
    )
}

export default Input

 

3. MultiInput.js

import React, {useState} from "react";

function MultiInput() {

    // const [idstring, setidString] = useState('')

    // const [namestring, setnameString] = useState('')

    const [inputs, setInputs] = useState({
        userid: '',
        name:''
    })

    const {userid, name} = inputs

    const onChange = (e) => {
        const {value, name} = e.target
        setInputs({
            ...inputs,
            [name]: value
        })
    }

    // const onidChange = (e) => {
    //     setidString(e.target.value)
    // }

    // const onnameChange = (e) => {
    //     setnameString(e.target.value)
    // }

    const onReset = () => {
        // setidString('')
        // setnameString('')
        setInputs({
            userid: '',
            name: ''
        })
    }

    return (
        // <div>
        //     <input placeholder="아이디" onChange={onidChange} value={idstring}/>
        //     <input placeholder="이름" onChange={onnameChange} value={namestring}/>
        //     <button onClick={onReset}>초기화</button>
        //     <div>
        //         <b>값 : {idstring}({namestring})</b>
        //     </div>
        // </div>
        <div>
            <input placeholder="아이디" name="userid" onChange={onChange} value={userid}/>
            <input placeholder="이름" name="name" onChange={onChange} value={name}/>
            <button onClick={onReset}>초기화</button>
            <div>
                <b>값 : {userid}({name})</b>
            </div>
        </div>
    )
}

export default MultiInput

 

4. MultiCounter.jsx

import React, {useState} from "react";

export default  function MultiCounter({total, onClick}){

    const [count, setCount] = useState(0)
    return(
        <div className="box">
            <p className="number">
                {count} <span className="total">/{total}</span>
            </p>
            <button className="button" onClick={() => {
                setCount((prev) => prev + 1)
                onClick()
            }}>add</button>
        </div>
    )
}

 

4-1. AppCounter.jsx

import React, { useState } from "react";
import Counter from "./Counter";
import Input from "./Input";
import MultiInput from "./MultiInput";
import MultiCounter from "./Components/MultiCounter";
import './App.css'

export default function AppCounter() {
  const [count, setCount] = useState(0)
  const handleClick = () => setCount((prev) => prev + 1)

  return (
    <div className="container">
      <div className="banner">
         TotalCount: {count} { count > 10 ? '👍' : '👎'}
      </div>
      <div className="counters">
        <MultiCounter total={count} onClick={handleClick}/>
        <MultiCounter total={count} onClick={handleClick}/>
      </div>
    </div>
    
  );
}

 

5. App.css

.container{
  width: 600px;
  margin: auto;
}

.banner {
  text-align: center;
  margin-top: 5rem;
  font-size: 2rem;
  background-color: gold;
  font-weight: bold;
}

.box {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin: 2rem;
  padding: 1rem;
  border-radius: 1rem;
  border: 2px solid orange;
}

.counter:hover {
  background-color: ivory;
}

.number {
  font-size: 3rem;
}

.button {
  font-size: 2rem;
  padding: 0.2rem, 1rem;
  border-radius: 0.5rem;
  cursor: pointer;
  background-color: orange;
}

.total {
  font-size: 1rem;
  margin-left: 0.5rem;
}

'React' 카테고리의 다른 글

2024년 5월 17일 React-Effect(2)  (0) 2024.05.18
2024년 5월 17일 React-Effect  (0) 2024.05.18
2024년 5월 16일 React-List  (0) 2024.05.17
2024년 5월 13일 React  (0) 2024.05.14