在运行时在 JSX 中选择 React 组件的类型
Choosing react component's type at runtime in JSX
我有一个 React 应用程序,我想在其中选择运行时的组件类型。我正在使用 ES6 和 JSX。
这是我的代码:
import Canvas from '../components/Canvas'
import CanvasTextbox from '../components/CanvasTextbox';
....
export default class CenterPane extends React.Component {
...
render() {
const canvasKids = [];
//for (var i = 0; i < 1; i++) {
// canvasKids.push(<CanvasTextbox key={i} id={'CanvasTextbox1'} />);
//};
for (var i = 0; i < 1; i++) {
let kid = this.state.kids[i];
let CanvasComp = kid.type; // evaluates to 'CanvasTextbox '
canvasKids.push(<CanvasComp key={i} id={kid.id} />);
console.log(canvasKids)
};
return (
<div>
Canvas:
<Canvas
name="myCanvas"
addChild={this.onAddChild.bind(this)}
>
{canvasKids}
</Canvas>
</div>
);
}
}
当我按名称引用组件时(如在评论的 for
循环中),它起作用了。但是,如果我尝试使用变量中的名称,它不会。
我尝试按照 docs 中的指导将名称分配给大写变量,但仍然没有。
我的 canvas 组件确实有子组件,但它不是 React 组件,如这个 React devtools 屏幕截图所示:
:
组件根本没有在 canvas 上呈现。
请帮忙。谢谢
无论你使用什么作为 JSX "tag" 都必须解析为 function(代表 HTML 标签的小写名称除外)。如果 kid.type
解析为字符串,则它不起作用。
您必须先构建一个 name => component
地图:
const components = {
CanvasTextbox,
};
// ...
let CanvasComp = components[kid.type];
您不能使用通用表达式作为 React 元素类型。如果您确实想使用通用表达式来指示元素的类型,只需先将其分配给大写变量即可。当您想基于道具渲染不同的组件时,经常会出现这种情况:
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
const components = {
photo: PhotoStory,
video: VideoStory
};
function Story(props) {
// Wrong! JSX type can't be an expression.
return <components[props.storyType] story={props.story} />;
}
为了解决这个问题,我们首先将类型分配给一个大写的变量:
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
const components = {
photo: PhotoStory,
video: VideoStory
};
function Story(props) {
// Correct! JSX type can be a capitalized variable.
const SpecificStory = components[props.storyType];
return <SpecificStory story={props.story} />;
}
详情请参考React Documentation。
我有一个 React 应用程序,我想在其中选择运行时的组件类型。我正在使用 ES6 和 JSX。
这是我的代码:
import Canvas from '../components/Canvas'
import CanvasTextbox from '../components/CanvasTextbox';
....
export default class CenterPane extends React.Component {
...
render() {
const canvasKids = [];
//for (var i = 0; i < 1; i++) {
// canvasKids.push(<CanvasTextbox key={i} id={'CanvasTextbox1'} />);
//};
for (var i = 0; i < 1; i++) {
let kid = this.state.kids[i];
let CanvasComp = kid.type; // evaluates to 'CanvasTextbox '
canvasKids.push(<CanvasComp key={i} id={kid.id} />);
console.log(canvasKids)
};
return (
<div>
Canvas:
<Canvas
name="myCanvas"
addChild={this.onAddChild.bind(this)}
>
{canvasKids}
</Canvas>
</div>
);
}
}
当我按名称引用组件时(如在评论的 for
循环中),它起作用了。但是,如果我尝试使用变量中的名称,它不会。
我尝试按照 docs 中的指导将名称分配给大写变量,但仍然没有。
我的 canvas 组件确实有子组件,但它不是 React 组件,如这个 React devtools 屏幕截图所示:
组件根本没有在 canvas 上呈现。
请帮忙。谢谢
无论你使用什么作为 JSX "tag" 都必须解析为 function(代表 HTML 标签的小写名称除外)。如果 kid.type
解析为字符串,则它不起作用。
您必须先构建一个 name => component
地图:
const components = {
CanvasTextbox,
};
// ...
let CanvasComp = components[kid.type];
您不能使用通用表达式作为 React 元素类型。如果您确实想使用通用表达式来指示元素的类型,只需先将其分配给大写变量即可。当您想基于道具渲染不同的组件时,经常会出现这种情况:
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
const components = {
photo: PhotoStory,
video: VideoStory
};
function Story(props) {
// Wrong! JSX type can't be an expression.
return <components[props.storyType] story={props.story} />;
}
为了解决这个问题,我们首先将类型分配给一个大写的变量:
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
const components = {
photo: PhotoStory,
video: VideoStory
};
function Story(props) {
// Correct! JSX type can be a capitalized variable.
const SpecificStory = components[props.storyType];
return <SpecificStory story={props.story} />;
}
详情请参考React Documentation。