Реагируйте, показывая 0 вместо ничего с условным компонентом короткого замыкания (&&)

У меня есть следующий простой оператор короткого замыкания, который должен показывать либо компонент, либо ничего:

{profileTypesLoading && <GeneralLoader />}

Если утверждение ложно, оно отображает 0 вместо ничего.

Я сделал console.log(profileTypesLoading) просто чтобы быстро увидеть, каково состояние свойства profileTypesLoading и оно равно 1 или 0, как и ожидалось. 0 должно быть ложным... ничего не отображать. Правильно?

Есть идеи, почему это произойдет?

Ответы

Ответ 1

Поскольку ваше условие ложно и поэтому не возвращает второй аргумент (<GeneralLoader />), он вернет profileTypesLoading, который является числом, поэтому реагирует на его рендеринг, поскольку React пропускает рендеринг для всего, что typeof boolean или undefined и отображает все, что является typeof string или number:

Чтобы сделать это безопасным, вы можете использовать троичное выражение {condition ? <Component /> : null} или логическое приведение вашего состояния, например {!!condition && <Component />}

Ответ 2

0 - ложное значение, поэтому, когда оно оценивается && amp;, оно возвращает 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

TLDR

Это из-за того, как сам javascript обрабатывает истинные и ложные значения:

В 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

Те же правила применяются к JSX, потому что это расширение синтаксиса для JavaScript. Однако проблема в том, что **

Проблема в том, что 0 - ложное значение, поэтому, когда оно оценивается && amp;, оно возвращает 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

Ответ 3

Это решит проблему:

{!!profileTypesLoading && <GeneralLoader />}

Как он будет конвертировать 0 в ложь. Причина в том, что следующее условие 0 не выполняется и ведет себя как число в JavaScript, поэтому здесь помогает двойное отрицание.