1

我现在开始研究redux。我以实际示例为起点,使用 normalizr 和 reselect 来处理数据。

现在,我需要了解将来自服务器的日期转换为 js Date 对象的最佳位置在哪里。由于 normalizr 已经处理了“一些模式”,我认为它也可以做到这一点,但我没有在那里找到它。

我应该在哪里转换这些日期?我的假设是我必须保留那些已经在商店中转换的日期。那正确吗?

4

2 回答 2

1

Normalizr 可以做到这一点 - 在当前版本(v3.3.0)中,您可以像这样实现它:

import { schema } from 'normalizr';

const ReleaseSchema = new schema.Entity('releases', {}, {
  processStrategy: (obj, parent, key) => {
    return {
      ...obj,
      createdAt: new Date(obj.createdAt),
      updatedAt: new Date(obj.updatedAt),
    };
  },
});
于 2019-04-26T14:59:36.377 回答
0

我向 callApi(在 api 中间件内部)添加了第三个参数:

function callApi(endpoint, schema, conversionFromServer) {
    const fullUrl = (endpoint.indexOf(API_ROOT) === -1) ? API_ROOT + endpoint : endpoint
    return fetch(fullUrl)
        .then(response =>
            response.json().then(json => ({ json, response }))
        ).then(({ json, response }) => {
            if (!response.ok) {
                return Promise.reject(json)
            }
            const camelizedJson = camelizeKeys(json)
            const nextPageUrl = getNextPageUrl(response)
            let convJson = camelizedJson;
            if(conversionFromServer) {
                convJson = conversionFromServer(convJson);
            }
            return Object.assign({},
                normalize(convJson, schema),
                { nextPageUrl }
            )
        })
}

现在我可以这样称呼它:

return {
    [CALL_API]: {
        types: [ TIMESLOTS_REQUEST, TIMESLOTS_SUCCESS, TIMESLOTS_FAILURE ],
        endpoint: `conference/${conferenceId}/timeslots`,
        schema: Schemas.TIMESLOT_ARRAY,
        conversionFromServer: (data) => {
            data.timeslots.forEach((t)=>{
                t.startTime=php2js.date(t.startTime)
                t.endTime=php2js.date(t.endTime)
            });
            return data;
        }
    }
}

这样我就可以尽可能地保持这种转换“尽可能靠近服务器”。

于 2016-03-31T19:02:06.507 回答