ํฌ์Šค์ฝ” X ์ฝ”๋”ฉ์˜จ 7๊ธฐ 9์ฃผ์ฐจ ch2. React map, ref, lifecycle

2023. 6. 25. 17:26ใ†Study_Develop/ํฌ์Šค์ฝ” X ์ฝ”๋”ฉ์˜จ ๋ถ€ํŠธ์บ ํ”„

๋ฐ˜์‘ํ˜•

9์ฃผ์ฐจ๋„ ๋ˆˆ ๊ฐ์•˜๋‹ค ๋œจ๋‹ˆ ๋๋‚ฌ๋‹ค.

 

์›๋ž˜๋„ ๊ทธ๋žฌ์ง€๋งŒ 

์š”์ฆ˜๋”ฐ๋ผ.. ๋”์šฑ์ด

 

 

๊ณต๋ถ€ํ•˜๊ธฐ ์‹ซ๋‹ค.

 

ใ…‹ใ…‹ ์–ด์ฉŒ์ง€..

 

ํ•ด์•ผํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์•„์„œ

์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•˜๋Š” ์ค‘ ใ…‹

 

ํ•˜์ง€๋งŒ.. ์˜ค๋Š˜ ๋‚˜๊ฐ„ ์ˆ˜์—…์€

๊ผญ ๋ณต์Šต์„ ํ•ด์•ผ๋งŒ ๋‚ด์ผ์ˆ˜์—…์„ ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค 

 

๊ทธ๋Ÿฐ์˜๋ฏธ์—์„œ ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ

๊พธ์—ญ ๊พธ์—ญ ๋ณต์Šต์„ ํ•ด๋ณธ๋‹ค..

 

 

 

map()

 

 ์ผ๋ฐ˜ for ๋ฐ˜๋ณต๋ฌธ

 

- map()์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง€๋Š” callback ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ 

์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

 

- map()ํ•จ์ˆ˜๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ 

๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ

 

๋ฌธ๋ฒ•

arr.map( callbackFunction, [thisArg] )

 

callbackFunction

: ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ,

currentValue, index, array 3๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

[this.Arg]

: ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๊ณ , callbackFunction์—์„œ ์‚ฌ์šฉํ•  this๊ฐ์ฒด

 

let list = ['a', 'b', 'c', 'd', 'e'];
let items = list.map((txt, id, arr)=>{
    console.log("tx: ", txt);
    console.log("tx: ", txt);
    console.log("tx: ", txt);
    return txt + id;
 })

 

- txt : list๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋Œ๋ฉด์„œ ๋‚˜์˜ค๋Š” ๊ฐ’

- id : ๋ฐฉ๊ธˆ ๋‚˜์˜จ ๊ฐ’(txt)์˜ ์ธ๋ฑ์Šค

- arr : ํ˜„์žฌ ๋ฐ˜๋ณต์„ ๋Œ๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด

- items : "return txt + id;"๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด

 

Component์— map() ์ ์šฉ
function Repeat() {
  const list = ["a", "b", "c", "d", "e"];

  return (
    <>
      <div>
        {list.map((value) => {
          return <div>{value}</div>;
        })}
      </div>
    </>
  );
}

 

 

input ํƒœ๊ทธ๋กœ ์ƒˆ๋กœ์šด ์•ŒํŒŒ๋ฒณ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

 const addAlpha = () => {
    //concat() ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๊ฐ’์„ ๊ธฐ์กด ๋ฐฐ์—ด์— ํ•ฉ์น˜๊ธฐ
    const newAlpha = list.concat({ id: list.length + 1, alpha: inputAlpha });
    setList(newAlpha);
    setInputAlpha("");
  };
  
return (
    <>
      <input
        type="text"
        value={inputAlpha}
        onChange={(e) => setInputAlpha(e.target.value)}
      />
      <button onClick={addAlpha}>์ถ”๊ฐ€</button>
      <ol>
        {list.map((value) => {
          console.log(value);
          return (
            <li key={value.id}}>
              {value.alpha}
            </li>
          );
        })}
      </ol>
    </>
  );

 

โ“ concat()

: ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ’๋“ค์„ 

๊ธฐ์กด ๋ฐฐ์—ด์— ํ•ฉ์ณ์„œ ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

: concat์€ this๋‚˜ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ง„ ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ ,

๋Œ€์‹  ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ํ•ฉ์นœ๋’ค ๊ทธ ์–•์€ ์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

concat ์˜ˆ์ œ>

//๋ฐฐ์—ด ๋‘๊ฐœ ์ด์–ด ๋ถ™์ด๊ธฐ
const alpha = ['a', 'b', 'c'];
const numeric = [1, 2, 3];

alpha.concat(numeric);
// ๊ฒฐ๊ณผ: ['a', 'b', 'c', 1, 2, 3]
//๋ฐฐ์—ด ์„ธ๊ฐœ ์ด์–ด๋ถ™์ด๊ธฐ
const num1 = [1, 2, 3];
const num2 = [4, 5, 6];
const num3 = [7, 8, 9];

num1.concat(num2, num3);
// ๊ฒฐ๊ณผ: [1, 2, 3, 4, 5, 6, 7, 8, 9]

 

filter() ํ•จ์ˆ˜

- filter()์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง€๋Š” callbackํ•จ์ˆ˜์˜ 

ํ…Œ์ŠคํŠธ(์กฐ๊ฑด)๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์š”์†Œ๋ฅผ ๋ชจ์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑ

 

- filter()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ์ฝ”๋“œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

 

 

1. animal์—์„œ ๊ธธ์ด๊ฐ€ 3 ์ด์ƒ์ธ animals์„ return ํ•˜๋Š” ํ•จ์ˆ˜!

function Filter() {
  const animals = ["dog", "cat", "rabbit"];
  return (
    <>
      <div>
        {animals.filter((aaa) => {
          return aaa.length > 3;
        })}
      </div>
    </>
  );
}

 

 

 

2. ์•ŒํŒŒ๋ฒณ ๋”๋ธ” ํด๋ฆญ ํ–ˆ์„ ๋•Œ ์•ŒํŒŒ๋ฒณ ์‚ญ์ œํ•˜๊ธฐ

 

 const deleteAlpha = (id) => {
    //์ผ์น˜ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋งŒ ๋นผ๊ณ  list์— ๋‹ด์Œ
    const newAlpha = list.filter((value) => value.id !== id);
    setList(newAlpha);
    console.log(newAlpha);
  };
  
  ...
  
   return (
            <li key={value.id} onDoubleClick={() => deleteAlpha(value.id)}>
              {value.alpha}
            </li>
          );

 

ref

html์—์„œ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ๋•Œ

id๋ฅผ ์ง€์ •ํ•œ ํ›„ ์š”์†Œ๋ฅผ ํ›„์ถœํ•œ๋‹ค.

 

<div id = "id1">๋‚ด์šฉ</div>

 

๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด id ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ref๋ฅผ ์‚ฌ์šฉ!

 

ref๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์ž‘๋™๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

 

ref๋ž€? reference

 

- ์ „์—ญ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ ๋ฐ ์‚ฌ์šฉ

 

- ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋ณตํ•ด ์‚ฌ์šฉํ•ด๋„ 

๊ฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.

 

- dom ์„ ์ง์ ‘์ ์œผ๋กœ ๊ฑด๋“œ๋ ค์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

- ref prop

: html์š”์†Œ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ref prop์— ์ €์žฅ

 

<element ref={myRef}></element>

 

 

Ref ์‚ฌ์šฉํ•˜๊ธฐ (ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ)

 

useRef()

: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useRef()๋ฅผ ์ด์šฉํ•˜์—ฌ Dom ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค.

 

//1. ref ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
const myRef = useRef();

//2. ์„ ํƒํ•˜๊ณ  ์‹ถ์€ dom์— ref๊ฐ’์œผ๋กœ ์„ค์ •
<element ref={myRef}></element>

//3. useRef()๋กœ ๋งŒ๋“  ๊ฐ์ฒด ์•ˆ์˜ current ๊ฐ€ ์‹ค์ œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ด
myRef.current;

 

๋ฌธ์ œ1. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input focusing

 

function RefSample() {
  //1. ref๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
  const inputRef = useRef();

  const handleFocus = () => {
    //3. useRef()๋กœ ๋งŒ๋“  ๊ฐ์ฒด์˜ current ๊ฐ’์œผ๋กœ ์ ‘๊ทผ
    //focus(): ์ง€์ •๋œ html์š”์†Œ์— ํฌ์ปค์Šค ์„ค์ •
    inputRef.current.focus();
  };

  return (
    <>
      <p>ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input focusing</p>
      {/* 2. ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” dom ์š”์†Œ์— ref prop์„ค์ • */}
      <input ref={inputRef} type="text" />
      <button onClick={handleFocus}>focus</button>
    </>
  );
}

 

2. ref๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ 1์”ฉ ์ฆ๊ฐ€

 

function RefSample2() {
  //1. useRef()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ
  const idRef = useRef(1);

  const plusId = () => {
    idRef.current += 1;
    console.log(idRef.current);
  };

  return (
    <>
      <h1>{idRef.current}</h1>
      <button onClick={plusId}>plus ref</button>
    </>
  );
}

 

 

3๋ฒˆ.

 

   const [inputWriter, setInputWriter] = useState("");
   const [inputTitlt, setInputTitle] = useState("");
   const writerInputElem = useRef();
   const titleInputElem = useRef();
  
  ...
  
  //input ๋นˆ ๊ฐ’ ๊ฒ€์‚ฌ
  const checkInput = () => {
    //input์— ๊ฐ’์ด ์—†์œผ๋ฉด ํ•ด๋‹น input focusing
    if (inputWriter.trim().length === 0) {
      writerInputElem.current.focus();
      return false;
    }
    if (inputTitlt.trim().length === 0) {
      titleInputElem.current.focus();
      return false;
    }
    return true;
  };
  
  ...
  
  <input
          ref={writerInputElem}
          value={inputWriter}
          ...

 

- trim : ๋ฌธ์ž์—ด์„์ž…๋ ฅ๋ฐ›๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด์„ ํ•ฉ์น  ๊ฒฝ์šฐ 

์“ธ๋ฐ ์—†๋Š” ๊ณต๋ฐฑ์ด ๋”ฐ๋ผ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ์“ฐ๋Š” ํ•จ์ˆ˜

 

//trimํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ
String str = " ๋ฌธ์ž์—ด์— ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ";		
System.out.println(str);

str = str.trim();
System.out.println(str);

 

Ref ์‚ฌ์šฉํ•˜๊ธฐ (ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ)

 

1. ์ฝœ๋ฐฑ ํ•จ์ˆ˜

- ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” DOM ์š”์†Œ์— ref๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ž‘์„ฑ ๋ฐ props๋กœ ์ „๋‹ฌ

 

- ref ๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š”๋ฐ,

 ์ด๋•Œ ref๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

<input ref={(ref=> {this.input = ref} />

 

 


 

Life Cycle

- ๋ผ์ดํ”„ ์‚ฌ์ดํด

 

- ์ˆ˜๋ช… ์ฃผ๊ธฐ

 

- ๋ชจ๋“  react component์— ์กด์žฌํ•˜๋Š” ๊ฒƒ

 

 

- Mount

: dom ์ด ์ƒ์„ฑ๋˜๊ณ 

์›น ๋ธŒ๋ผ์šฐ์ € ์ƒ์— ๋‚˜ํƒ€๋‚จ

 

- Update

: props or state๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์—…๋ฐ์ดํŠธ ํ•จ

 

- UnMount

: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ(์ œ๊ฑฐ๋ ) ๋•Œ

 

 

LifeCycle ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ

useEffect()

- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect()๋ฅผ ์‚ฌ์šฉํ•ด

Mount, Update, Unmount ์‹œ ํŠน์ • ์žก์—…์„ ์ฒ˜๋ฆฌํ•จ

 

//์ปดํฌ๋„ŒํŠธ Mount or Update๋  ๋•Œ ๋™์ž‘
useEffect(() => {});

//์ปดํฌ๋„ŒํŠธ Mount๋  ๋•Œ ๋™์ž‘
useEffect(() => {}, []);

//data ๊ฐ’์ด Update ๋  ๋•Œ ๋™์ž‘
const [data, setData] = useState();
useEffect(()=>{}, [data]);
  //text๊ฐ€ ๋ณ€๊ฒฝ๋ ๋•Œ
  useEffect(() => {
    console.log("Text | Update");
  }, [text]);
//3 ์ดˆ ํ›„ post๋ณด์—ฌ์ฃผ๊ธฐ
useEffect(() => {
    setTimeout(() => {
      getPost();
    }, 3000);
  }, []);

 

 

LifeCycle ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

 

๋งˆ์šดํŠธ ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ

 

๋งˆ์šดํŠธ (Mount)

- constructor

- render

- getDerivedStateFromProps

- componentDidMount

 

์—…๋ฐ์ดํŠธ(update)

: ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ

- getDerrivedStateFromProps

- shouldComponentUpdate

- componentDidUpdate

 

์–ธ๋งˆ์šดํŠธ(unmount)

- componentWillUnmount

 

 

-> ํ˜„์žฌ์—๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ!

 

  changeNumber = () => {
    this.setState({ number: this.state.number + 1 });
  };
  changeVisible = () => {
    this.setState({ visible: !this.state.visible });
  };

 

 

.

.

.

 

์ด๋งŒ!