ckinmind / apple-basket-redux

🍎 苹果篮子,一个微型的redux/mobx演示(附多版本)
https://ckinmind.github.io/apple-basket-redux/
125 stars 71 forks source link

关于immutable.js的使用 #9

Open ckinmind opened 7 years ago

ckinmind commented 7 years ago

在项目的appleBasketReducer.js中使用了immutable 参考资料:immutable github 参考资料:immutableJS一些API 参考资料:Immutable 详解及 React 中实践

import { fromJS } from 'immutable';
// 这个是state
const state = {
    isPicking: false,
    newAppleId: 3,
    apples: [
        {
            id: 0,
            weight: 233,
            isEaten: false
        },
        {
            id: 1,
            weight: 235,
            isEaten: true
        },
        {
            id: 2,
            weight: 256,
            isEaten: false
        }
    ]
};

// 1. 修改第一层的isPicking, test1和test是两个不同对象
let test1 = fromJS(state).set('isPicking', true).toJS();

/******************************************************************************/

// 2. 多层设置,test2和test是两个不同对象
let test2 = fromJS(state).setIn(['apples', 1, 'isEaten'], true).toJS()
// 备注:这里1指的是第二层中,也就是apples数组中索引为1对象的对象,
// 所以这里更改的是id为1的数据,实际上还是需要先得到数据在数组中的确切索引
// 这里是简化处理,直接将id值关联索引值

/******************************************************************************/

// 3.  链式调用,新增数据
 let newApple =  {
                id: state.newAppleId,
                weight: action.payload,
                isEaten: false
            };
 /** 在apples中新增一个newApple, 将newAppleId增加1, 将isPicking设为false*/
let test3 = fromJS(state).update('apples', list => list.push(newApple))
                                .set('newAppleId', state.newAppleId + 1)
                                .set('isPicking', false)
                                .toJS();
// 备注:这里update可以新增一个数组,第二个参数是个回调函数
  1. fromJS将原生的数据类型转化为immutable的数据类型,Map(对应Object)或者List(Array) 最后通过toJS()在转化回原生对象

  2. set是设置数据,设置第一层的值

  3. setIn的第一个参数数组,指定设置的层级

  4. 可以使用链式调用的方式,方法的第二个参数可以制定一个回调函数来处理一些复杂的计算