使用短路(&&)条件组件反应显示0而不是任何内容

Gur*_*bot 25 components short-circuiting reactjs

我有以下简单的短路语句,应该显示组件或什么都没有:

{profileTypesLoading && <GeneralLoader />}

如果该语句为false,则呈现0而不是任何内容.

我已经做了一个console.log(profileTypesLoading)公正的事情来快速查看该profileTypesLoading属性的状态,并且它是预期的1或0.0应为false ...导致无法渲染.对?

知道为什么会这样吗?

ena*_*upe 46

因为你的条件是falsy,因此不会返回第二个参数(<GeneralLoader />),它会返回profileTypesLoading,这是一个数字,所以反应会使其因为阵营跳过渲染什么,是typeof booleanundefined,并会呈现什么是typeof stringnumber:

为了使其安全,您可以使用三元表达式{condition ? <Component /> : null}或布尔表达您的条件{!!condition && <Component />}

  • 如果`!! condition`使您感到困惑,也可以使用Boolean运算符。类似{{Boolean(condition)&amp;&amp; &lt;Component /&gt;}}之类的东西 (3认同)
  • 一旦我在 3 分钟内获得允许,我就会接受这个...但是谢谢你,这是有道理的。令我惊讶的是,我读过的有关此方法的任何解释中都没有这一点。它总是像我写的那样写。没有铸造。学过的知识! (2认同)

Gio*_*ssi 18

0是一个假值,所以当它被&&评估时,它返回 0。然而,0可以被 React 渲染,因为它是一个数字:

// Renderable values
1 && <GeneralLoader /> // => Renders <GeneralLoader />
"a string" && <GeneralLoader /> // => Renders <GeneralLoader />
0 && <GeneralLoader /> // => Renders '0'

// Non-renderable values
false && <GeneralLoader /> // => Renders nothing
null && <GeneralLoader /> // => Renders nothing
undefined && <GeneralLoader /> // => Renders nothing
Run Code Online (Sandbox Code Playgroud)

TLDR

这是因为它本身的javascript如何处理[ truthyfalsy值] [1]:

在 JavaScript 中,真值是在布尔上下文中遇到时被认为是真的值。所有值都是真值,除非它们被定义为假(即,假、0、""、空、未定义和 NaN 除外)。

&&运算符一起使用时,返回值取决于左值:

  • 如果左边的值为真,则返回右边的值。
  • 如果左值为假,则返回其值。

例子:

// Truthy values
1 && "hello" // => "hello"
"a string" && "hello" // => "hello"

// Falsy values
0 && "hello" // => 0
false && "hello" // => false
null && "hello" // => null
undefined && "hello" // => undefined
Run Code Online (Sandbox Code Playgroud)

相同的规则适用于 JSX,因为它是 [JavaScript 的语法扩展][2]。然而,问题是**

问题是0是一个假值,所以当它被&&评估时,它返回 0。但是,0可以被 React 渲染,因为它是一个数字

// Renderable values
1 && <GeneralLoader /> // => Renders <GeneralLoader />
"a string" && <GeneralLoader /> // => Renders <GeneralLoader />
0 && <GeneralLoader /> // => Renders 0

// Non-renderable values
false && <GeneralLoader /> // => Renders nothing
null && <GeneralLoader /> // => Renders nothing
undefined && <GeneralLoader /> // => Renders nothing
Run Code Online (Sandbox Code Playgroud)


mic*_* d. 15

您可以使用双 Bang (!!)。这将返回值的布尔 true/false 关联,并且不会呈现 0。

{!!profileTypesLoading && <GeneralLoader/>}
Run Code Online (Sandbox Code Playgroud)


Jos*_* M. 11

更直接的方法:

{Boolean(profileTypesLoading) && <GeneralLoader />}
Run Code Online (Sandbox Code Playgroud)


Sak*_*oor 6

这将解决问题:

{!!profileTypesLoading && <GeneralLoader />}
Run Code Online (Sandbox Code Playgroud)

因为它会将 0 转换为 false。原因是当它的0下一个条件没有被执行时,它的行为就像 JavaScript 中的一个数字,所以双重否定在这里有帮助。