根据名称渲染 React 组件

IT技术 javascript reactjs react-jsx
2021-04-28 18:31:10

上下文:我正在开发一个基于小部件的 web 应用程序,(如已不复存在的 iGoogle,用户可以在其中选择他们想要显示的小部件)。每个小部件都是一个 React 组件。

简化示例:这里有 2 个不同的小部件

var HelloWidget = React.createClass({
    render: function() { return <div>Hello {this.props.name}</div>; }
});

var HiWidget = React.createClass({
    render: function() {  return <div>Hi {this.props.name}</div>; }
});

作为用户,我选择了 HiWidget 并且我的名字是“dude”,所以当系统从持久层获取我的偏好时,它看起来像这样:

var dataFromDb = {
    type: 'HiWidget',
    name: 'dude'
};

当我的名称在字符串 var 中时,如何呈现 React 组件?

我尝试了这个,基于动态渲染一个 React 组件

React.render(
  <dataFromDb.type name={dataFromDb.name} />,
  document.getElementById('try2')
);

它曾经与 React 0.11 一起使用,但现在不再使用了。

我想避免有一个巨大的 switch 语句:

switch (dataFromDb.type) {
    case 'HiWidget':
        var component = <HiWidget name={dataFromDb.name} />;
        break;
    case 'HelloWidget':
        var component = <HelloWidget name={dataFromDb.name} />;
        break;
}
React.render(
  component,
  document.getElementById('try3')
);

JSFiddle 与所有这些代码在这里:http : //jsfiddle.net/61xdfjk5/

2个回答

您可以使用一个对象作为组件类型的查找,并将渲染它的细节保留在一个地方:

var components = {
  'HiWidget': HiWidget,
  'HelloWidget': HelloWidget
}

var Component = components[dataFromObj.type]
React.render(
  <Component name={dataFromObj.name}/>,
  document.getElementById('try3')
)

JSX 是 JavaScript 的超集,因此您始终可以在 JSX 中使用原生 JavaScript 语法。例如,如果您的组件的类在全局空间 ( window)中可用,您可以执行以下操作:

React.render(
  React.createElement(window[dataFromDb.type], {name: dataFromDb.name}),
  document.getElementById('try2')
);

JSFiddle在这里