React Flux:添加新项目时如何自动排序存储的数组?

时间:2015-03-27 17:00:30

标签: reactjs reactjs-flux flux

我正在尝试找出在添加新项目时更新存储阵列的最佳方法。

现在我正在使用下面的代码对其进行排序(在AppDispatcher.register代码中调用sortMissions()),但感觉效率低下,因为每次调用一个switch case时都会对数组进行排序,即使它与_missions数组无关(例如,如果_incomplete_missions更改,我仍然会排序_missions)。

//MissionStore.js
// Define initial data points
var _missions = [], _incomplete_missions = [];

// Add a mission to _missions
function addMission(mission){
    _missions.push(mission);
}

// Sort _missions as desired
function sortMissions(){
    _missions = _(_missions).chain().sortBy('name').sortBy('points').value();
}

...

var MissionStore = _.extend({}, EventEmitter.prototype, {
    ...
    // Return Mission data
    getMissions: function() {
        return _missions;
    },
    // emit change event
    emitChange: function() {
        this.emit('change');
    },

    // add change listener
    addChangeListener: function(callback) {
        this.on('change', callback);
    },

    // remove change listener
    removeChangeListener: function(callback) {
        this.removeListener('change', callback);
    }
});

AppDispatcher.register(function(payload) {
    var action = payload.action;
    var text;

    switch(action.actionType) {

        case MissionActionConstants.MISSION_SAVE:
            addMission(action.mission);
            break;
        default:
            return true;
    }

    sortMissions();
    MissionStore.emitChange();

    return true;
});

我想到只是在MissionStore.getMissions()中排序_missions而没有其他地方,但是每次调用getMissions()时都会对它进行排序,无论是否有任何改变。

我还考虑过在每个调度程序中添加sortMissions(),其中_missions会改变,但这似乎是我在重复自己。

理想情况下,我只想订阅_missions数组(来自同一商店内)的更改,并仅在更改时对_ _ _进行排序,但我不确定如何做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:2)

也许你应该在控制器视图中进行排序,而不是在商店中进行排序。

这样,您只维护一个任务集合,这可能是不可变数据。我推荐ImmutableJS

然后,如果MissionsStore.getMissions() !== this.state.missions,您进行排序,然后将已排序的集合传递给this.setState()

否则,我认为您正在考虑为每种类型的维护保留一个单独的缓存集合,这似乎需要维护很多。但它确实是一种可行的选择。