isValidElement๋Š” ๊ฐ’์ด React ์—˜๋ฆฌ๋จผํŠธ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

const isElement = isValidElement(value)

๋ ˆํผ๋Ÿฐ์Šค

isValidElement(value)

isValidElement(value)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ value๊ฐ€ React ์—˜๋ฆฌ๋จผํŠธ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

import { isValidElement, createElement } from 'react';

// โœ… React ์—˜๋ฆฌ๋จผํŠธ
console.log(isValidElement(<p />)); // true
console.log(isValidElement(createElement('p'))); // true

// โŒ React ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹˜
console.log(isValidElement(25)); // false
console.log(isValidElement('Hello')); // false
console.log(isValidElement({ age: 42 })); // false

์•„๋ž˜์—์„œ ๋” ๋งŽ์€ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”

๋งค๊ฐœ๋ณ€์ˆ˜

value: ํ™•์ธํ•˜๋ ค๋Š” value์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜

isValidElement๋Š” value๊ฐ€ React ์—˜๋ฆฌ๋จผํŠธ์ธ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

  • createElement๊ฐ€ ๋ฐ˜ํ™˜ํ•œ JSX ํƒœ๊ทธ์™€ ๊ฐ์ฒด๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 42์™€ ๊ฐ™์€ ์ˆซ์ž๋Š” ์œ ํšจํ•œ React ๋…ธ๋“œ (์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์ง€๋งŒ)์ด์ง€๋งŒ, ์œ ํšจํ•œ React ์—˜๋ฆฌ๋จผํŠธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. createPortal๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด๊ณผ portal๋„ React ์—˜๋ฆฌ๋จผํŠธ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

์–ด๋–ค ๊ฒƒ์ด React ์—˜๋ฆฌ๋จผํŠธ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

์–ด๋–ค ๊ฐ’์ด React ์—˜๋ฆฌ๋จผํŠธ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด isValidElement๋ฅผ ํ˜ธ์ถœํ•ด ๋ณด์„ธ์š”.

React ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • JSX tag๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ’
  • createElement๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ฐ’

React ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฒฝ์šฐ isValidElement๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

import { isValidElement, createElement } from 'react';

// โœ… JSX ํƒœ๊ทธ๋Š” React ์—˜๋ฆฌ๋จผํŠธ์ž…๋‹ˆ๋‹ค.
console.log(isValidElement(<p />)); // true
console.log(isValidElement(<MyComponent />)); // true

// โœ… createElement๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ React ์—˜๋ฆฌ๋จผํŠธ์ž…๋‹ˆ๋‹ค.
console.log(isValidElement(createElement('p'))); // true
console.log(isValidElement(createElement(MyComponent))); // true

๋ฌธ์ž์—ด, ์ˆซ์ž, ์ž„์˜์˜ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค์€ React ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ isValidElement๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

// โŒ ์ด๊ฒƒ๋“ค์€ React ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ *์•„๋‹™๋‹ˆ๋‹ค*.
console.log(isValidElement(null)); // false
console.log(isValidElement(25)); // false
console.log(isValidElement('Hello')); // false
console.log(isValidElement({ age: 42 })); // false
console.log(isValidElement([<div />, <div />])); // false
console.log(isValidElement(MyComponent)); // false

isValidElement๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. ์ฃผ๋กœ โ€œ์—˜๋ฆฌ๋จผํŠธ๋งŒโ€ ํ—ˆ์šฉํ•˜๋Š” ๋‹ค๋ฅธ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์™€ (cloneElement๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ์ธ์ˆ˜๊ฐ€ React ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

isValidElementํ™•์ธ์„ ์ถ”๊ฐ€ ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ ์ด ํ™•์ธ์€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Deep Dive

React ์—˜๋ฆฌ๋จผํŠธ vs React ๋…ธ๋“œ

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ React ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function MyComponent() {
// ... React ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ...
}

React ๋…ธ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • <div /> ๋˜๋Š” createElement('div')์™€ ๊ฐ™์ด ์ƒ์„ฑ๋œ React ์—˜๋ฆฌ๋จผํŠธ์ž…๋‹ˆ๋‹ค.
  • createPortal๋กœ ์ƒ์„ฑ๋œ portal์ž…๋‹ˆ๋‹ค.
  • ๋ฌธ์ž์—ด
  • ์ˆซ์ž
  • true, false, null, ๋˜๋Š” undefined (ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)
  • ๋‹ค๋ฅธ React ๋…ธ๋“œ์˜ ๋ฐฐ์—ด

์ฃผ์˜ isValidElement๋Š” ์ธ์ˆ˜๊ฐ€ React ๋…ธ๋“œ์˜ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ React ์—˜๋ฆฌ๋จผํŠธ์˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 42๋Š” ์œ ํšจํ•œ React ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ React ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

function MyComponent() {
return 42; // ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
}

์ด๊ฒƒ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์—ฌ๋ถ€๋กœ isValidElement๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.