如何在 ReactJS 中有条件地加载组件

Posted

技术标签:

【中文标题】如何在 ReactJS 中有条件地加载组件【英文标题】:How to load components conditionally in ReactJS 【发布时间】:2014-02-12 05:42:13 【问题描述】:

这是来自 ReactJS 的新手。容易掌握的资源不可用促使我再次敲门。问题是这样的。我有一个 React 组件,即RegisterAccount,单击它会触发另一个组件(弹出窗口),允许用户填写注册帐户所需的详细信息。现在一旦成功注册了一个帐户,我想将注册的帐户添加为RegisterAccount下的另一个组件。我该如何设置这种通信方式?

//In RegisterAccount
<addAccount/> //pop-up
<accountAdded/> //if account added, then show this component

【问题讨论】:

要点是 &lt;div&gt;isAccountAdded ? &lt;accountAdded /&gt; : &lt;addAccount /&gt;&lt;/div&gt; — 这只是 javascript,因此您可以在组件的渲染方法中编码任意逻辑。 嗨@andreypopp,谢谢,但恐怕这不是我想要的。假设 RegisterAccount 有一个图标,单击该图标时必须弹出 AddAccount 组件,并且一旦以某种方式注册了帐户,RegisterAccount 必须知道发生了注册(可能来自 AddAccount),然后它应该包含 AccountAdded 组件。每次单击 RegisterAccount 上的图标时,都会重复此操作。我如何设置这种通信方式? 【参考方案1】:

如果我正确理解您的问题,您正在尝试更新在状态更改时要显示的组件(例如用户创建帐户),而该状态由子组件更改。这是一个显示子 -> 父通信的基本示例。

在这种情况下,RegisterAccount 组件是根组件。如果它是另一个组件的子组件,也需要知道此示例中使用的hasAccount 状态,那么最好将状态存储在链的更高位置(并作为道具向下传递)。

jsfiddle of this example

/** @jsx React.DOM */

var AddAccount = React.createClass(
  handleRegistration: function() 
    this.props.updateAccount(true);
  ,
  render: function() 
    return <a onClick=this.handleRegistration>Create my account</a>;
  
);

var AccountAdded = React.createClass(
  render: function() 
    return <span>Account exists now</span>;
  
);

var RegisterAccount = React.createClass(
  getInitialState: function() 
    return 
      hasAccount: false
    ;
  ,
  updateAccountStatus: function(status) 
    this.setState(
      hasAccount: status
    );
  ,
  render: function() 
    return (
      <div>
        this.state.hasAccount ? <AccountAdded /> : <AddAccount updateAccount=this.updateAccountStatus />
      </div>
    );
  
);

React.renderComponent(<RegisterAccount />, document.body);

【讨论】:

看起来 React.renderComponent( 已经过时了。对我有用:ReactDOM.render( 代替 @mpaepper 是的。 React.renderComponent 已弃用。您应该使用import ReactDOM from 'react-dom'; 并改用ReactDOM.render(&lt;RegisterAccount /&gt;, document.body);【参考方案2】:

在你的渲染函数中,你可以有一个带有标签的变量,有条件地显示......有点像这样:

render: function()
   var conditionalTag;
   if(conditionalTag)   <AccountAdded/>

   return (
      <AddAccount/>
       conditionalTag  
   )


conditionalTag 仅在变量中包含 jsx 时才会呈现

【讨论】:

【参考方案3】:

我是 React 新手。我也在寻找方法。我看到了这个article! 它像下面这样说

render : function()

    return (
        <div>
         true && <AddAccount /> 
         false && <AccountAdded /> 
        </div>
    );

【讨论】:

简单而有效。无需添加内联样式来有条件地隐藏组件。谢谢;) 这是一个不错的解决方案,虽然不是很明显 render 函数不会使用 null 呈现变量,因此您可以编写 let yourComponent = null; 和稍后(在某种情况下)yourComponent = &lt;YourComponent /&gt;; 然后在您的 render 中编写 yourComponent .【参考方案4】:

您还可以执行以下操作,根据返回 true 或 false 的属性 condition,您可以渲染或不渲染。这只是一个例子,条件也可能来自方法等:

export class MyClass extends React.Component
    ...
    render()
            <div>
                <img src='someSource' />
                this.state.condition ? <MyElement /> : null
            </div>
    

您还可以找到更多详细信息here。

【讨论】:

以上是关于如何在 ReactJS 中有条件地加载组件的主要内容,如果未能解决你的问题,请参考以下文章

ReactJs:如何在启动时选择性地加载反应功能组件?

如何在 React JS 中有条件地应用 CSS 类

如何根据用户的操作系统有条件地渲染 ReactJS 内容

如何根据用户的操作系统有条件地呈现ReactJS内容

如何在 sequelize.js 中有条件地加载关联?

如何在 Reactjs 中将数据从子组件传递到父组件? [复制]