根据名称呈现React组件

al8*_*anp 10 javascript reactjs react-jsx

上下文:我正在开发基于小部件的webapp(就像已经不存在的iGoogle,用户可以选择要显示的小部件).每个小部件都是React组件.

简化示例:这是两个不同的小部件

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>; }
});
Run Code Online (Sandbox Code Playgroud)

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

var dataFromDb = {
    type: 'HiWidget',
    name: 'dude'
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

它曾经与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')
);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nan 16

您可以使用对象作为组件类型的查找,并将详细信息保存在一个位置:

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

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