在使用mobx过程中,需要判断observable中的值的类型是否是数组,然后有了如下写法:
Array.isArray(this.props.defaultStore.result)
结果是:
无论result里面是不是数组,表达式都返回false。。
查看了一下官方文档,发现官方文档里面有这么一段话
请记住无论如何 Array.isArray(observable([])) 都将返回 false ,所以无论何时当你需要传递
observable 数组到外部库时,通过使用 array.slice() 在 observable
数组传递给外部库或者内置方法前创建一份浅拷贝(无论如何这都是最佳实践)总会是一个好主意。
换句话说,Array.isArray(observable([]).slice()) 会返回 true。
所以,将上面的那句判断改写了一下:
Array.isArray(this.props.defaultStore.result.slice())
这下结果是这样:
看似没有问题,但是result的值还可能是object类型的,如果是object类型的便会报错:
我找了好长时间,最后发现原生mobx中带有一个函数叫isObservableArray()
,如果是数组,则返回true
,非数组就返回false
,达到了我预期要实现的效果~
另外,我还查到了一个mobx的工具包mobx-utils
里面有下面几个方法也可以使用,但是我个人使用时报错'mobx' does not contain an export named '$mobx'.
,已经提了issues,解决了之后再来补充~
isObservableObject|Array|Map 用法: isObservableObject(thing),isObservableArray(thing), isObservableMap(thing). 如果匹配就返回 true 。
isArrayLike 用法: isArrayLike(thing). 如果传入的 thing 是一个JS数组或可观察的Mobx数组,则返回true 。 这通常作为一个快捷用法。注意可观察的数组可以通过 .slice() 转变成真正的JS数组。