React useState:如何将三元运算符放在三元运算符中?

Posted

技术标签:

【中文标题】React useState:如何将三元运算符放在三元运算符中?【英文标题】:React useState: How to put ternary operator within a ternary operator? 【发布时间】:2022-01-04 00:28:40 【问题描述】:

我正在映射一组项目。有些项目必须显示视频,而其他项目必须显示图像。我为每个显示器制作了 2 个函数,并使用 useState 来切换它们。

export default function App() 
  //SIMPLE USESTATE TO TOGGLE WINDOW
  const [open, setOpen] = useState(false);

  //THE ARRAY (1 contains an image and the other a video)
  const itemsArray = [
    
      name: "Item1",
      imageUrl: "some image url"
    ,
    
      name: "Item2",
      videoUrl: "some video url"
    
  ];

  //RENDER THIS IF ITEM IS IMAGE
  const ifImage = (i) => 
    return (
      <div onClick=() => setOpen(!open)>
        <img src=i  />
      </div>
    );
  ;

  //RENDER THIS IF ITEM IS VIDEO
  const ifVideo = (v) => 
    return (
      <div className="window-on-top" onClick=() => setOpen(!open)>
        <iframe>Some Video</iframe>
      </div>
    );
  ;

  return (
    <div className="App">
      <h3>One button shows a cat photo and the other a cat video</h3>
      itemsArray.map((item) => 
        return (
          <div key=item.name>
            <button className="niceBtn" onClick=() => setOpen(!open)>
              item.name
            </button>

            /* NESTING CONDITIONALS OR SOMETHING TO MAKE THIS WORK */
            open ? 
          item.imageUrl ? ifImage(item.imageUrl): null
          ||
          item.videoUrl ? ifVideo(item.videoUrl): null
         : null
          </div>
        );
      )
    </div>
  );

我显然错了...需要一些帮助来了解如何解决这个问题... 这是一个沙盒,其中包含正确观看它的代码。 SANDBOX

【问题讨论】:

【参考方案1】:

我会将条件放在子函数中,这样可以很容易理解发生了什么。

const tryImage = item => (
    !item.imageUrl ? null : (
        <div onClick=() => setOpen(!open)>
            <img src=item.imageUrl  />
        </div>
    ));
const tryVideo = item => (
    !item.videoUrl ? null : (
        <div onClick=() => setOpen(!open)>
            <img src=item.videoUrl  />
        </div>
    ));

return (
    <div className="App">
        <h3>One button shows a cat photo and the other a cat video</h3>
        itemsArray.map((item) => 
            return (
                <div key=item.name>
                    <button className="niceBtn" onClick=() => setOpen(!open)>
                        item.name
                    </button>
                    open && ([
                        tryImage(item),
                        tryVideo(item),
                    ])
                </div>
            );
        )
    </div>
);

不确定,但您可能还希望数组中的每个项目都有一个单独的 open 状态,而不是整个应用程序的单个状态。

【讨论】:

是的,完全正确... 似乎有效,但两个元素(图像和视频)现在同时显示。除了为每个项目创建单独的状态之外,还有其他方法可以打开单个项目吗? 如果您希望每个项目都可以单独打开和关闭,不。如果您一次只希望打开一个,请使用当前打开的状态的 index

以上是关于React useState:如何将三元运算符放在三元运算符中?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将三元运算符放在开关内? Javascript

将递增/递减运算符放在三元/条件运算符中是不是安全?

React - 三元运算符和声纳

如何立即更新 react useState?

react中的useState与setState的异步问题

如何在返回数组的return语句中使用三元运算符