簡體   English   中英

如何檢查 Dom 元素或 React 組件

[英]How to check if Dom Element or React Component

在創建 HOC 時,我不確定將包裝哪種組件,有時它是另一個 React 組件,有時它可能是一個普通的 DOM 元素,如lia

WrappedComp = myHOC(BaseComponent)

MyHOC 會將額外的 props 傳遞給被包裝的組件,並且在大多數情況下這會正常工作。

但有時當 BaseComponent 是一個li它不會接受額外的道具,React 會拋出一個警告Unkown Prop Warning說 DOM 元素不接受非標准的 dom 屬性: https : //facebook.github.io/react/警告/未知prop.html

那么我如何檢查 BaseComponent 是 DOM 元素還是其他元素呢? 如果是,我不會將額外的道具傳遞給它。

有一個更好的方法嗎?

簡短的回答:
檢查元素是否為string類型以檢查元素是否為 DOM 元素。
檢查 element 是否屬於function類型以檢查 element 是否是 React 組件。

例子:

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

長答案:
React 文檔中所定義,像<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>
  )
}

檢查BaseComponent是否是React組件,並添加所需的props。

if(BaseComponent.prototype.isReactComponent){
    //add props
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM