phi*_*ilk 6 reactjs redux redux-saga
我从 remove API 获得的数据不是我的应用程序可以处理的格式。我的传奇下载数据。
谁应该处理规范化?
在使用规范化数据发送成功操作之前,传奇本身?
或者路由器应该在构建新状态之前标准化日期?
编辑我选择在传奇中标准化并保持减速器清洁。它只是用新的活动替换了活动activitiesUpdated
。
减速机
export default function account(state = ACCOUNT, action) {
switch (action.type) {
case "account/LOGIN_SUCCESS":
const { access_token, user } = action
return { ...state, user, access_token, authenticated: true, error: "" }
case "account/LOGOUT_SUCCESS":
return ACCOUNT
case "account/LOGIN_ERROR":
return { ...state, error: action.error }
case "account/ACTIVITIES_UPDATED":
return { ...state, activities: action.activities }
default:
return state
}
}
Run Code Online (Sandbox Code Playgroud)
这些是传奇:
function sortActivities(activities) {
return action.activities.sort((a,b) => b.timestamp.localeCompare(a.timestamp))
}
function addInvoices(activities) {
let lastYearMonth, invoiceItem
return activities.reduce((state, item, index) => {
const currentYearMonth = item.timestamp.substr(0,7)
if (currentYearMonth != lastYearMonth) {
lastYearMonth = currentYearMonth
invoiceItem = {
id: currentYearMonth,
type: "invoice",
parking: 0,
rebates: 0,
sum: 0,
timestamp: currentYearMonth
}
state.push(invoiceItem)
}
const amount = Math.abs(Number(item.gross_amount))
if (item.type == "parking") {
invoiceItem.parking += amount
invoiceItem.sum -= amount
} else if (item.type == "rebate" || item.type == "surplus") {
invoiceItem.rebates += amount
invoiceItem.sum += amount
}
state.push(item)
return state
}, [])
}
function *getActivities(access_token) {
console.info("fetch activities")
try {
const activities = yield call(getActivitiesAsync, access_token)
console.info("activities fetched")
yield put(activitiesUpdated(addInvoices(activities.sortActivities(activities))))
} catch (error) {
}
}
function *updateActivities() {
while (true) {
const { access_token } = yield take(LOGIN_SUCCESS)
console.info("Calling getActivities")
yield call(getActivities, access_token)
while (true) {
const {type } = yield take([REFRESH_ACTIVITIES, LOGOUT])
if (type == LOGOUT) {
break
}
yield call(getActivities, access_token)
}
}
}
Run Code Online (Sandbox Code Playgroud)
当您想到updateActivities
传奇中的双包裹 while 循环时?
是否正确
yield take([REFRESH_ACTIVITIES, LOGOUT])
只是一个捷径
yield race[take(REFRESH_ACTIVITIES), take(LOGOUT)]
最终,在这种情况下,你可以自由地做任何对你有用的事情——没有充分的理由支持其中一种。您最终可能会发现,根据数据的结构方式,在 saga 中执行此操作将需要更少的代码,因为您只将结果分解一次而不是两次(在关心数据的 2 个减速器中各分解一次)。但是我也喜欢在减速器中这样做的想法,因为减速器通常应该尽可能简单,并且这个模型适合这一点。
但正如我所说,我认为没有一个强有力的普遍论据可以支持其中之一。
归档时间: |
|
查看次数: |
846 次 |
最近记录: |