reactjs Mobx控制台警告

xvw2m8pv  于 2022-11-29  发布在  React
关注(0)|答案(5)|浏览(188)

我从Mobx那里得到了警告信息。
[mobx.array]试图读取超出界限(0)的数组索引(0)。请先检查长度。超出界限的索引将不会被MobX跟踪

@observable checks = {
      deviceType: ['phone','laptop', ...],
      deviceTypeChecks: [],
      ...
    }

@action
selectAllChecks = (target, type) => {
     const targetChecks = []
     if (this.checks[target].length !== this.checks[type].length) {
        this.checks[target].forEach(el => targetChecks.push(el))
      }
     this.checks[type] = targetChecks
}

我怎样才能删除那个警告呢?不过,这个代码没有问题。它工作得很好。
我通过onChange函数使用selectAllChecks函数。

const {
  deviceType,
  deviceTypeChecks
} = this.props.store.checks

<label className="mr10">
          <input
            type="checkbox"
            checked={deviceType.length === deviceTypeChecks.length}
            onChange={() =>
              selectAllChecks('deviceType', 'deviceTypeChecks')
            }
          />
          <span>All device type</span>
        </label>

我必须为IE的4个版本。

"mobx": "^4.1.0",
"mobx-react": "^5.2.6",

有没有别的办法?

zhte4eai

zhte4eai1#

平面列表的另一个冲突是,当数据数组长度为3、5或7等时,使用的是 numColumns={2}。更改为 numColumns={1} 警告错误已解决。但此问题的解决方案使用Javascriptslice方法

<FlatList
   data={ProductStore.dataFood.slice()} // added .slice()
   extraData={ProductStore.dataFood}
   refreshing={ProductStore.productsLoading}
   numColumns={2} // number 2 conflicts when your array length is 3 or 5 or 7 and etc...
   renderItem={this._renderItemFood}
   keyExtractor={(item, index) =>
     index.toString()
   }
/>
2w3rbyxf

2w3rbyxf2#

Mobx可以使dynamic objects可观测(它事先不知道)
但是如果你在客户端调试器中查看这个对象(console.log(myObject)),你会发现它不是一个普通的JS对象,而是Mobx的某个代理对象。
为了避免这种警告,你可以使用toJS method,它将一个(可观察的)对象转换成一个javascript结构。
例如,以下代码返回警告

autorun(
        () => {
          if (this.props.store.myObject !== null ) 
          {
            this.updateSomeUi(this.props.store.myObject);
          }
        }
    );

您可以使用以下方法解决此问题:

import { toJS } from 'mobx';  
...
  autorun(
        () => {
          if (this.props.store.myObject !== null ) 
          {
            let myStruct = toJS(this.props.store.myObject);
            this.updateSomeUi(myStruct);;
          }
        }
    );
8ftvxx2r

8ftvxx2r3#

如果将@action更改为以下内容,会发生什么情况:

@action
selectAllChecks = (target, type) => {
      this.checks[type] = this.checks[target].map((value) => value);
}

是否仍显示mobx out of bounds错误?

a6b3iqyw

a6b3iqyw4#

您似乎正在尝试访问一个可观察数组的元素,而该元素不存在。您有两个可观察数组,其中一个deviceTypeChecks没有元素。但是,代码看起来没有问题。代码中是否有其他地方正在访问此数组?

n3h0vuf2

n3h0vuf25#

我今天遇到了同样的问题,在检查了所有的东西之后,我发现问题是我定义了错误的数据类型,所以mobx无法正常读取它。
定义的数组错误:

exampleArr: types.array(types.model({
    dataOne: type.string,
    dataTwo: type.number   <-- this should be a string but I defined it as number
}))

在我把它换成正确的类型后,它工作得很好

exampleArr: types.array(types.model({
    dataOne: type.string,
    dataTwo: type.string   
}))

相关问题