javascript - 如何检查 Dom Element 还是 React Component

标签 javascript reactjs dom

当创建 HOC 时,我不确定将包装哪种类型的组件,有时它是另一个 React 组件,有时它可能是一个普通的 DOM 元素,如 lia.

WrappedComp = myHOC(BaseComponent)

MyHOC 会将额外的属性传递给包装的组件,在大多数情况下,这将按其应有的方式工作。

但有时,当 BaseComponent 是一个 li 时,它不会接受额外的 props,React 会抛出一个警告 Unkown Prop warning 说 DOM 元素不接受非-标准dom属性:https://facebook.github.io/react/warnings/unknown-prop.html

那么我如何检查 BaseComponent 是否是 DOM 元素或者其他元素? 如果是的话,我不会将额外的 Prop 传递给它。

有更好的方法吗?

最佳答案

简短回答:
检查元素是否属于 string 类型检查元素是否是 DOM 元素。
检查元素是否属于 function 类型检查 element 是否是 React 组件。

示例:

  if (typeof BaseComponent.type === 'string') {
    return BaseComponent
  }
  // add props

长答案:
the React documentation 中定义,内置组件如 <li><span>结果是一个字符串 'li''span'被传递到React.createElement ,例如React.createElement("li") .
以大写字母开头的类型,如 <Foo />编译为React.createElement(Foo)并对应于 JavaScript 文件中定义或导入的组件。

因此,React 组件的类型为 function ,而 DOM 组件的类型为 string .

以下WrapperComponent记录typeof child.type每个子元素。输出是function , string , string .

function WrappedComponent({children}) {
  return React.Children.map(children, child => {
    console.log(typeof child.type)
    ...
  })
}

const BaseComponent = ({children}) => children

function App() {
  return (
    <WrappedComponent>
      <BaseComponent>This element has type of function🔥</BaseComponent>
      <span>This element has type of string</span>
      <li>This element has type of string</li>
    </WrappedComponent>
  )
}

关于javascript - 如何检查 Dom Element 还是 React Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366843/

相关文章:

javascript - 如何在不将用户重定向到该 URL 页面的情况下发送 GET 值?

javascript - 在 '...0.0"附近解析时 JSON 输入意外结束 ,"acorn-globals":'

reactjs - 使用 D3 在 ReactJS 中没有获得具有预期链接样式的树

javascript - 正则表达式效率,在 html 中选择文本的更好方法

javascript - 在 JavaScript 中是否有可能获得对唯一 DOM 元素的唯一引用(用作对象中的唯一键)?

javascript - 如何在不向DOM呈现任何内容的情况下计算文本高度?

javascript - 运行代码时警报显示错误消息

javascript - 回发之前的表单标题

javascript - VSCode如何禁用/删除 "react/cjs/react.development"自动完成

javascript - 当我 goBack() 时如何刷新上一个屏幕