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

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

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

我想尝试将组件名称列表存储在一个数组中,然后使用 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 的新手,对于任何明显的错误深表歉意。

谢谢!

然后您可以使用辅助函数:

 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

为什么不做这样的事情呢?

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

或者,将 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 解析为函数,而不是字符串。