简体   繁体   English

是否可以遍历数组以动态生成反应组件?

[英]Is it possible to loop through an array to dynamically generate react components?

Not sure the title is totally clear (wasn't sure how to phrase it) so let me explain. 不确定标题是否完全清楚(不确定如何措辞),所以让我解释一下。

I'd like to try and store a list of component names in an array, then loop through using map (or suitable equivalent) in order to display each array value as a JSX component. 我想尝试在数组中存储一个组件名称列表,然后使用map (或合适的等效项)循环遍历,以便将每个数组值显示为JSX组件。

So something along the lines of this (appreciate this code doesn't work, just trying to show what I'm hoping to achieve): 因此,与此类似的东西(赞赏此代码不起作用,只是试图显示我希望实现的目标):

render(){
  let links = ['DashboardLink', 'CoursesLink', 'AssignmentsLink'];
  return (
    <div>{
      links.map((Link) => {
        return <Link key={Link} />
      }
    }</div>
  )
}

Ideally the result would be: 理想的结果是:

<div>
  <DashboardLink key='DashboardLink' />
  <CoursesLink key='CoursesLink' />
  <AssignmentLink key='AssignmentLink' />
</div>

and each component would then render within the div. 然后每个组件都将在div中渲染。

I'm very new to React and ES6 so apologies for any glaring mistakes. 我对React和ES6还是很陌生,因此对任何明显的错误表示歉意。

Thanks! 谢谢!

You can use a helper function then: 您可以使用一个辅助函数,然后:

 render(){
   var links = ['DashboardLink', 'CoursesLink', 'AssignmentsLink'];
   var findComponent: function (name){
     switch (name){
         case 'DashboardLink':
             return (<DashboardLink />);
         case 'CoursesLink':
             return (<CoursesLink />);
         case 'AssignmentsLink':
             return (<AssignmentsLink />);
         default:
             return null; //You might want to return something else here//
     }
   }; 
   return (
     <div>
       links.map((Link) => {
         return findComponent(Link);
       }
     </div>
  );
}

You can place this function at other places too... 您也可以在其他地方放置此功能...

Use React.createElement method to create custom components: First argument is name of tag, second is a object with properties, and you can add children as third argument. 使用React.createElement方法创建自定义组件:第一个参数是标记的名称,第二个参数是具有属性的对象,您可以添加子代作为第三个参数。

render(){
   var links = ['DashboardLink', 'CoursesLink', 'AssignmentsLink'];
   return (
     <div>
       links.map((Link) => {
         return React.createElement(Link, {key: Link});
       }
     </div>
  );
}

Refer: https://facebook.github.io/react/docs/glossary.html 参考: https : //facebook.github.io/react/docs/glossary.html

Why not do something like this? 为什么不这样做呢?

import CoursesLink from 'components/CoursesLink';
import DashboardLink from 'components/DashboardLink';
import AssignmentsLink from 'components/AssignmentLink';

getComponentByName(name) {
  switch(name):
    case 'DashboardLink':
      return DashboardLink
    case 'AssignmentsLink':
      return AssignmentsLink;
    case 'CoursesLink':
      return CoursesLink;
    default:
      return <div />
}
render() {
  const links = ['DashboardLink', 'AssignmentLink', 'CoursesLink'];
  return (
    <div>
      {links.map(link => React.createElement(getComponentByName(link), key={link}))}
    </div>
  )
}

Alternatively, make links an array of functions and use something else key (or the name of the function): 或者,使links成为函数数组并使用其他键(或函数名称):

render(){
  let links = [DashboardLink, CoursesLink, AssignmentsLink];
  return (
    <div>{
      links.map((Link, index) => {
        return <Link key={index} />
        // or
        // return React.createElement(Link, {key: index});
      }
    }</div>
  )
}

Your original code doesn't work because React expects Link to resolve to a function, not a string. 您的原始代码不起作用,因为React希望Link解析为一个函数,而不是字符串。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM