当前位置: 首页 > 面试题库 >

ReactJS-React.Children.forEach-我可以获取子组件名称吗?

罗智志
2023-03-14
问题内容

我有一个带有许多子元素的React(15.5.4)组件,其中一些是HTML元素,另一些是其他React组件。

我正在使用服务器渲染,并且在服务器和客户端上需要相同的行为。客户将使用React的生产版本。

我需要遍历子级并确定一种特定类型的React组件。所以我首先想到的是迭代使用React.Children.forEach()并寻找组件名称。

React.Children.forEach(this.props.children, child => {
  console.log('name =', child.name)
})

似乎child.name并且child.displayName不存在。

现在,child.type存在,它可以是一个字符串(对于HTML元素),也可以是"ul"一个函数(对于React组件)。

当它是一个函数时,我可以lodash/get像这样使用const type = get(child, 'type.name', '')以获取组件名称。 但是
,这似乎只能在服务器上运行,而不能在客户端生产版本(返回字符串:)中使用"t"。看起来开发版本使用我的组件名称作为该功能,但是生产版本将其重命名为t()。所以我不能使用child.type.name

我如何:

  1. 遍历组件子项并标识组件的特定类型。
  2. 在React构建的开发和生产中哪个起作用?

问题答案:

您可以在属性中设置组件的名称displayName。如果您使用的是ES6类,则可以设置一个称为displayNamecomponent的类的静态属性。然后,您将可以通过获得子名称child.type.displayName

const FirstChild = ({ name }) => <li>{name}</li>;

FirstChild.displayName = 'FirstChild';



const SecondChild = ({ name }) => <li>{name}</li>;

SecondChild.displayName = 'SecondChild';



class ThirdChild extends React.Component {

  static displayName = 'ThirdChild';



  render() {

    return (

      <li>{this.props.name}</li>

    );

  }



}



class Parent extends React.Component {

  componentDidMount() {

    React.Children.forEach(this.props.children, child => {

      console.log('name =', child.type.displayName);

    })

  }



  render() {

    return (

      <ul>{this.props.children}</ul>

    );

  }

}



class App extends React.Component {

  render() {

    return (

      <Parent>

        <FirstChild name='1st child value' />

        <SecondChild name='2nd child value' />

        <ThirdChild name='3rd child value' />

      </Parent>

    );

  }

}





ReactDOM.render(<App />, document.getElementById("app"));


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>


 类似资料:
  • 问题内容: 我正在开发一个React应用程序。我有一个Loading组件,这是一个等待动画的动画。我想根据调用它的组件在此Loading组件中添加一条消息。 这是我如何调用我的Loading组件(this.state.displayLoading为true或false): 我想在我的变量loadingFrom中获取“ LoginForm”,它是className。也许这不是正确的方法。 问题答案:

  • 问题内容: 我正在使用JSBin上的ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,那么它将不起作用。 例如,以下内容不呈现: 但是,一旦我替换为,它就会渲染。 我不能以小写字母开头的标签有原因吗? 问题答案: 在JSX中,小写标签名称被认为是HTML标签。但是,带点号(属性访问器)的小写标记名称不是。 参见HTML标签与React组件。 编译为(html标记) 编译为 编译为

  • 我正在JSBin上玩ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,它就不起作用。 例如,以下内容不会呈现: 但只要我用替换它就会呈现。 我不能用小字母开始标签有什么原因吗?

  • 问题内容: 如果我有这样的课程: 有没有办法知道使用名为类型的参数? 问题答案: 总结一下: 如果编译期间包含调试信息,则可以获取参数名称。查看此答案以获取更多详细信息 否则得到的参数名称是不是有可能 使用可以获取参数类型 为了编写编辑器的自动完成功能(如你在评论之一中所述),有几个选项: 使用,,等。 使用,等。 结合使用以上内容-前者用于非基本类型,而后者用于基本类型。 根本不显示参数名称-仅

  • 我是ReactJS的新手,我在ES2015的基础上学习它。大多数例子是ES5。我的问题似乎是渲染子组件。 我的子组件是一个文本字段 我的父组件称为AddressBox,将包含许多子控件。如果displayMode为true,则它应该呈现一个范围,如果为false,则它应该呈现一个表单控件。 地址框代码为: 当我尝试渲染这些控件时,会出现以下错误: 警告:作出反应。createElement:类型不

  • 问题内容: 是否有可能做到这一点: 我的堆栈中有Dojo和jQuery框架,因此,如果这两个框架都使它变得更容易,它们将可用。 问题答案: 在ES5及更高版本中,无法访问该信息。 在旧版JS中,您可以使用来获得它。 但是,您可能必须解析名称,因为它可能包括一些额外的垃圾。不过,在某些实现中,您可以使用来简单地获取名称。 解析: