减速器
import getInitialState, {
formDataInitialState as initialState,
} from '../helpers/initialState';
import { HANDLE_FIELD_DONE, ON_FIELD_CHANGE, RESET } from '../actionCreators';
export default (state = initialState, { type, payload }) => {
switch (type) {
case RESET: {
return getInitialState().formDataInitialState;
}
case ON_FIELD_CHANGE: {
const { name } = payload;
return {
...state,
[name]: '',
}
}
case HANDLE_FIELD_DONE: {
const { name, value } = payload;
return {
...state,
[name]: value,
}
}
}
return state;
};
通常,这里仅使用开关结构很烦人萨加斯
import { all, put, select, fork, takeEvery } from 'redux-saga/effects';
import { runServerSideValidation } from '../actionCreators';
import { HANDLE_FIELD } from '../actionCreators';
function* takeHandleFieldAction() {
yield takeEvery(HANDLE_FIELD, function*({ payload }) {
const { validation, formData } = yield select(
({ validation, formData }) => ({
validation: validation[payload.name],
formData,
})
);
const valueFromState = formData[payload.name];
if (payload.value !== valueFromState) {
const { name, value } = payload;
const { validator } = validation.serverValidator;
yield put(
runServerSideValidation({
name,
value,
validator,
formData,
})
);
}
});
}
export default function* rootSaga() {
yield all([fork(takeHandleFieldAction())]);
}
在Sagas中,最大的问题是阅读困难。粗略地看一下就知道是什么使传奇变得困难了。原因之一是深层嵌套。当然,您可以减少工作人员来减少深度,但是冗余会增加。
import { all, put, select, fork, takeEvery } from 'redux-saga/effects';
import { runServerSideValidation } from '../actionCreators';
import { HANDLE_FIELD } from '../actionCreators';
function* takeHandleFieldWorker({ payload }) {
const { validation, formData } = yield select(
({ validation, formData }) => ({
validation: validation[payload.name],
formData,
})
);
const valueFromState = formData[payload.name];
if (payload.value !== valueFromState) {
const { name, value } = payload;
const { validator } = validation.serverValidator;
yield put(
runServerSideValidation({
name,
value,
validator,
formData,
})
);
}
}
function* takeHandleFieldWatcher() {
yield takeEvery(HANDLE_FIELD, takeHandleFieldWorker);
}
export default function* rootSaga() {
yield all([fork(takeHandleFieldWatcher())]);
}
也有一些检查可能会增加嵌套,或者增加传奇中的出口点,这会使我们的代码更糟。