如何在Reactjs中正确显示和隐藏元素

时间:2015-08-18 00:57:56

标签: javascript reactjs

我在这里有所有这个组件,对于聊天应用程序,有2个视图,1个用于经销商,另一个用于玩家

  render () {
    let messages = this.props.chatMessages.map((message) => {
      return <ChatItem info={message.info} me={message.me} player={message.player} message={message.message} />;
    });

    let chatForm, hr, dealerMode, playerMode;

    if (this.props.mode === 'player') {
      hr = <hr />;
      chatForm = <ChatForm onAddMessage={this.addMessage} />;
      playerMode = <ul className="Chat__player--messages" ref="messages">{messages}</ul>;
    }

    if (this.props.mode === 'dealer') {
      dealerMode = <ul className="Chat__dealer--messages" ref="messages">{messages}</ul>;
    }

    return <div className="Chat">
      <div className="Chat__player">
        {playerMode}
        {hr}
        {chatForm}
      </div>
      <div className="Chat__dealer">
        {dealerMode}
      </div>
    </div>;
  }
到目前为止,我已经有了,但是工作得不好。当您在经销商视图中时,您可以看到这个<div className="Chat__player">的一小部分线,即使没有出现。

我试着做了

    return <div className="Chat">
      if (this.props.mode === 'player') {
        <div className="Chat__player">
           {playerMode}
           {hr}
           {chatForm}
        </div>
      }
      <div className="Chat__dealer">
        {dealerMode}
      </div>
    </div>;

但我得到的是在浏览器中打印的if语句。

2 个答案:

答案 0 :(得分:2)

由于<div className="Chat__player">将始终显示您想要在经销商情况下根本不打印它(您在第二个示例中有正确的想法,但它不是有效的JSX)。以下是两种可能的方法(多种方式)

修改第二个示例以使用三元:

return <div className="Chat">
  {this.props.mode === 'player' ? 
    <div className="Chat__player">
      {playerMode}
      {hr}
      {chatForm}
    </div> : null}

  {this.props.mode === 'dealer' ? 
    <div className="Chat__player">
      {dealerMode}
    </div> : null}
</div>;

或没有三元:

let display;
let messagesList = <ul className="Chat__dealer--messages" ref="messages">{messages}</ul>;

if (this.props.mode === 'player') {
  display = <div className="Chat__player">
    {messagesList}
    <hr />
    <ChatForm onAddMessage={this.addMessage} />
  </div>
}

if (this.props.mode === 'dealer') {
  display = <div className="Chat__dealer">
    {messagesList}
  </div>
}

return <div className="Chat">
  {display}
</div>;

答案 1 :(得分:2)

有一个很好的例子,隐藏在False in JSX文档中的条件元素:

<div>{x > 1 && 'You have more than one item'}</div>

改编自您的示例:

return <div className="Chat">
    {this.props.mode === 'player' &&
        <div className="Chat__player">
            {playerMode}
            {hr}
            {chatForm}
        </div>}
    <div className="Chat__dealer">
        {dealerMode}
    </div>
</div>;