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

时间:2016-08-18 12:32:30

标签: javascript reactjs ecmascript-6 jsx

不确定标题是否完全清楚(不确定如何表达)所以让我解释一下。

我想尝试在数组中存储组件名称列表,然后使用map(或合适的等价物)循环,以便将每个数组值显示为JSX组件。

这就是这样的事情(欣赏这段代码不起作用,只是试图展示我希望实现的目标):

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

理想情况下,结果将是:

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

然后每个组件将在div中呈现。

我对React和ES6很陌生,因此对任何明显的错误表示歉意。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用辅助函数:

 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>
  );
}

您也可以将此功能放在其他地方......

使用React.createElement方法创建自定义组件: 第一个参数是标签名称,第二个参数是具有属性的对象,您可以将子项添加为第三个参数。

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

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

答案 1 :(得分:1)

为什么不做这样的事情?

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>
  )
}

答案 2 :(得分:1)

或者,使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>
  )
}

您的原始代码无效,因为React希望Link解析为函数,而不是字符串。