reactjs React显示0而不是无短路(&&)条件元件

zrfyljdw  于 2023-01-25  发布在  React
关注(0)|答案(7)|浏览(369)

我有以下简单的短路语句,它应该显示一个组件或什么都不显示:
{profileTypesLoading && <GeneralLoader />}
如果语句为false,则呈现0而不是空。
我做了一个console.log(profileTypesLoading),只是为了快速查看profileTypesLoading属性的状态,它应该是1或0。0应该是false......导致什么都不呈现。对吗?
知道为什么会这样吗?

svujldwt

svujldwt1#

由于条件为false,因此不会返回第二个参数(<GeneralLoader />),它将返回profileTypesLoading,这是一个数字,因此react将渲染它,因为React跳过对typeofbooleanundefined的渲染,并将渲染typeofstringnumber
为了安全起见,您可以使用三元表达式{condition ? <Component /> : null}或布尔型转换条件,如{!!condition && <Component />}

iqxoj9l9

iqxoj9l92#

  • 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
    • 顶级域名注册商**

这是因为javascript本身处理[* truthy * and * falsy * values][1]的方式:
在JavaScript中,真值是在布尔上下文中遇到时被视为真的值。所有值都是真的,除非它们被定义为假(即,除了假、0、""、null、未定义和NaN)。
&& 运算符一起使用时,返回值取决于左侧值:

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

示例:

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

// Falsy values
0 && "hello" // => 0
false && "hello" // => false
null && "hello" // => null
undefined && "hello" // => undefined

同样的规则也适用于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
ttcibm8c

ttcibm8c3#

这将解决以下问题:

{!!profileTypesLoading && <GeneralLoader />}

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

dgenwo3n

dgenwo3n4#

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

{!!profileTypesLoading && <GeneralLoader/>}
kcugc4gi

kcugc4gi5#

更直接的方法是:

{Boolean(profileTypesLoading) && <GeneralLoader />}
g52tjvyc

g52tjvyc6#

首先要计算一个false条件,使用const和terary是一个简单的方法。例如:
在这种情况下,如果someCollectionProperty为空,则显示一个简单按钮,否则,将显示一个带有some-options-menu的按钮(材质UI示例)

export default function MyComponent({ obj }) {

  const jsxResponse = !obj.someCollecctionProperty.length ? <Button>No Action</Button> 
    : 
    <>
      <Button 
        aria-label="more"
        aria-controls="long-menu"
        aria-haspopup="true" 
        variant="contained" 
        onClick={handleClick} 
        color={'primary'}>
          <ThumbUpAltOutlinedIcon/>OK
      </Button>
      <Menu
        id="long-menu"
        anchorEl={anchorEl}
        keepMounted
        open={open}
        onClose={handleClose}
      >
        {obj.someCollecctionProperty.map((option) => (
          <MenuItem key={option.id} onClick={handleClose}>
            <Avatar variant="square" alt={option.name} src={option.url}/>{option.configName}
          </MenuItem>
        ))}
      </Menu>
    </>;

  return (<div>{jsxResponse}</div>);
}

jsxResponse是呈现的组件,使用此组件可以避免视图上的0

pbgvytdp

pbgvytdp7#

此代码

{ Boolean(profileTypesLoading) ? <GeneralLoader /> : <></> }

也解决了这个问题。因为我是一个初学者,我不知道这是否有缺点或副作用。

相关问题