Redux:调度功能存储?

时间:2016-05-18 20:13:28

标签: redux redux-thunk

如何在redux存储中将函数保存为状态?

示例:

我将一个函数作为参数传递给redux-thunk调度程序函数,我想在我的redux存储中保存这个过滤器函数:

export const SET_FILTERED_USERS = 'SET_FILTERED_USERS';

export function setFilteredUsers(filter) {
    return (dispatch, getState) => {
        const allUsers = getState().users.allUsers;
        const filteredUsers = allUsers.filter(filter);

        dispatch({
            type: SET_FILTERED_USERS,
            data: {
                filteredUsers,
                filter
            }
        });

        const activeUser = getState().users.activeUser;

        if (activeUser && !_.isEmpty(filteredUsers) && filteredUsers.indexOf(activeUser._id) === -1) {
            dispatch(setActiveUser(filteredUsers[0]));
        } else {
            dispatch(setActiveUser(allUsers[0]));
        }
    }
}

在ReduxDevTools中,我可以看到,"过滤"不会被分派并保存在商店中。有没有办法做到这一点?

由于

更新:我的缩短减速器:

import {
    SET_FILTERED_USERS
} from '../actions/users';

import assign from 'object-assign';

export const initialState = {
    filter: null,
    filteredUsers: null
};

export default function (state = initialState, action = {}) {
    const {data, type} = action;

    switch (type) {
        case SET_FILTERED_USERS:
            return assign({}, state, {
                filteredUsers: data.filteredUsers,
                filter: data.filter
            });

        default:
            return state;
    }
}

1 个答案:

答案 0 :(得分:0)

正如塞巴斯蒂安丹尼尔所说,不要这样做。根据Redux常见问题解答,这会破坏时间旅行调试,而不是Redux的使用方式:http://redux.js.org/docs/FAQ.html#organizing-state-non-serializable

您可以考虑作为替代方案存储您想要的过滤的某种描述。作为一个相关的例子,在我当前的原型中,我正在创建一个我可能想要显示的对话框类的查找表,当我需要显示一个时,我会调度一个包含对话框类型名称的动作。我的对话管理器类将“dialogType”字段拉出状态,使用它来查找正确的对话框组件类,然后呈现它。

另一个问题,实际上,这就是为什么你真的想要首先在你的州存储一个功能。我看到你在尝试做什么,但实际上并不是你希望用它完成的事情。