无法阅读财产&to; JS'未定义的

时间:2016-06-30 15:52:54

标签: reactjs react-redux immutable.js

我有两个数组。但是当其中一个为null时,它会出现以下错误:

  

无法读取属性' toJS'在该行中未定义

以下是触发错误的相关调用:{groupsGuney.toJS()}

这是我对变量let groupsGuney, groupsKuzey;

的声明

最后这是我的两个阵列。但是当其中一个为null时,它会给出错误:

...
    if (muso == 1) {
      groupsGuney = this.props.groups
        .groupBy((group, idx) => idx % maxRows)
          .map((ggs, idx) => {
            return this.renderGroups(ggs, idx);
          }).toList().flatten(true); 
    }

    if (muso == 2) {
      groupsKuzey = this.props.groups
        .groupBy((group, idx) => idx % maxRows)
          .map((ggs, idx) => {
            return this.renderGroups(ggs, idx);
          }).toList().flatten(true);
    }

    var result = (
      <div>
        <div className={classSelector + ' discard-mini-box-area'} > 
           { groupsGuney.toJS() } 
        </div>
        <div className={classSelector + ' discard-mini-box-area'} >
           { groupsKuzey.toJS() } 
        </div>
      </div>
    );

    return result;
  }
}

export default DiscardMiniBoxArea;

2 个答案:

答案 0 :(得分:0)

而不是:

<div>
   <div className={classSelector + ' discard-mini-box-area'} >  
     {groupsGuney.toJS()} 
   </div>
   ....

你应该这样做:

<div>
   <div className={classSelector + ' discard-mini-box-area'} >  
     {groupsGuney && groupsGuney.toJS()} 
   </div>
   ....

在调用对象上的函数之前,需要确保它在那里。如果您不确定您的对象是否始终具有此功能,则需要进行额外检查,以确保toJS存在并且它是有效的功能。

如果是这种情况,请更新容器内的内容:

{groupsGuney && typeof groupsGuney.toJS === 'function' && groupsGuney.toJS()} 

但是,理想情况下,如果您想要渲染的内容不存在,则不会渲染所有特定组。在渲染组件之前,应将这些检查移到。

答案 1 :(得分:0)

我的动机主要是我的召唤。未定义的poops本身非常难,并且在整个地方正确初始化有帮助,但并不能捕获所有边缘情况。我只想要数据或未定义而没有任何破损。如果我希望它进行更改,特定类型检查会导致我以后做更多工作。

这个更宽松的版本解决了更多的边缘情况(大多数,如果不是所有的扩展类型Iterable都有.get,并且所有数据最终都得到了),而不是特定的类型检查(当你尝试更新时,它通常只会保存你)错误的类型等)。

/* getValid: Checks for valid ImmutableJS type Iterable

    returns valid Iterable, valid Iterable child data, or undefined

    Iterable.isIterable(maybeIterable) && maybeIterable.get(['data', key], Map()), becomes
    getValid(maybeIterable, ['data', key], Map())

    But wait! There's more! As a result:
    getValid(maybeIterable) returns the maybeIterable or undefined 
    and we can still say getValid(maybeIterable, null, Map()) returns the maybeIterable or Map()            */

export const getValid = (maybeIterable, path, getInstead) =>
  Iterable.isIterable(maybeIterable) && path
    ? ((typeof path === 'object' && maybeIterable.getIn(path, getInstead)) || maybeIterable.get(path, getInstead))
    : Iterable.isIterable(maybeIterable) && maybeIterable || getInstead;


//Here is an untested version that a friend requested. It is slightly easier to grok.

export const getValid = (maybeIterable, path, getInstead) => {
  if(valid(maybeIterable)) {                 // Check if it is valid
    if(path) {                                        // Check if it has a key
      if(typeof path === 'object') {     // Check if it is an 'array'
        return maybeIterable.getIn(path, getInstead) // Get your stuff
      } else {
        maybeIterable.get(path, getInstead)          // Get your stuff
      }
    } else {
      return maybeIterable || getInstead;                 // No key? just return the valid Iterable
    }
  } else {
    return undefined;                       // Not valid, return undefined, perhaps should return false here
  }
}

请告诉我我的要求或告诉我不。不要爆炸。我相信下划线也有类似之处。