Reduksi
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;
};
Di sini, secara umum, hanya penggunaan konstruksi sakelar yang menggangguSagas
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())]);
}
Dalam kisah-kisah, masalah terbesar adalah kesulitan membaca. Pandangan sekilas untuk memahami apa yang membuat saga itu sulit. Salah satu alasannya adalah sarang yang dalam. Anda tentu saja dapat mengambil pekerja untuk mengurangi kedalaman, tetapi kemudian redundansi meningkat.
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())]);
}
Ada juga pemeriksaan yang akan meningkatkan bersarang, atau menambahkan titik keluar dari saga, yang memperburuk kode kami.