๋งˆ์ดํŽ˜์ด์ง€ ๋ฒ„๊ทธ, ์ •๋ณด ๋ณ€๊ฒฝ ํ™•์ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๐Ÿค”
728x90

Today, What I learned

ํŠœํ„ฐ๋‹˜์˜ ์ƒ์„ธํ•œ!.. ๊ฑฐ์˜ ์ „์ˆ˜ ํ…Œ์ŠคํŠธ ๊ธ‰์˜ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๋ฒ„๊ทธ..

๋ฒ„๊ทธ ํ•ด๊ฒฐ ๊ณผ์ •์„ ๊ธฐ๋กํ•ด ๋ณธ๋‹ค.

 

ํ˜„์žฌ ๋‚ด๊ฐ€ ์ž‘์—…ํ•œ ๋งˆ์ดํŽ˜์ด์ง€์—๋Š” ์ด๋Ÿฐ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋‹ค.

๊ธฐ์กด ์œ ์ € ์ •๋ณด์™€ ๋‹ฌ๋ผ์กŒ์„ ๋•Œ๋งŒ ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ทธ ๋ถ€๋ถ„์„ ๋นผ๋จน์–ด์„œ..

์ˆ˜์ •ํ–ˆ๋Š๋ƒ์˜ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ๊ณ„์†ํ•ด์„œ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์˜€๋‹ค!!... ((OMG))

 

์ด๋Ÿฐ ์˜๋ฏธ ์—†๋Š” ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๋ง‰๋Š” ์ผ์ด์•ผ๋ง๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋กœ์„œ ํ•ด์•ผ ํ•  ์ผ... ๐Ÿ˜‡

 

 

 

State ์ถ”๊ฐ€ํ•˜๊ธฐ

ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ์ €์žฅ๋œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ฌ state๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค.

const [defaultUserInfo, setDefaultUserInfo] = useState<UserInfo>(defaultInfo);

 

์ข€ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์“ฐ์ผ ๊ฒƒ์ด๋ผ ์ฝ”๋“œ ์–‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด setState ํ•จ์ˆ˜๋ฅผ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

  const updateDefaultUserInfoState = useCallback((user: UserInfo) => {
    setDefaultUserInfo({
      displayName: user?.displayName,
      email: user?.email,
      photoURL: user?.photoURL,
      isJunior: user?.isJunior,
      positions: user?.positions,
      plannerStack: user?.plannerStack || [''],
      designerStack: user?.designerStack || [''],
      developerStack: user?.developerStack || [''],
    });
  }, []);

 

 

๊ธฐ์กด state์™€ ๋ณ€๊ฒฝ๋œ state ๋น„๊ตํ•˜๊ธฐ

๋˜ ๊ธฐ์กด ์ •๋ณด์™€ ์ƒˆ๋กญ๊ฒŒ ์ˆ˜์ •ํ•œ ์ •๋ณด๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์„œ ๋ฒ„ํŠผ์„ ํ™œ์„ฑํ™”์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— useEffect๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 // ๊ธฐ์กด ์ •๋ณด์—์„œ ๋ณ€๊ฒฝ๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜์ •๋ฒ„ํŠผ ํ™œ์„ฑํ™”
  useEffect(() => {
    if (JSON.stringify(defaultUserInfo) !== JSON.stringify(userInfo)) {
      setActiveInfoBtn(true);
    } else {
      setActiveInfoBtn(false);
    }
  }, [userInfo]);

 

๋‘ state๋Š” ๊ฐ์ฒด์™€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— === ์—ฐ์‚ฐ์ž๋กœ ์ผ์น˜ํ•˜๋Š” ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค. (๊ฐ์ฒด๋Š” ์ฐธ์กฐ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—)

๊ทธ๋ž˜์„œ ๊ฐ์ฒด๊ฐ’์„ ์„œ๋กœ ๋น„๊ตํ•  ๋•Œ์˜ ๋ฐฉ๋ฒ•์ด ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ฃผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋น„๊ตํ•œ๋‹ค.

 

Object.entries(obj)์˜ ๊ฐ’์„ tostring()์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด ๋น„๊ตํ•˜๊ธฐ

if (Object.entries(defaultObj).toString() !== Object.entries(currentObj).toString()) ...

 

 

JSON.stringify๋กœ ๋น„๊ตํ•˜๊ธฐ

if (JSON.stringify(defaultUserInfo) !== JSON.stringify(userInfo)) { ...

 

JSON.stringyfy()๋Š” ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
์ด ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ๊ฒƒ ๊ฐ™์•„ ์„ ํƒ!

 

 

 

์ˆ˜์ • ์™„๋ฃŒ ํ›„ ๋‹ค์‹œ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ

์ˆ˜์ • ์™„๋ฃŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ๋Š” ๋‹ค์‹œ ๊ธฐ์กด ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•œ ์ •๋ณด๋กœ ๊ฐฑ์‹ ํ•ด์„œ ์ˆ˜์ •๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

  const handleUserInfoConfirm = () => {
       ...
    setActiveInfoBtn(false);
    updateDefaultUserInfoState(userInfo); // <<<<
  };

 

 

์ •์ƒ ๋™์ž‘

์ˆ˜์ •ํ•œ ๊ฒƒ์„ ๋ณด๋ฉด ๋ฒ„ํŠผ์ด ์ด์ œ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์„ฑํ™”, ๋น„ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!..

 

 

๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋” ๊ณ ๋ฏผํ•ด ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“  ํ•˜๋ฃจ.. ๐Ÿค”

728x90