如何让孩子输入react

IT技术 javascript reactjs
2021-05-03 10:52:48

我正在尝试制作我自己的Tabs组件,以便我可以在我的应用程序中使用选项卡。但是,我似乎在尝试按类型提取我需要的子组件时遇到问题。

import React from 'react'

export class Tabs extends React.Component {
  render() {
    let children = this.props.children
    let tablinks = React.Children.map(children, x => {
      console.log(x.type.displayName) // Always undefined
      if (x.type.displayName == 'Tab Link') {
        return x
      }
    })

    return (
      <div className="tabs"></div>
    )
  }
}

export class TabLink extends React.Component {
  constructor(props) {
    super(props)
    this.displayName = 'Tab Link'
  }
  render() {
    return (
      <div className="tab-link"></div>
    )
  }
}

<Tabs>
    <TabLink path="tab1">Test</TabLink>
    <TabLink path="tab2">Test2</TabLink>
</Tabs>

console.log从不返回“标签链接”,它总是返回undefined,为什么?

3个回答

作为替代方案,您可以使用

console.log(x.type.name) // this would be 'TabLink'

在这种情况下,您不需要显式定义 displayName。

https://jsfiddle.net/lustoykov/u1twznw7/1/

这是undefined因为displayName应该是一个static财产。

class TabLink extends React.Component { 
  constructor(props) {
    super(props)
  }
  render() {
    return (
      <div className="tab-link"></div>
    )
  }
} 
TabLink.displayName = 'Tab Link'

jsfiddle(检查控制台)

您可以使用已定义的name属性:

if (x.type.name === TabLink.name) {
    return x
}

我建议使用TabLink.name代替'TabLink'字符串以更好地维护。

请参阅:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name