Devlog/Web

[React] useAsync ์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ (if๋ฌธ โŒ)

FATKITTY 2021. 8. 27. 16:06
๋ฐ˜์‘ํ˜•

๐Ÿ’ข if๋ฌธ ๋‚ด์—์„œ useAsync ์‚ฌ์šฉ์ด ์•ˆ ๋˜๋Š” ๋ฌธ์ œ

 

โ–ช๋ฌธ์ œ์ƒํ™ฉ : 

ํ•œ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋‘ ๊ฐ€์ง€์˜ ์ƒํƒœ(buyer, seller)๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ๋ผ์„œ

userType์— ๋”ฐ๋ผ buyer/seller data๋ฅผ fetchํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

if (userType === 'buyer') {
  const [buyerState] = useAsync(() => InfoService.getBuyer(user), []);
} else {
  const [sellerState] = useAsync(() => InfoService.getSeller(user), []);
}

๊ทผ๋ฐ if๋ฌธ ์•ˆ์— useAsync ์„ ์–ธํ•˜์ž๋งˆ์ž ESLint๊ฐ€ ๊ฒฝ๊ณ ๋ฌธ์„ ๋„์›€.

React Hook "useAsync" is called conditionally. React Hooks must be called in the exact same order in every component render.

 

๊ทธ๋ž˜์„œ state ๋‘ ๊ฐœ๋ฅผ ๊ฐ๊ฐ ๋”ฐ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค.

  const [sellerState] = useAsync(() => InfoService.getSeller(user), []);
  const [buyerState] = useAsync(() => InfoService.getBuyer(user), []);
  const { loadingSeller, data: seller, errorSeller } = sellerState;
  const { loadingBuyer, data: buyer, errorBuyer } = buyerState;

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋‹ˆ๊นŒ ์ดํ•˜ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ๋‘ ๊ฐœ์˜ state์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ญ์ƒ ํ•ด์ค˜์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ณ  ์ง€์ €๋ถ„ํ•ด์กŒ๋‹ค.

if (userType === 'seller') {
  if (loadingSeller) return <div>๋กœ๋”ฉ์ค‘..</div>;
  if (errorSeller) return <div>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</div>;
  if (!seller) return <div>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>;
} else {
  if (loadingBuyer) return <div>๋กœ๋”ฉ์ค‘..</div>;
  if (errorBuyer) return <div>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</div>;
  if (!buyer) return <div>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>;
}

 

์ด๊ฑด ๋„ˆ๋ฌด ๋ฌด์‹ํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ๊ฐ™์•„์„œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ดค๋‹ค.

 

 

โ–ชํ•ด๊ฒฐ๋ฐฉ๋ฒ• : 

custom Hook ์ƒ์„ฑ.

๋‚˜๋Š” buyer/seller๋งŒ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋˜๋Š” ์ƒํ™ฉ์ด๋‹ˆ๊นŒ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

const [state] = useAsync(
  () =>
    userType === 'seller'
      ? InfoService.getSeller(user)
      : InfoService.getBuyer(user),
  [],
);
const { loading, data, error } = state;

// ...

if (loading) return <div>๋กœ๋”ฉ์ค‘..</div>;
if (error) return <div>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</div>;
if (!data) return <div>๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>;

ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ๋‹ค. (As it should be ๐Ÿ˜)

 

 

On a side note...

๋Œ€ํ•™ 4๋…„๊ฐ„ ๊ณผ์ œ/ํ”„๋กœ์ ํŠธ ๋ฐ๋“œ๋ผ์ธ์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด

'์–ด๋–ป๊ฒŒ๋“  ๋Œ์•„๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์ง€'๋ผ๋Š” ๋งˆ์ธ๋“œ๋กœ ์ฝ”๋”ฉ์„ ํ•ด์™”๊ธฐ์— ์Šต๊ด€์ด ํ•œ์ฐธ ์ž˜๋ชป ๋“ค์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์ต์ˆ™ํ•˜์ง€๊ฐ€ ์•Š๊ณ 

'์ •๋ง ์ตœ์„ ์œผ๋กœ ํšจ์œจ์ ์ธ ์ฝ”๋“œ์ธ์ง€'๋ฅผ ๊ณ„์† ์‹ ๊ฒฝ ์“ฐ๋‹ค ๋ณด๋‹ˆ๊นŒ ์ŠคํŠธ๋ ˆ์Šค๋„ ๋ฐ›๋Š”๋‹ค...ใ…œใ…œ

์ด๋Ÿฐ ์‚ฌ์†Œํ•œ ๋ฆฌํŒฉํ† ๋ง๋„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ์šฐ์Šค์›Œ๋ณด์ด๊ฒ ์ง€๋งŒ,

๋‚˜ํ•œํ…Œ๋Š” ํ•œ ๋‹จ๊ณ„์˜ ๋ฐœ์ „์ด๊ธฐ์— ๊ธฐ๋กํ•ด๋†“๋Š”๋‹ค.

 

๋ฐ˜์‘ํ˜•