๐Ÿ–ฅFrontEnd/React

TIL) ์ž์‹์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•(state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ)

hellohailie 2022. 6. 27. 00:31

 

useState

const [changeData, setChangeData] = useState('')

useState๋Š” ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜๋Š” ๊ณณ์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด state๋กœ ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

 

state๊ฐ€ ๋ณ€ํ•  ๋•Œ, ์ด ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์œผ๋ฉด state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜(set์–ด์ฉŒ๊ณ )๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ state์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๋ฆฌ์•กํŠธ์—๊ฒŒ ๋งํ•˜๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•จ์ˆ˜๋Š” ๋˜ํ•œ useState๋กœ state๊ฐ€ ๋“ฑ๋ก๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌํ‰๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋ฆฌ์•กํŠธ์—๊ฒŒ ๋งํ•œ๋‹ค. 

๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  ๋˜ํ•œ ์ด JSX์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ํ‰๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๋‚œ ๋ฒˆ๊ณผ ๋น„๊ตํ•ด์„œ ๊ฐ์ง€๋œ ๋ณ€ํ™”๋“ค์„ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ฒŒ ํ•œ๋‹ค. 

 


state ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด์ „ ์ƒํƒœ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด? 

 

๐Ÿ‘‡์•„๋ž˜ ํ•จ์ˆ˜ ํผ ์‚ฌ์šฉํ•˜๊ธฐ!๐Ÿ‘‡

  const [userInput, setUserInput] = useState({

    enteredTitle: "",

    enteredAmount: "",

    enteredDate: "",

  });

 

setUserInput((prevState) => {

      return { ...prevState, enteredTitle: event.target.value };

    });

 


  • ๋ฒ„ํŠผ์˜ ํƒ€์ž…์ด submit ์ด๋ผ๋ฉด ํผ ๋Œ€์‹ ์— ํด๋ฆญ๋œ๋‹ค๋ฉด, ์ „์ฒด ํผ ์š”์†Œ๋Š” ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ƒ๋žตํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ submit์— ๋ฐ˜์‘ํ•˜๋Š” ํผ์—์„œ ํผ์ด ์ œ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ผ๋ถ€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

 

  • input์•ˆ์— ์žˆ๋Š” value์˜ ์—ญํ•  => ๋ชจ๋“  ์ž…๋ ฅ ์š”์†Œ๋“ค์ด ๊ฐ–๋Š” ๋‚ด๋ถ€ ๊ฐ’์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ. ์„ค์ •ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ๋œ ๊ธˆ์•ก์„ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด value={enteredTitle}๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

  • ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์€ ํผ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํผ ์ „์†ก์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ชจ์œผ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

์ž์‹์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• = state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ

=> props๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๊ณ  ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. 

 

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์จ์ค€๋‹ค. 

const NewExpense = () => {

  const saveExpenseDataHandler = (enteredExpenseData) => {

    console.log(enteredExpenseData);

  };

  return (

    <div className='new-expense'>

      <ExpenseForm onSaveExpenseData={saveExpenseDataHandler} />

    </div>

  );

};

 

 

์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์จ์ค€๋‹ค. (props ์จ์ค€๋‹ค.)

๋ฆฌํ„ด ์ „์— props.onSaveExpenseData(event.target.value); ๋ฅผ ์จ์ค€๋‹ค.

 

=> ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

=> ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ onSaveExpenseData() ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ์„ฑํ•œ data๋ฅผ (์—ฌ๊ธฐ์„œ๋Š” expenseData) ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

=> ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐ’์ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ๊ฐ’์ด๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” enteredExpenseData)

 

 

ํ˜•์ œ ์š”์†Œ๋ผ๋ฆฌ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ถ€๋ชจ๋ฅผ ํ™œ์šฉํ•œ๋‹ค. 

 

์–ด๋””๊นŒ์ง€ ๋Œ์–ด์˜ฌ๋ ค์•ผ ํ•˜์ง€?

 

=> ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ๋งŒํผ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค. 

 

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“