【问题标题】:How to display multiple tags in reactjs?reactjs如何显示多个标签?
【发布时间】:2018-05-03 11:07:32
【问题描述】:

我制作了一个添加新用户卡,上面有一个加号。我制作了额外的卡片,在每张卡片上显示用户名。显示用户名的卡片使用.map() 方法显示。现在,如果我在 .map() 函数中插入第 1 部分代码(见下文),那么它会显示多个添加新用户卡。我的最终目标是显示单个添加新用户卡并使用.map() 显示剩余卡。

第 1 部分代码:

<div className="item-card add" onClick = {this.addUser} >
  <img src={require("../../images/plus.svg")} className="plus-icon"/>
  <div className="lbl">Add a new User</div>
</div>

如果我在.map() 中插入上面的代码,它会显示多个添加新用户卡。

我应该在 displayUsers() 方法中的何处插入第 1 部分代码?

displayUsers() {
  return this.state.userList.map(user => {
    return (
      <div className="item-card">
        <div className="info">
          <div className="username">Username: {user.userName}</div>
        </div>
        <div className="del-wrap">
          <img src={require('../../images/cancel.svg')} />
        </div>
      </div>
    );
  });
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您将使用与地图渲染分开的添加用户卡。

    16.2.0 或更高版本中,您可以通过将多个元素包装在React.Fragment 中来返回多个元素

    displayUsers(){
    
        return (
           <React.Fragment>
            <div className="item-card add" onClick = {this.addUser} >
               <img src={require("../../images/plus.svg")} className="plus-icon"/>
               <div className="lbl">Add a new User</div>
           </div>
          {this.state.userList.map( user => {
          return(
                <div className="item-card">
                    <div className="info">    
                        <div className="username">Username: {user.userName}</div>
                    </div>
                    <div className="del-wrap">
                        <img src={require("../../images/cancel.svg")}/>
                    </div>
                </div>
            );
        })}
        </React.Fragment>
      )
    } 
    

    v16.0.0 to 16.2.0 之间,您可以将它们作为数组返回

    displayUsers(){
    
        return ([
            <div className="item-card add" onClick = {this.addUser} >
               <img src={require("../../images/plus.svg")} className="plus-icon"/>
               <div className="lbl">Add a new User</div>
           </div>,
          {this.state.userList.map( user => {
          return(
                <div className="item-card">
                    <div className="info">    
                        <div className="username">Username: {user.userName}</div>
                    </div>
                    <div className="del-wrap">
                        <img src={require("../../images/cancel.svg")}/>
                    </div>
                </div>
            );
        })}
        ]
      )
    } 
    

    在 v16 之前,您可以将它们包装在一个容器 div 中,因为您只能返回一个元素。

    displayUsers(){
    
        return (
           <div>
            <div className="item-card add" onClick = {this.addUser} >
               <img src={require("../../images/plus.svg")} className="plus-icon"/>
               <div className="lbl">Add a new User</div>
           </div>
          {this.state.userList.map( user => {
          return(
                <div className="item-card">
                    <div className="info">    
                        <div className="username">Username: {user.userName}</div>
                    </div>
                    <div className="del-wrap">
                        <img src={require("../../images/cancel.svg")}/>
                    </div>
                </div>
            );
        })}
        </div>
      )
    } 
    

    【讨论】:

    • 你能推荐一些不使用&lt;React.Fragment&gt;可以显示的地方吗
    • @stonerock 您可以将其包装在一个 div 中。主要思想是一个反应组件应该只渲染 1 个元素。在您的地图中,您将返回多个节点。
    • @ShubhamKhatri 太棒了。谢谢:)
    【解决方案2】:

    试试这个:

    displayUsers(){
     return (
      <React.Fragment>
        <div className="item-card add" onClick = {this.addUser} >
        <img src={require("../../images/plus.svg")} className="plus-icon"/>
          <div className="lbl">Add a new User</div>
        </div>
      {
        this.state.userList.map( user => {
          return(
                <div className="item-card">
                    <div className="info">    
                        <div className="username">Username: {user.userName}</div>
                    </div>
                    <div className="del-wrap">
                        <img src={require("../../images/cancel.svg")}/>
                    </div>
                </div>
            );
        })
     }
      </React.Fragment>
     )}
    

    【讨论】:

      【解决方案3】:

      我假设render 返回displayUsers 的结果。

      三个答案:

      • 在 React div)。
      • 在 React >= v16 中,您可以在执行操作时返回一个数组,但您需要为它们提供唯一的 keys。
      • 在 React >= v16.2 中,您可以改用 &lt;React.Fragment&gt; 而不是给他们keys。

      包装器:

      displayUsers(){
          return (
              <div>
              {this.state.userList.map( user => {
                  return(
                      <div className="item-card">
                          <div className="info">    
                              <div className="username">Username: {user.userName}</div>
                          </div>
                          <div className="del-wrap">
                              <img src={require("../../images/cancel.svg")}/>
                          </div>
                      </div>
                  );
              })}
              </div>
          );
      } 
      

      具有唯一keys 的数组:

      displayUsers(){
          return this.state.userList.map(user => {
              return(
                  <div key={user.???} className="item-card">
                      <div className="info">    
                          <div className="username">Username: {user.userName}</div>
                      </div>
                      <div className="del-wrap">
                          <img src={require("../../images/cancel.svg")}/>
                      </div>
                  </div>
              );
          });
      } 
      

      注意key={user.???},显然要选择user 对象的独特方面来使用。

      &lt;React.Fragment&gt;:

      displayUsers(){
          return (
              <React.Fragment>
              {this.state.userList.map(user => {
                  return(
                      <div key={user.???} className="item-card">
                          <div className="info">    
                              <div className="username">Username: {user.userName}</div>
                          </div>
                          <div className="del-wrap">
                              <img src={require("../../images/cancel.svg")}/>
                          </div>
                      </div>
                  );
              });
              </React.Fragment>
          );
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多