【问题标题】:Check if property exists using React.js使用 React.js 检查属性是否存在
【发布时间】:2016-02-19 02:09:07
【问题描述】:

我是使用 react.js 的新手,并且正在尝试编写一个可重用的组件,该组件具有传递给它的可选属性。在组件中,该可选属性使用流星从数据库中提取数据,然后我想检查返回的对象上是否存在属性(parent_task 存在于任务中),如果存在,则添加一个链接。这似乎相当简单,但我不断收到错误。有人对我可能遗漏的内容有任何建议吗?有没有我遗漏的 jsx 陷阱?

<Header task={params.task_id} />  // rendering component with property

// Task List Header
Header = React.createClass({
  mixins: [ReactMeteorData],

  getMeteorData() {
    var handle = Meteor.subscribe('tasks');

    return {
      taskLoading: ! handle.ready(),
      task: Tasks.findOne({_id: this.props.task})
    }
  },

  getParentTaskLink() {
    if (!this.data.taskLoading) {
      var current_task = this.data.task;

      if (parent_task in current_task) {  // or current_task.hasOwnProperty(parent_task)
        console.log("parent_task exists!");
      }
    }
  },

  render() {
    return (
      <div className="bar bar-header bar-calm">
        {this.getParentTaskLink()} // eventually return anchor element here
        <h1 className="title">Hello World</h1>
      </div>
    )
  }
});

【问题讨论】:

  • 您的问题在哪里?在 getParentTaskLink 中?
  • 不是真的,为什么data.taskdata.taskLoading 错误检查中为空?如果是,你为什么不直接做if (!this.data.taskLoading &amp;&amp; this.data.task) { 然后你知道你可以在里面使用它?
  • Props 是一个 JS 对象,所以你可以使用 JS 函数来检查对象是否包含...检查dmitripavlutin.com/check-if-object-has-property-javascript

标签: javascript reactjs meteor-react


【解决方案1】:
if(props.hasOwnProperty('propertyName')){
  //do something
} else {
  //do something else
}

【讨论】:

    【解决方案2】:

    在功能组件中,可以这样使用。

    if(props.myProperty){
      //do something
    }else{
      //do something
    }
    

    【讨论】:

    • props.myProperty等于false时,这将无法正常工作,但该属性确实存在!
    【解决方案3】:

    投票最多的答案

    props.propInQuestion ? 'a' : 'b'
    

    如果 prop 是布尔值并且您正在尝试检查 是否存在,则不起作用。

    基于How do I check if an object has a key in JavaScript?,最快的方法是props.hasOwnProperty('propInQuestion'),但需要注意的是这不会搜索原型链。

    【讨论】:

      【解决方案4】:

      对我有用:

      if ('myProperty' in this.props) {}
      

      if (this.props.myProperty !== undefined) {}
      

      if (this.props.hasOwnProperty('myProperty')) {}
      

      下一个条件不适用于数字属性,因为 0 值不起作用(例如空字符串):

      if (this.props.MaxValue) {}
      

      【讨论】:

        【解决方案5】:

        这对我有用

        if(this.props.test === undefined){
            console.log('props.test is not defined')
        }
        

        【讨论】:

          【解决方案6】:

          使用 React.js 检查属性是否存在

          您可以使用两个选项。 && 运算符和 If 语句来检查道具是否存在。 选项 1 将检查属性是否存在,然后运行代码的第二部分。它就像没有 if 的 if 一样工作。

          选项 1

          this.props.property && this.props.property
          

          选项 2

          if(this.props.property){
          this.props.property
          }
          

          这也适用于函数名。

          你也可以使用这个检查来渲染组件和标签。

          【讨论】:

          • 请详细说明您的答案以帮助其他人解决此问题。
          • 如果您期望的值是布尔值,那么如果它带有“false”值,它将无法按预期工作。
          【解决方案7】:

          我建议尝试这个优雅的解决方案来检查组件的回调属性:

          if(typeof this.props.onClickCallback === 'function') { 
          // Do stuff; 
          }
          

          或应用解构:

          const { onClickCallback } = this.props;
          if(typeof onClickCallback === 'function') { 
          // Do stuff; 
          }
          

          【讨论】:

            【解决方案8】:

            您需要从 getParentTaskLink() 中返回您需要的链接。

             if (current_task.parent_task) {
                  return (<a href="#">link</a>);
                } else { return null; }
            

            【讨论】:

            • 对不起,我只是将console.log留在那里进行调试。错误是说 parent_task 没有定义。
            • 您是否尝试过检查 if(current_task[parent_task]),这应该会为您提供 current_task 中 parent_task 属性的值。
            • 这似乎给了我同样的错误。我知道在某些情况下它不会被定义,这就是我想检查的原因。我以前在其他应用程序中使用 JavaScript 时从未遇到过这个问题,这让我觉得这是 JSX 的事情。
            • 它是说 parent_task 没有定义(因为它没有),但这就是我想检查的原因。
            • 抱歉,您是对的。我应该输入的是 if(current_task.parent_task)。使用 [parent_task] 确实使它认为 parent_task 是一个变量而不是一个属性。我已经编辑了我的原始答案以反映这一点。
            【解决方案9】:

            我想通了。显然这是一个语法问题——在对象中搜索属性时需要使用字符串。以下行有效:

            if ('parent_task' in current_task)
            

            【讨论】:

              【解决方案10】:

              有问题的道具是什么?怎么样

              {this.props.propInQuestion ? <a href="#">link</a> : null}
              

              【讨论】:

              • 我想查看返回的数据对象(任务)上是否存在属性 parent_task。我编辑了问题以使其更清楚。我尝试了你的建议,但它一直给我一个错误。
              • @meta-meta 写{this.props.propInQuestion &amp;&amp; &lt;a href="#"&gt;link&lt;/a&gt;}不是更容易吗?
              • 要么。一些开发人员对 && 守卫感到困惑。我可以去任何一种方式。
              • 我应该指出,在使用 {this.props.propInQuestion &amp;&amp; &lt;a href="#"&gt;link&lt;/a&gt;} 时,请确保 this.props.propInQuestion 是一个布尔值或将其强制为一个。如果this.props.propInQuestion 为 0,这将呈现 0。
              • 如果 this.props.propInQuestion 是一个存在参数并且是一个布尔值,那么当它带有“false”值时,您将被错误引导。我使用了 this.props.propInQuestion != null 并获得了预期的结果。 @meta-meta 我不确定你是不是也想这么说
              猜你喜欢
              • 1970-01-01
              • 2018-02-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-09
              • 2011-02-01
              • 2021-04-22
              相关资源
              最近更新 更多