【问题标题】:Filling redux state with key objects from API endpoint使用来自 API 端点的关键对象填充 redux 状态
【发布时间】:2020-03-05 10:44:53
【问题描述】:

如果我在组件中调度 dispatch(fetchResources()); this,我会将这两个对象添加到 Redux 状态。当我再次调用该函数时,我希望响应中的两个新对象被添加到列表中。相反,它为响应创建了一个新数组。我如何确保它被添加到数组中,而不是每次都获得一个新数组。 (见图)

界面:

export interface Resource {
    [key: string]: Object[]
}

export interface AddResourceInterface {
    type: typeof ADD_RESOURCE;
    payload: Resource;
}

export type ResourceTypes =
    AddResourceInterface |
    RemoveResourceInterface;

export type AppActions = ResourceTypes;

行动:

export const addResource = (resource: Resource): AppActions  => ({
    type: ADD_RESOURCE,
    payload: resource
});

export const fetchResources: ActionCreator<ThunkAction<any, any, any, any>> = () => {
    return async (dispatch: Dispatch) => {

        await fetch('http://localhost:3000/authorization')
            .then(res => res.json())
            .then(data => {
                dispatch(addResource(data))
            })
            .catch(err => {
                console.log(err);
            })
    }
};

减速机:

const initialState: Resource[] = [];

const resourceReducer = (
    state = initialState,
    action: ResourceTypes
): Resource[] => {
    switch (action.type) {
        case "ADD_RESOURCE":
            return [...state, action.payload];
        default:
            return state;
    }
};

端点返回:

{
  "https://google.com": {
    "enters": "today",
    "scopes": [
      "cloud:user"
    ]
  },
  "https://youtube.com": {
    "enters": "today",
    "scopes": [
      "cloud:user"
    ]
  },
}

【问题讨论】:

    标签: reactjs typescript redux react-redux


    【解决方案1】:

    如果您不关心状态中的先前值,并且如果您绝对希望每次调度操作时都覆盖它们,那么您可以将 reducer 更改为:

    const resourceReducer = (
        state = initialState,
        action: ResourceTypes
    ): Resource[] => {
        switch (action.type) {
            case "ADD_RESOURCE":
                return [action.payload];
            default:
                return state;
        }
    };
    

    所以return action.payload 现在会将数组分配给状态。之前您使用像 [...state, action.payload] 这样的扩展运算符,因此它将创建一个包含先前值和新值的新数组。

    【讨论】:

    • 是的,我想覆盖以前的状态,这是一个例外情况。但是当我尝试你的答案时,打字稿开始抱怨有效载荷的类型。 “Resource”类型缺少“Resource[]”类型的以下属性:length、pop、push、concat 和另外 26 个。我猜你忽略了它?
    • @Marc 嗯,您的响应是一个对象,而您的 initialState 是一个数组。您可以更改类型,也可以简单地将return action.payload; 更改为return [action.payload];
    猜你喜欢
    • 2018-12-11
    • 2018-12-14
    • 2019-01-06
    • 2014-09-22
    • 1970-01-01
    • 2016-03-31
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多