[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ]main-project - 10์ผ์ฐจ

JiEunยท2023๋…„ 7์›” 11์ผ
0
post-thumbnail

์œ ์ € ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝํ•˜๊ธฐ

๐Ÿค” ์ด์Šˆ์‚ฌํ•ญ

์ด๋Ÿฐ์‹์œผ๋กœ ์šฐ์ธก ํŽœ ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ
input์ด ๋‚˜์˜ค๊ณ  ์ˆ˜์ • ์‹œ ๋ฐ”๋กœ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋‘๊ฐœ์˜ ์ด์Šˆ์‚ฌํ•ญ์ด ์žˆ์—ˆ๋‹ค.
1. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋กœ ์ธํ•œ ๋ฒ„ํŠผ์˜ ์œ„์น˜
2. ์œ ์ € ๋‹‰๋„ค์ž„ ์ˆ˜์ • ํ›„ ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ๊ณ ์นจํ•ด์•ผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ

1.์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋กœ ์ธํ•œ ๋ฒ„ํŠผ์˜ ์œ„์น˜

์˜ค๋ฅ˜ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ
๊ธ€์ž ์ˆ˜๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ํ•˜๋‹จ์— ์•ˆ๋‚ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์ด๊ฒŒ ํ–ˆ๋‹ค.

ํŽœ์˜ ์œ„์น˜๋ฅผ position์œผ๋กœ ์žก์•˜๊ธฐ์—
ํ•˜๋‹จ์— ์•ˆ๋‚ด ๋ฉ˜ํŠธ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํŽœ์˜ ์œ„์น˜๊ฐ€ ๋‚ด๋ ค๊ฐ€๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค.

input์ฐฝ์ด ๊ณตํ†ต์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ผ ์ˆ˜์ •๋„ ๊นŒ๋‹ค๋กœ์› ๋‹ค.

input ์—ด๊ณ  ๋‹ซํž˜์„ boolean์œผ๋กœ,
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์•ˆ๋‚ด ๋ฉ˜ํŠธ๋„ boolean์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ ๋•Œ ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์€ ๊ทธ๋Ÿผ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฃผ๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค.

const WriteBtn = styled.button<IsNickNameT>`
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
  position: ${(props) => (props.toggleNickname ? 'absolute' : 'unset')};
  top: ${(props) => { (props.toggleNickname ? (props.isValidate ? '45%' : '35%') : 'unset'} ;
  }};
  right: ${(props) => (props.toggleNickname ? '0.3125rem' : 'unset')};
  transform: ${(props) =>
    props.toggleNickname ? 'translate(0, -50%)' : 'unset'};
`;

์ด๋ ‡๊ฒŒ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฃผ๋‹ˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
toggleNickname์€ ๋‹‰๋„ค์ž„ ์˜†์— ์žˆ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ ์—ฌ๋ถ€์ด๊ณ 
isValidate๋Š” ์œ ํšจ์„ฑ ์—ฌ๋ถ€์— ๋Œ€ํ•œ boolean๊ฐ’์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ
์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ค‘์ฒฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค.

๋งŒ์–€ eslint๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ชจ๋ฅธ์ฒด ๋„˜์–ด๊ฐ”์„ ๊ฑฐ๋‹ค.

const WriteBtn = styled.button<IsNickNameT>`
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
  position: ${(props) => (props.toggleNickname ? 'absolute' : 'unset')};
  top: ${(props) => {
    if (props.toggleNickname) {
      return props.isValidate ? '45%' : '35%';
    }
    return 'unset';
  }};
  right: ${(props) => (props.toggleNickname ? '0.3125rem' : 'unset')};
  transform: ${(props) =>
    props.toggleNickname ? 'translate(0, -50%)' : 'unset'};
`;

if๋ฌธ์„ ์ค˜์„œ ํ•ด๊ฒฐ ํ–ˆ๋‹ค.
๋ฆฌ์•กํŠธ๋Š” if๋ฌธ ๋ณด๋‹ค ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ์ด์ค‘ ์กฐ๊ฑด๋ฌธ ์ž‘์„ฑํ•  ๋•Œ์—๋„
์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ ๊ฐ™๋‹ค.



๊ทธ๋ ‡๊ฒŒ ์ˆ˜์ •๋œ ํ™”๋ฉด

2. ์œ ์ € ๋‹‰๋„ค์ž„ ์ˆ˜์ • ํ›„ ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ๊ณ ์นจ ํ•ด์•ผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ œ

useRef๋ฅผ ์ด์šฉํ•ด input value๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š”

const paintNickname = (e: React.FormEvent<HTMLFormElement>) => {
  if (isName) {
    e.preventDefault();
    mutation.mutate(memNicknameRef.current.value);
    setToggleNickname(!toggleNickname);
  }
};

๋‹‰๋„ค์ž„ ์ˆ˜์ •ํ•˜๋ฉด memNicknameRef.current.value์˜ ๊ฐ’์ด null๋กœ ๋‚˜์™€
๋ฐ”๋กœ ์ˆ˜์ •๋œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•˜๋‹ค.

์•Œ๊ณ  ๋ณด๋‹ˆ toggleNickname์„ ์ด์šฉํ•ด input์„ ๋ณด์ด๊ฒŒ, ์•ˆ๋ณด์ด๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ.

ref={memNicknameRef}๋Š” input์—๋งŒ ์žˆ์–ด์„œ
์—”ํ„ฐ ์น  ๊ฒฝ์šฐ input์ฐฝ๋„ ์‚ฌ๋ผ์ง€๊ณ  ๋‹ด๊ฒจ์ ธ ์žˆ๋Š” value๋„ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด์˜€๋‹ค.

ํ•œ์ฐธ ๊ณ ๋ฏผํ•˜๋‹ค. ๊ทธ๋Ÿผ ์‚ฌ๋ผ์ง€๊ธฐ ์ „์— ๊ทธ ๊ฐ’์„ ์ €์žฅํ•ด ๋ณด๋‚ด์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

const [nickName, setNickName] = useState<string>('');

๋ณ€๊ฒฝ๋œ ์œ ์ € ๋‹‰๋„ค์ž„์„ ์ €์žฅํ•  state๋ฅผ ์„ ์–ธํ•ด ์ฃผ์—ˆ๋‹ค.

useEffect(() => {
  if (memNickname && memNicknameRef.current) {
    dispatch(setUserOAuthActions.paintMemNickname(memNickname));
    memNicknameRef.current.value = memNickname;
    setNickName(memNicknameRef.current.value);
  }
}, [dispatch, memNickname, memNicknameRef, nickName]);

useEffect์„ ์ด์šฉํ•ด nickName์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ Œ๋”๋ง ๋˜๋„๋ก ํ–ˆ์œผ๋ฉฐ
memNickname์€ ์„œ๋ฒ„์— ์ €์žฅ๋œ ๋‚ด์šฉ์ด๊ณ 
nickName์€ ์ˆ˜์ •๋œ๊ฑธ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์ง€๊ฒŒํ•˜๋ ค๊ณ  ๋‚˜๋ˆ  ๋†จ๋‹ค.

const paintNickname = (e: React.FormEvent<HTMLFormElement>) => {
  if (isName) {
    e.preventDefault();
    mutation.mutate(nickName);
    setToggleNickname(!toggleNickname);
  }
};

์ˆ˜์ •๋œ ๋‹‰๋„ค์ž„์ด ์ €์žฅ๋œ nickName๋ฅผ ์„œ๋ฒ„์— ๋ณด๋‚ด ์คฌ๋‹ค.

<UserNickname>
	{nickName === '' ? userAuthInfo?.memberNickname : nickName}
</UserNickname>

nickName์— ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์œ ์ € ๋‹‰๋„ค์ž„์„,
๊ทธ๊ฒŒ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•œ ๋‹‰๋„ค์ž„์„ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ!

๐Ÿ› ๏ธ ์ถ”ํ›„ ๊ฐœ์„ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์€ ์ 

์ถ”ํ›„ ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ๋ฌด๋ฆฌ ๋œ๋‹ค๋ฉด ๋‹‰๋„ค์ž„ ์ˆ˜์ •์— ์กฐ๊ฑด์„ ๋‹ฌ๊ณ  ์‹ถ๋‹ค.

1. ํ•˜๋ฃจ ๋˜๋Š” ์ผ์ฃผ์ผ์— ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜ ์ œํ•œ

ํ•˜๋ฃจ์— ๋ช‡๋ฒˆ์ด๋‚˜ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฒ”์ฃ„์— ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์„œ๋ฒ„์—์„œ๋„ ๋ถ€๋‹ด์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
ํ•˜๋ฃจ ๋˜๋Š” ์ผ์ฃผ์ผ ๋“ฑ ์ˆ˜์ •๊ฐ€๋Šฅํ•œ ๊ฐœ์ˆ˜์™€ ๊ธฐ๊ฐ„์„ ์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

2. ๋น„๋ฐฉ์šฉ ๋‹‰๋„ค์ž„ ์‚ฌ์šฉ ๊ธˆ์ง€

์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์žˆ๊ธฐ์— ๋น„๋ฐฉ์šฉ ๋‹‰๋„ค์ž„์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


โœ๏ธ ๋งˆ์น˜๋ฉฐ

๋ธ”๋กœ๊น…์„ ๊ฑฐ์˜ ์ž‘์—…์„ ๋‹ค ํ•˜๊ณ  ์ž ๋“ค๊ธฐ ์ „์— ์ž‘์„ฑ์„ํ•œ๋‹ค.

๋‚ด๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋‹ฅ์ณค๊ณ  ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ ์ ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์–ด๋„
๊ธฐ๋กํ•  ์ˆ˜ ์—†์–ด ๊นŒ๋จน๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์ž‘์—…ํ•˜๋ฉด์„œ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑํ•˜๊ธฐ์—” ์ž‘์—… ํšจ์œจ์ด ๋–จ์–ด์ง„๋‹ค...
์ด๋ถ€๋ถ„์ด ๊ณ ๋ฏผ์ธ๊ฑฐ ๊ฐ™๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

0๊ฐœ์˜ ๋Œ“๊ธ€