首页 文章

如何检查对象是否在Mobx可观察数组中?

提问于
浏览
5

我在React组件中使用 indexOf 来根据对象是否在mobx可观察数组中来设置按钮的样式 .

该按钮用于收藏 . 它将该特定列表项的对象推送到名为“favorites”的商店中的可观察数组中 . 收藏夹是一个可观察的对象数组 .

这是我的按钮中的ES6模板文字:

className={`btn-group ${((this.props.store.favorites.indexOf(this.props.data) > -1)) ? 'success' : 'info'}`}

基本上,它检查对象是否在数组中,className将为 success ,如果为_1111717_ .

当收藏夹数组处于本地状态时,这非常正常 . 但是我发现收藏夹数组中的对象在可观察数组中看起来有所不同 . 我得到的是可观察数组收藏夹与本地数组收藏夹不同 .

但是,如何测试对象是否在可观察的对象数组中呢?我尝试了 slice()peek() 并使用了findIndex但没有骰子 .

2 回答

  • 4

    Michel(mobx创建者)通过Gitter channel给了我需要的提示 .

    我实际上需要一个浅的可观察数组,而不是一个深度可观察的数组 . 我不需要数组中对象的每个属性都是可观察的(因此所有的集合/得到我之前看到的对象属性),只是添加或删除了一个对象 .

    所以我改变了它

    @observable favorites = []
    

    @observable favorites = observable.shallowArray();
    

    最终,虽然@dagatsoin的答案是正确的,如果你需要使用一个深度可观察的数组 .

  • 3

    关于doc: isObservableArray

    如果给定对象是使用mobx.observable(array)可观察的数组,则返回true .

    所以要知道 data 是否在一个可观察的 favorites 数组中:

    // If data is a primitive
    className={`btn-group ${mobx.isObservableArray(this.props.store.favorites) && this.props.store.favorites.indexOf(this.props.data) > -1 ? 'success' : 'info'}`}
    
    // Id data is an object it is a little more verbose and coupled to your data
    // structure. You have to use the `find` function to iterate and test if an 
    // element in the array has the same id.
    className={`btn-group ${mobx.isObservableArray(this.props.store.favorites) && !!this.props.store.favorites.find(fav => fav.id === this.props.data.id) ? 'success' : 'info'}`}
    

    这是一个带有函数助手的POC:https://jsbin.com/botijom/edit?js,console

相关问题