/reducer

以更优雅的方式定义 Reducer,只复制 state 中需要被修改的值,其他的共享引用。

Primary LanguageJavaScriptMIT LicenseMIT

reducer

以更优雅的方式定义 Reducer,只复制 state 中需要被修改的值,其他的共享引用。

Quick start

import Reducer from 'reducer';

let reducer = new Reducer();

reducer.register('ADD_TODO', 'todos.items', function(items, data) {
    items = items.slice();
    items.push(data);
    return items;
});

let initState = {
    todos: {
        items: []
    }
};

export default function(state = initState, action) {
    return reducer.reduce(state, action);
};
dispatch({ type: 'ADD_TODO', path: 'todos.items', data: 'go home' })

Spec

describe('Reducer', function() {
  
  it('必须返回一个全新的 state', function() {
    assert.notStrictEqual(initState, newState)
  })

  it('在 path 内的元素必须是克隆的副本', function() {
    assert.notStrictEqual(initState.todos.items, newState.todos.items)
  })

  it('不在 path 内的元素必须是共享的', function() {
    assert.strictEqual(initState.todos.users, newState.todos.users)
  })

  it('旧的 state 不能包含更新', function() {
    assert.strictEqual(-1, initState.todos.items.indexOf(todo))
  })

  it('新的 state 必须包含更新', function() {
    assert.strictEqual(0, newState.todos.items.indexOf(todo))
  })
})