是否可以通过数组循环动态生成反应组件?
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>
);
}
为什么不做这样的事情呢?
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
解析为函数,而不是字符串。
不确定标题是否完全清楚(不确定如何措辞)所以让我解释一下。
我想尝试将组件名称列表存储在一个数组中,然后使用 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>
);
}
为什么不做这样的事情呢?
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
解析为函数,而不是字符串。