首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSX中的Falsy值

JSX中的Falsy值
EN

Stack Overflow用户
提问于 2017-12-30 10:01:57
回答 3查看 5.8K关注 0票数 6

我正在学习reactJ,并试图将属性传递给组件。

代码如下-

代码语言:javascript
复制
import React from 'react';
import ReactDOM from 'react-dom';

class myComponent extends React.Component {
    render() {
        if (this.props.signedIn == false) {
            return <h1>Hi</h1>;
        }
        return <h1>Hello!</h1>;
    }
}

ReactDOM.render(
    <myComponent signedIn={false} />,
    document.getElementById('app')
);

这是可行的,但请注意,我必须将false作为包在花括号中的javascript注入。

我怀疑JSX不承认'false‘字符串和在普通JS中一样虚假的值吗?

询问的原因--在角中与ng-show="false“进行比较,这隐藏了元素,但正如注释中所讨论的那样,这可能是因为ng-show指令手动计算'false‘为false值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-30 11:29:06

别忘了修复组件名,它应该以大写字母开头。

这些条件与JSX无关,正如其他评论和回答中提到的那样。这正是JavaScript的工作方式。

请注意,重要的是要记住:

永远不要对布尔值执行双等号(==) a.k.a “抽象平等”,这是在询问bug。

因为引擎将只对布尔值进行类型强制,这可能导致意外行为。

例如,

代码语言:javascript
复制
if(2 == true) //returns false

代码语言:javascript
复制
if(2 == false) // returns false

来自等级库

如果Type(x)是布尔型,则返回比较结果!ToNumber(x) == y. 如果类型(Y)是布尔型,则返回比较x ==的结果!ToNumber(y).

相反,您可以执行一个隐式检查:

代码语言:javascript
复制
if (this.props.signedIn)  

或显式检查,但使用三元等于a.k.a “严格平等”

代码语言:javascript
复制
if (this.props.signedIn === false)

对于react 部分:,它基本上只是JavaScript函数和对象。

当您没有传递一个prop时,它将是undefined

代码语言:javascript
复制
this.props.signedIn // signedIn will be undefined if we didn't pass it as a prop

因此,下面是上面提到的隐式检查:

代码语言:javascript
复制
if (this.props.signedIn) 

就能正常工作了。

在不传递道具的情况下运行示例:

代码语言:javascript
复制
class MyComponent extends React.Component {
  render() {
    if (this.props.signedIn) {
      return <h1>Hi</h1>;
    }
    return <h1>not signed on!</h1>;
  }
}

ReactDOM.render(
  <MyComponent />,
  document.getElementById('root')
);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

使用传入的false运行示例:

代码语言:javascript
复制
class MyComponent extends React.Component {
  render() {
    if (this.props.signedIn) {
      return <h1>Hi</h1>;
    }
    return <h1>not signed on!</h1>;
  }
}

ReactDOM.render(
  <MyComponent signedIn={false}/>,
  document.getElementById('root')
);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

使用传入的true运行示例:

代码语言:javascript
复制
class MyComponent extends React.Component {
  render() {
    if (this.props.signedIn) {
      return <h1>Hi</h1>;
    }
    return <h1>not signed on!</h1>;
  }
}

ReactDOM.render(
  <MyComponent signedIn={true}/>,
  document.getElementById('root')
);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

票数 7
EN

Stack Overflow用户

发布于 2017-12-30 10:11:56

没有Javascript不将falsy stringfalse进行比较,如果您希望这样做,只需检查if条件,而不提供虚幻的布尔值作为支柱。

代码语言:javascript
复制
class MyComponent extends React.Component {
  render() {
    if (this.props.signedIn) {
      return <h1>Hi</h1>;
    }
    return <h1>Hello!</h1>;
  }
}

render(
  <MyComponent />,
  document.getElementById('root')
);

一个真实的案例

代码语言:javascript
复制
render(
  <MyComponent signedIn/>,
  document.getElementById('root')
);
票数 1
EN

Stack Overflow用户

发布于 2017-12-30 10:31:19

所有false0、空字符串''""NaNundefinednull都被计算为false;其他的都是true。

除了模板系统之外,JSX本身不提供任何东西。所以它的基础是javascript而不是JSX。

因此,在您的示例中,您只需删除== false,javascript将为您评估所有这些模式。

顺便说一句,您可以在此链接中查看ng-隐藏源代码,以了解更多信息。

https://github.com/angular/angular.js/blob/master/src/ng/directive/ngShowHide.js

并了解有关运算符这里的更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48032855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档