Reactjs 使用Immutable.JS时,redux选择器是否应始终返回Immutable.JS对象?

Reactjs 使用Immutable.JS时,redux选择器是否应始终返回Immutable.JS对象?,reactjs,redux,immutable.js,reselect,Reactjs,Redux,Immutable.js,Reselect,Redux团队建议。但是,我发现当选择器返回的对象是由状态的多个片构造的时候,选择器很难返回不可变的.JS对象 以官方演示为例。选择器getCartProducts使用状态的cart切片和product切片来构造返回对象: export const getCartProducts = state => getAddedIds(state).map(id => ({ ...getProduct(state, id), quantity: getQuantity(st

Redux团队建议。但是,我发现当选择器返回的对象是由状态的多个片构造的时候,选择器很难返回不可变的.JS对象

以官方演示为例。选择器
getCartProducts
使用状态的cart切片和product切片来构造返回对象:

export const getCartProducts = state =>
  getAddedIds(state).map(id => ({
    ...getProduct(state, id),
    quantity: getQuantity(state, id)
  }))

在这种情况下,如果使用Immutable.JS,如何重新构造此选择器以使其返回Immutable.JS对象?

重要的是不要改变状态,但您可以在不使用Immutable.JS的情况下执行此操作

您不需要将Immutable.JS与Redux一起使用。如果编写正确,纯JavaScript完全能够提供不变性,而无需使用以不变性为中心的库


重要的是不要改变状态,但是不需要Immutable.JS就可以做到这一点

您不需要将Immutable.JS与Redux一起使用。如果编写正确,纯JavaScript完全能够提供不变性,而无需使用以不变性为中心的库


如果您将使用不可变JS对象并在其上使用method.map,它将返回新的不可变JS对象

如果您有vanilla JS对象,并希望将其转换为Immutable.JS,那么有一个来自JS()的帮助函数

所以有两种选择

  • 确保您正在Immutable.js结构上运行map函数

  • 使用Immutable.fromJS()按原样运行并在完成后从vanilla传输到Immutable.js


  • 如果您将使用不可变JS对象并在其上使用method.map,它将返回新的不可变JS对象

    如果您有vanilla JS对象,并希望将其转换为Immutable.JS,那么有一个来自JS()的帮助函数

    所以有两种选择

  • 确保您正在Immutable.js结构上运行map函数

  • 使用Immutable.fromJS()按原样运行并在完成后从vanilla传输到Immutable.js


  • 如果整个redux状态是一个不可变的.js对象,那么所有这些函数都将返回一个不可变的.js对象。例如,
    getAddedIds(state)
    函数将返回一个不可变的.List,而
    map
    函数将返回一个新的不可变的.List。由于您不应该将普通JS对象与Immutable.JS对象混合使用,这些列表中的对象也将是Immutable.JS

    我试图创建一个简单的示例,向您展示这些选择器的外观

    const-id=[
    “a2ds2”,
    “a3322asdda”,
    “1d1w1s11x1”
    ];
    常数乘积=[{
    id:'a2ds2',
    名称:“牛奶”
    },
    {
    id:'a3322asdda',
    名字:“面包”
    },
    {
    id:'b1d1w1s11x1',
    姓名:“橙色”
    }
    ];
    常数项=[
    {
    productId:'a3322asdda',
    qnt:20
    },
    {
    productId:'a2ds2',
    qnt:3
    }
    ]
    const newState=Immutable.fromJS({
    身份证,
    产品,
    手推车
    })
    //返回ID的列表
    const getAddedIds=(state)=>state.get('ids').filter(id=>id[0]=='a'))
    //返回产品映射
    const getProduct=(state,id)=>state.get('products').find(product=>product.get('id')==id)
    //返回产品的qnt
    const getQntByProduct=(state,id)=>state.get('cartItems').find(item=>item.get('productId')==id.get('qnt'))
    //创建新列表
    const result=getAddedIds(newState)
    .map(id=>getProduct(newState,id).set(
    "qnt",,
    getQntByProduct(newState,id)
    )
    )
    console.log('result',result)

    如果整个redux状态是一个不可变的.js对象,那么所有这些函数都将返回一个不可变的.js对象。例如,
    getAddedIds(state)
    函数将返回一个不可变的.List,而
    map
    函数将返回一个新的不可变的.List。由于您不应该将普通JS对象与Immutable.JS对象混合使用,这些列表中的对象也将是Immutable.JS

    我试图创建一个简单的示例,向您展示这些选择器的外观

    const-id=[
    “a2ds2”,
    “a3322asdda”,
    “1d1w1s11x1”
    ];
    常数乘积=[{
    id:'a2ds2',
    名称:“牛奶”
    },
    {
    id:'a3322asdda',
    名字:“面包”
    },
    {
    id:'b1d1w1s11x1',
    姓名:“橙色”
    }
    ];
    常数项=[
    {
    productId:'a3322asdda',
    qnt:20
    },
    {
    productId:'a2ds2',
    qnt:3
    }
    ]
    const newState=Immutable.fromJS({
    身份证,
    产品,
    手推车
    })
    //返回ID的列表
    const getAddedIds=(state)=>state.get('ids').filter(id=>id[0]=='a'))
    //返回产品映射
    const getProduct=(state,id)=>state.get('products').find(product=>product.get('id')==id)
    //返回产品的qnt
    const getQntByProduct=(state,id)=>state.get('cartItems').find(item=>item.get('productId')==id.get('qnt'))
    //创建新列表
    const result=getAddedIds(newState)
    .map(id=>getProduct(newState,id).set(
    "qnt",,
    getQntByProduct(newState,id)
    )
    )
    console.log('result',result)

    我知道如何编写不可变状态,而无需使用不可变的聚焦库。但我想知道在使用Immutable.JS时如何处理问题中提到的情况。这是我的问题。我知道如何编写不可变的状态,而不使用不可变的聚焦库。但我想知道在使用Immutable.JS时如何处理问题中提到的情况。这是我的问题,谢谢。但也许你没有明白我的意思。我的观点是,在使用Immutable.JS时,选择器是否应该始终返回Immutable.JS对象?在我提到的例子中,选择器返回一个普通的JS对象似乎更合理。如果你有immutable.JS结构,它将返回immutable.JS对象或节点值。如果节点值为js object,则返回js object.Thank。但也许你没有明白我的意思。我的观点是,在使用Immutable.JS时,选择器是否应该始终返回Immutable.JS对象?在我提到的例子中,选择器返回一个普通的JS对象似乎更合理
    let some = {foo: 'bar'};
    let immutableObject = Immutable.fromJS(some);