• React

[REACT] State / Event

man_on 2021. 9. 4. 19:33
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

State ?

 

 

 

๐Ÿ”ป State๋ž€

: ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ฐ€์ง€๊ณ ์žˆ๋Š”, ๊ฐ์ฒดํ˜•ํƒœ์˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์ด๋ฉฐ 

ํ•จ์ˆ˜๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ •์˜ํ•˜๊ณ   ์‚ฌ์šฉํ•˜๋ฉฐ ๋ณ€๊ฒฝ๊นŒ์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด.

(state๋Š” object์ด๊ณ  compo์˜ data๋ฅผ ๋„ฃ์„ ๊ณต๊ฐ„์ด ์žˆ๊ณ , ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ•จ)

 

 

- State๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  

   : ์ปดํฌ๋„ŒํŠธ์•ˆ์˜ ์š”์†Œ์—์„œ ๊ทธ ์ƒํƒœ๊ฐ’๋ฐ˜์˜ํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ™”๋ฉด(UI)์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”.

 

 

- State์™€ Props์˜ ์ฐจ์ด

   : ๋‘๊ฐ์ฒด ๋ชจ๋‘ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ •๋ณด(์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ๊ฐ’)๋ฅผ ๊ฐ€์ง.

    props :  (ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ๋ฐ›๊ณ ,

                    ์ด props๋Š” ์ƒ์†๋ฐ›์€ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ(์ฝ๊ธฐ์ „์šฉ)

    state : (ํ•จ์ˆ˜๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜๊ธฐ ๋Œ€๋ฌธ์— ๋ณ€ํ• ์ˆ˜์žˆ๊ณ  ์ง์ ‘๋ณ€๊ฒฝ๊ฐ€๋Šฅ

                 ๋˜ํ•œ, state๋ฅผ ํ†ตํ•ด props๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐ์‹œ์ผœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ถ€์—์„œ ์€๋‹‰ํ•˜๋Š” ์ฆ‰, ์บก์Šํ™”ํ†ตํ•ด ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์„ฑ ๋งŒ๋“ฌ

 

 

- ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ State๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

   : constructorํ•จ์ˆ˜๋ฅผ component์„ ์–ธ๋ฌธ๊ณผ renderํ•จ์ˆ˜ ์‚ฌ์ด์— ์ž‘์„ฑํ•˜์—ฌ

     dot notations(this.state.~)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํŠน์„ฑ์— ์ ‘๊ทผํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ์ง€์ •

import React from 'react';

class State extends React.Component {
  constructor() {          //ํ•จ์ˆ˜
    super();               //super๋ฅผ ํ˜ธ์ถœ
    this.state = {         //state ๊ฐ์ฒด
      color: 'red'          //dolor์˜ key๊ฐ’์œผ๋กœ 'red' value์ง€์ •
    };
  }

  render() {              //ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์€ JSX์š”์†Œ
    return (
      <div>
        <h1>Class Component | State</h1>
      </div>
    );
  }
}

export default State;

ex) ๊ธ€์ž์ƒ‰

this(ํ•ด๋‹น์ปดํฌ๋„ŒํŠธ) .state (์˜ state๊ฐ์ฒด) .color (์˜ key=color๊ฐ’=red)

๋”๋ณด๊ธฐ
import React, { Component } from 'react';

class State extends Component {
  constructor() {
    super();
    this.state = {
      color: 'red',
      abc: '40px'
    };
  }

  render() {
    return (
      <div>
        <h1 style={{ color: this.state.color, fontSize: this.state.abc }}>
        Class Component | State
        </h1>
      </div>
    );
  }
}

export default State;

https://lucybain.com/blog/2016/react-state-vs-pros/

 

Lucy Bain

 

lucybain.com

 

 

 

 

 


state ๋ณ€๊ฒฝ

 

 

 

> ๋ถ€๋ชจ์˜ state๋ฅผ props๋กœ ์ „๋‹ฌ๊ฐ€๋Šฅ

> ์ž์‹ ์˜ state๊ฐ’ ๋ฐ”๊พธ๋ ค๋ฉด this.setState๋กœ ๋ณ€๊ฒฝ

> event handlerํ•จ์ˆ˜ 

  ์ž์‹ compo์—์„œ ๋ถ€๋ชจ compo์˜ state๋ณ€๊ฒฝํ•˜๋ ค๋ฉด this.setState ๋กœ์ง๋‹ด๊ธด ํ•จ์ˆ˜๋ฅผ props๋กœ ๋ฐ›์•„์•ผํ•จ

 

 

 

ex) ๋ฒ„ํŠผํด๋ฆญ event

 

import React, { Component } from 'react';

class State extends Component {
  constructor() {
    super();
    this.state = {
      color: 'red',
    };
  }

  handleColor = () => {            // 2.ํ˜„์žฌ compo์˜ handlecolorํ•จ์ˆ˜์‹คํ–‰
    this.setState({                // 2-1 setStateํ•จ์ˆ˜์‹คํ–‰ > blue๋ณ€๊ฒฝ
      color: 'blue'
    })
  }

  render() {                       // 3. renderํ•จ์ˆ˜ํ˜ธ์ถœ
    return (                       // 4. ๋ฐ”๋€state๊ฐ’ ๋ฐ˜์˜ํ•˜์—ฌ h1๊ธ€์ž ์ƒ‰ ๋ณ€๊ฒฝ
      <div>                    
        <h1 style={{ color: this.state.color }}>Class Component | State</h1>
        <button onClick={this.handleColor}>Click</button>       
      </div>                                   // 1.onclick event๋ฐœ์ƒ>this.hand~  
    );
  }
}

export default State;

 

 

 

ex2) ์œ„์˜ inline style(ํƒœ๊ทธ์— ๋ฐ”๋กœ ์Šคํƒ€์ผ ์ฃผ๋Š” ํ˜•ํƒœ)์€ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹์ง€์•Š์Œ

     > state์— ๋”ฐ๋ผ className๋ฐ”๋€Œ๊ฒŒ ํ•˜์—ฌ style๋ณ€๊ฒฝ

import React, { Component } from 'react';

class State extends Component {
  constructor() {
    super();
    this.state = {
      isRed: true,
    };
  }

  handleColor = () => {
    this.setState({
      isRed: !this.state.isRed
    })
  }

  render() {
    return (
      <div>
        <h1 className={isRed ? "red" : "blue"}>Class Component | State</h1>
        <button onClick={this.handleColor}>Click</button>
      </div>
    );
  }
}

export default State;

 

 

 

 

ex) ๋ถ€๋ชจ์˜ state > ์ž์‹์—๊ฒŒ

// Parent.js

import React from 'react';
import Child from '../pages/Child/Child';

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: 'red'
    };
  }

  render() {
    return (
      <div>
        <h1>Parent Component</h1>
				<Child titleColor={this.state.color}/>
      </div>
    );
  }
}

export default Parent;
// Child.js

import React from 'react';

class Child extends React.Component {
  render() {
		console.log("์ด๊ฐ’์€๋ญ˜๊นŒ?", this.props.titleColor);

    return (
      <div>
        <h1 style={{color : this.props.titleColor}}>Child Component</h1>
      </div>
    );
  }
}

export default Child;

 

 

 

 

> ex) props๋กœ state์™€ event handler๋„˜๊ธฐ๊ธฐ

import React from 'react';
import Child from '../pages/Children/Children';

class Parent extends React.Component {
  constructor() {
    super();
    this.state = {
      color: 'red'
    };
  }

  changeColor = () => {
    this.setState({
      color: 'blue'
    })
  }

  render() {
    return (
      <div>
        <h1>Parent Component</h1>
        <Child titleColor={this.state.color} changeColor={this.changeColor}/>
      </div>
    );
  }
}

export default State;
import React from 'react';

class Child extends React.Component {
  render() {
		// console.log(this.props);

    return (
      <div>
        <h1 style={{color : this.props.titleColor}}>Child Component</h1>
        <button onClick={this.props.changeColor}>Click</button>
      </div>
    );
  }
}

export default State;

 

 

 

 


 

 

 

 

 

์—ฌ๋Ÿฌ state ๊ด€๋ฆฌ

 

 

 

 

 ํ•˜๋‚˜์˜ state๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ state๊ด€๋ฆฌํ•˜๊ธฐ

 

  const [title, setTitle] = useState("");
  const [amount, setAmount] = useState("");
  const [date, setDate] = useState("");
  
  //์œ„์˜ 3๊ฐœ์˜ state๋ฅผ ํ•˜๋‚˜์˜ state์— ๋‹ด๋Š”๋‹ค.
  const [userInput, setUserInput] = useState({
    title: "",
    amount: "",
    date: "",
  });

 

 

title๋งŒ ๋ณ€๊ฒฝํ•  ๋•Œ ๋‚˜๋จธ์ง€ 2๊ฐœ์˜ state๋„ ๊ฐ€์ ธ์™€์„œ ์žƒ์–ด๋ฒ„๋ฆฌ์ง€์•Š๋„๋ก ...userInput๋กœ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ 

์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๊ฐ’์„ ๋ฎ์–ด์“ด๋‹ค.

ํ•˜์ง€๋งŒ, ์ด ๋ฐฉ์‹์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (counter manage๊ฐ™์€ ๊ฒฝ์šฐ) 

๋™์‹œ์— ๋งŽ์€ state๋ฅผ ์—…๋ฐ์ดํ„ฐํ•œ๋‹ค๋ฉด ์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ state snapshot์— ์˜์กดํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ๋œ๋‹ค.

  const titleChanageHandle = (event) => {
    setUserInput({
      ...userInput,         [์ด์ „์ƒํƒœ์— ์˜์กด]
      title: event.target.value,
    });

 

 

๋”ฐ๋ผ์„œ,  '์ด์ „ state์— ๋”ฐ๋ผ state๊ฐ€ update๋œ๋‹ค๋ฉด' setUserInputํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ํ•จ์ˆ˜๋ฅผ pass in ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” state๊ฐ€ ํ•ญ์ƒ ์ตœ์‹ ์ƒํƒœ์ด๋‹ค. ( ๋ชจ๋“  ๊ณ„ํš๋œ state update๋ฅผ ๊ธฐ์–ต )

  const titleChanageHandle = (event) => {
   setUserInput((prevState) => {
      return { ...prevState, title: event.target.value };
    });

 

 

 

 



 

 

state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ

 

 

 

Lifting State Up

ํ•˜์œ„์˜ component์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์œ„์˜ component๋กœ pass

 

1. ์ƒ์œ„์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค (ํ•จ์ˆ˜๋ฅผ pointer๋กœ data๋ฅผ passํ•œ๋‹ค.)

2. ๋งŒ๋“ ํ•จ์ˆ˜๋ฅผ props๋กœ ํ•˜์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜๊ฒจ์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ์ค์คํ•œ๋‹ค.

( ์ž์‹-์ž์‹๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ํ•ญ์ƒ ๋‹จ๊ณ„๋ณ„๋กœ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค.)

 

 

 

 

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ App์—์„œ ํ•˜์œ„์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ ํ•œ๋‹ค.

ํ•˜์œ„์˜ '๋ฐ์ดํ„ฐ'๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ์œ„ํ•ด ๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜๋ฅผ props๋กœ ํ•˜์œ„์— ๋„˜๊ฒจ์ค€๋‹ค.

function App() {
  const ๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜ = (๋ฐ์ดํ„ฐ) => {
    console.log(๋ฐ์ดํ„ฐ);
  };

  return (
    <div>
      <์ž์‹์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜={๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜} />
    </div>
  );
}

 

ํ•˜์œ„์ปดํฌ๋„ŒํŠธ์—์„œ props๋กœ '๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜'๋ฅผ๋ฐ›์•„์„œ ํ•˜์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

const ์ž์‹ = (props) => {
  const ์–ด๋–คํ•จ์ˆ˜ = () => {
    const ๋ฐ์ดํ„ฐ = {
      ์–ด์ฉŒ๊ณ ์ €์ฉŒ๊ณ 
    };
    props.๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๊ธฐํ•จ์ˆ˜(๋ฐ์ดํ„ฐ);
  };
  
  return...

 

 

์˜ˆ์‹œ)

const NewExpense = ( ) => {
  const saveExpenseDataHandler = (enteredExpenseData) => {
    const expenseData = {
      ...enteredExpenseData,
      id: Math.random().toString(),
    };
    
  return (
      <ExpenseForm onSaveExpenseData={saveExpenseDataHandler} />
    );
  };
const ExpenseForm = (props) => {

  const sumitHandler = (event) => {
    event.preventDefault();

    const expenseData = {
      title: enteredtitle,
      amount: enteredamount,
      date: new Date(entereddate),
    };
    props.onSaveExpenseData(expenseData);

    setEnteredTitle("");
    setEnteredAmount("");
    setEnteredDate("");
  };

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'โ€ข React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Router  (0) 2021.10.24
[React] React hook basic  (0) 2021.10.21
[REACT] Component / Props / Mock data  (0) 2021.09.01
[REACT] JSX / Component  (0) 2021.08.30
[REACT] React  (0) 2021.08.29