我现在开始研究redux。我以实际示例为起点,使用 normalizr 和 reselect 来处理数据。
现在,我需要了解将来自服务器的日期转换为 js Date 对象的最佳位置在哪里。由于 normalizr 已经处理了“一些模式”,我认为它也可以做到这一点,但我没有在那里找到它。
我应该在哪里转换这些日期?我的假设是我必须保留那些已经在商店中转换的日期。那正确吗?
我现在开始研究redux。我以实际示例为起点,使用 normalizr 和 reselect 来处理数据。
现在,我需要了解将来自服务器的日期转换为 js Date 对象的最佳位置在哪里。由于 normalizr 已经处理了“一些模式”,我认为它也可以做到这一点,但我没有在那里找到它。
我应该在哪里转换这些日期?我的假设是我必须保留那些已经在商店中转换的日期。那正确吗?
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),
};
},
});
我向 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;
}
}
}
这样我就可以尽可能地保持这种转换“尽可能靠近服务器”。