【问题标题】:How to wrap a container inside a map function with conditional in JSX - TypeScript如何在 JSX 中使用条件将容器包装在地图函数中 - TypeScript
【发布时间】:2020-09-28 17:05:34
【问题描述】:

所以我有一个由.map() 函数迭代的对象数组,在其中我想有一个条件,如果对象索引是> 1 我想用一个类将它包装在div 中.

这是我到目前为止所得到的,但它并没有将所有视频都包含在一个 .main-videos div 中:

谢谢

object.map((object, index) => {
return (
    <>

        {index === 0 && (
            <div className="main-image" >
            {<img>}
            </div>
        )}

        {index > 1 && (
            <div className="main-videos">
            {<video>}
            </div>
        )}
</>
);
})}


What I basically want to do is this:


object.map((object, index) => {
return (
    <>

        {index === 0 && (
            <div className="main-image" >
            {<img>}
            </div>
        )}

        {index === 1 && (<div className="main-videos">)}
            {index > 1 && (<video>)}
        {index === object.length && (</div>)}
        
</>
);
})}

【问题讨论】:

    标签: javascript reactjs typescript dictionary jsx


    【解决方案1】:

    我会尝试一些不同的方法,如下所示:

    <div className={index === 0 ? 'main-image' : 'main-videos'}>
       { index === 0 ? <img /> : <video /> }
    </div>
    

    当然缺少必要的属性,但您可以看到逻辑。我喜欢使用Ternary Operator 的条件渲染。从文档中阅读:

    条件(三元)运算符是唯一采用三个操作数的 JavaScript 运算符:条件后跟问号 (?),然后是条件为真时执行的表达式,后跟冒号 (:),最后是如果条件不成立,则要执行的表达式。此运算符经常用作 if 语句的快捷方式。

    通过这种方式,您也不需要 React.Fragement &lt;&gt;&lt;/&gt;,因为您只有一个元素。

    【讨论】:

    • 太好了,@norbitrial 但如果我把它放在地图函数中,它将把每个视频都包装在主视频上,但是感谢你的回答,我可能找到了方法,可能会在 map 之外渲染图像函数,如果索引大于 0 则只渲染?
    【解决方案2】:

    您可以在循环外渲染&lt;img /&gt;,然后将循环切片以在视频容器内渲染&lt;video /&gt;

    const Example = () => {
      if(!object.length) return null; // don't render anything when there aren't any items
    
      return (
        <>
          <div className="main-image" >
            <img />
          </div>
          
          <div className="main-videos">
            {object.slice(1).map(() => (
              <video />
            ))}
          </div>
        </>
      )
    };
    

    如果object数组来自props或state,你可以使用array rest解构来获取视频数组:

    const Example = ({ object: [img, ...videos] }) => {
      if(!img) return null; // don't render anything when there aren't any items
    
      return (
        <>
          <div className="main-image" >
            <img />
          </div>
          
          <div className="main-videos">
            {videos.map(() => (
              <video />
            ))}
          </div>
        </>
      )
    };
    

    【讨论】:

    • 是的,我想到了,在@norbitrial 的评论之后, slice 似乎比条件更好。太棒了
    猜你喜欢
    • 2018-12-19
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2011-11-06
    • 2017-03-26
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多