【问题标题】:Render a React component based on its name根据名称渲染 React 组件
【发布时间】:2015-05-25 13:19:08
【问题描述】:

背景:我正在开发一个基于小部件的 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'
};

如果 React 组件的名称包含在字符串 var 中,如何渲染它?

我试过这个,基于Dynamically Rendering a React component

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/

【问题讨论】:

    标签: javascript reactjs react-jsx


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      JSFiddle here.

      【讨论】:

      • 我不明白这里为什么需要window[...]!变量 dataFromDb 在范围内,因为 dataFromDb.name 工作正常,但如果我删除 window[...] 它就不再工作了。
      • @al8anp 你需要window[...] 因为这样你就可以引用类,dataFromDb.name 只是类名的字符串表示。 React.createElement(...) 期望类作为第一个参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 2016-08-07
      • 2018-04-21
      • 2015-03-06
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多