๐Ÿ‘€ null๋„ children์— ์ธ์‹์ด ๋œ๋‹ค.

junameeยท2022๋…„ 7์›” 1์ผ
1

null๋„ children์— ํฌํ•จ๋˜๊ณ , child๋กœ ์ธ์‹๋œ๋‹ค

Divider ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€๋ชปํ–ˆ๋‹ค. (a + b + c) ์™€ ๊ฐ™์€ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€๋ฐ (a + b +)์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋‚˜์˜ค๋Š” ์ƒํ™ฉ.

๋””๋ฐ”์ด๋” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ.
secondCare์กด์žฌ์— ๋”ฐ๋ผ ์น ๋“œ๋Ÿฐ์ด 1๊ฐœ์ผ์ง€ 2๊ฐœ์ผ์ง€ ์ •ํ•ด์ง€๋Š” ์ƒํ™ฉ์œผ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค.

  <Divider
      divider={<>&nbsp;+&nbsp;</>}
               style={{justifyContent: 'start'}}
                 >
                   <BasicText h3 bold={700}>
                     {first_care?.name} ({first_care?.hour}์‹œ๊ฐ„)
      </BasicText>
      {Boolean(second_care) && (
        <BasicText h3 bold={700}>
        {second_care?.name} ({second_care?.hour}์‹œ๊ฐ„)
      </BasicText>
      )}
 </Divider>

๋””๋ฒ„๊น…ํ•ด๋ณด๋‹ˆ ์ด๋Ÿฐ ์ด์œ ์˜€๋‹ค.

React.Children.map(children,(child,idx)=>{ ... })

์—์„œ null๊ฐ’์ด children์œผ๋กœ ์ธ์‹๋˜์–ด ๋“ค์–ด์™”๋‹ค.
๋ฌผ๋ก  ์œ ํšจํ•œ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์•„๋‹ˆ๋‹ค. (!React.isValidElement(child))
์ด์œ ๋Š” children์€ ReactNode๋ฅผ ๋ฐ›๋Š”๋ฐ
ReactNode์˜ ํƒ€์ž…์— null์ด ํฌํ•จ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;

์ˆ˜์ • ์ „>>
null์—ญ์‹œ cloneChild๋กœ ์กด์žฌํ•˜๊ธฐ์—
divder์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

const Divider: React.FC<IDivider> = ({
  children,
  gap,
  divider = <Split {...{gap}} />,
  ...restProps
}) => {
  const lastChildIndex = React.Children.count(children) - 1
  
  return (
    <BasicFlex center {...restProps}>
      {React.Children.map(children, (child, idx) => {
        const cloneChild = React.isValidElement(child)
          ? React.cloneElement(child)
          : child
        return (
          <>
            {cloneChild} {lastChildIndex === idx ? null : divider}
          </>
        )
      })}
    </BasicFlex>
  )
}

์ˆ˜์ • ํ›„>>
cloneDvider๊ฐ€ null์ด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋„๋กํ–ˆ๋‹ค.
idx๋ฅผ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค์ธ์ง€ ์—ฌ๋ถ€๋กœ ํ™•์ธํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ด์กŒ๋‹ค. null์—ญ์‹œ React.Children.count(children)์˜ ๊ฐฏ์ˆ˜๋กœ ์นด์šดํŒ… ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต ๊ธฐ์ค€์œผ๋กœ ํƒ€๋‹นํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

const Divider: React.FC<IDivider> = ({
  children,
  gap,
  divider = <Split {...{gap}} />,
  ...restProps
}) => {
  return (
    <BasicFlex center {...restProps}>
      {React.Children.map(children, (child, idx) => {
        const cloneChild = React.isValidElement(child)
          ? React.cloneElement(child)
          : child

        if (!cloneChild) {
          return null
        }
        
         return (
          <>
            {idx === 0 ? null : divider}
            {cloneChild}
          </>
        )
      })}
    </BasicFlex>
  )
}
export default Divider
profile
์•„ํ‹ฐํด๋ฆฌ์ŠคํŠธ - bit.ly/3wjIlZJ

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