【问题标题】:JSX Ternary Expression Behaves Differently For MapJSX 三元表达式对 Map 的行为不同
【发布时间】:2017-02-02 07:12:36
【问题描述】:

简单的问题:

JSX 允许您返回一个 map 函数,该函数将由一堆 div 或图像元素或任何 组成,而不必将 JSX 表达式包装在一个元素中。然而,如果你在没有 map 函数的情况下明确地输入一系列 DIV,它就会对你大喊大叫。请参见下面的示例:

    <div style={{display:'flex', justifyContent:'space-between'}}>
                {
                    (this.props.label.exampleImages.length > 0)

                    ? this.props.label.exampleImages.map((image, i)=>{
                        return <img src={image.url}
                             alt={image}
                             key={`image-${i}`}
                             style={{marginTop:10}}/>
                    })

                    : 
                        // this throws error even though above is essentially doing the same thing
                        <div className="image-placeholder"></div>
                        <div className="image-placeholder"></div>
                        <div className="image-placeholder"></div>


                }
            </div>

这是为什么?他们评估的不是完全相同的东西吗?

【问题讨论】:

  • 究竟是什么错误?
  • @Pointy JSX 表达式必须包含在单个元素中错误
  • 好的,这对我来说似乎很清楚。这就是 JSX 的本质。
  • 那么地图返回一个数组?我认为它会返回以下内容:
  • 无论如何我都不是 React 专家;它会让你用数组初始化语法和每个值的&lt;div/&gt;标签构建一个数组吗?

标签: javascript reactjs ternary-operator jsx


【解决方案1】:

不同之处在于,在三元表达式的第一部分中,您只返回一个值,即图像数组。但是,当您的 this.props.label.exampleImages.length &gt; 0 语句返回 false 时,您将返回多个值,这是没有意义的,正如此处 docs 所解释的那样。

您的数组周围已经有一个封闭的 div,即&lt;div style={{display:'flex', justifyContent:'space-between'}}&gt;。导致您出错的原因是您正在尝试按照以下方式进行操作:var a = arr.length &gt; 0 ? 1 : 1 2 3。这只是无效的 javascript,因为您不能在三元表达式上返回多个值。

【讨论】:

  • 但是map函数不是返回三个标签,它们没有包裹在一个元素中吗?
  • map 只返回一个值,一个包含所有图像的数组。
  • 在这种情况下令人沮丧的是我想返回三个 div 并且维护数组受益的相同直接父元素。我可以映射一个像var arr = [1,2,3]... arr.map(()=&gt;&lt;div&gt;&lt;/div) 这样的假数组,但这似乎不是一个非常优雅的解决方案......
  • 是的,我同意,您可以将您的 divs 包装在像 [&lt;div ..&gt;...&lt;/div&gt;,&lt;div ..&gt;...&lt;/div&gt;, ...] 这样的数组中,这样您就可以维护您的父元素。
  • 感谢您可以在三元条件中返回数组的提示。不知道这一点,并给了我想要的结果,标记为正确。
【解决方案2】:

首先,重要的是要记住 JSX 被编译为 JavaScript,而这最终是使用 JavaScript 语法规则运行的。

在您的三元运算符中,每个部分都需要计算为单个值。例子 var myVar = maxValidNumStuff < getCurrItemNum() ? 'too many' : 'good'

maxValidNumStuff &lt; getCurrItemNum() 计算为布尔值,其他部分计算为字符串。

Map 方法per Mozilla 显示.map 的返回值是一个数组。

如果您查看 JSX 如何在 map 之外编译每个 &lt;div&gt;blah&lt;/div&gt;,您会发现您正在放置多个表达式,这会扰乱三元运算符想要的单个表达式。

【讨论】:

  • 那么当它到达javascript数组形式时,那么JSX就知道如何正确编译它了吗?可以说数组本身满足包装条件?
  • 它将每个 img 评估为数组内的单个 React 元素。所以最后它是一个数组的单个值,具有多个 React Img 元素,然后它会正确编译它。如果你想像以前那样做多个 div,你可以这样做 (&lt;someTag&gt;&lt;div className="image-placeholder"&gt;&lt;/div&gt; &lt;div className="image-placeholder"&gt;&lt;/div&gt; &lt;div className="image-placeholder"&gt;&lt;/div&gt;&lt;/someTag&gt;) 这样它仍然是一个正在被评估的元素,而 div 是 someTag 的子元素
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 2015-03-14
  • 2017-12-24
  • 2020-02-13
  • 2021-07-10
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
相关资源
最近更新 更多