У меня есть метод async redux-thunk, который выполняет процесс проверки на стороне сервера и обновляет мое глобальное значение состояния response-redux - hasServerError
соответственно из Ответ REST, чтобы поймать обновленное значение из состояния response-redux, я использую здесь метод useEffect
, например
const hasServerError = useSelector(state => return state.hasServerError );
const dispatch = useDispatch();
const saveButtonClick = () => {
// validateForm is a redux-thunk method that will send form data to server through REST
// and update `hasServerError ` to be true if there is error from server response
dispatch(validateForm());
}
// when the above validateForm would updated the value of `hasServerError `, this should trigger
useEffect(() => {
// if hasServerError still false, continue saveFormData
// otherwise, display a error modal
if (!hasServerError) {
dispatch(saveForm());
} else {
dispatch(showErrorModal());
}
}, [hasServerError, dispatch])
Это будет хорошо работать, когда пользователь нажимает кнопку сохранения, однако что-то вело себя странно, что когда hasServerError
было установлено значение false из другой отправки, и saveForm
снова запускался автоматически, например, когда я загружаю свой данные формы изначально, или когда пользователь исправляет свою ошибку в форме или пользователь нажимает кнопку отмены, и мне нужно запустить метод, который автоматически сбрасывает глобальное состояние hasServerError
на false, когда происходит такой сценарий, мой useEffect
автоматически запускается с saveForm
, например:
const textInputChange = (e) {
if (forceSave) {
dispatch(clearHasServerError()); // set state `hasServerError` to false, but it triggered the useEffect
}
}
or
const cancelButtonClick = () => {
dispatch(clearHasServerError()); // set state `hasServerError` to false, but it triggered the useEffect
}
Я понимаю, что это произошло из-за того, что моя зависимость hasServerError
обновилась, но как я могу позволить своему useEffect
выполнять saveForm
только тогда, когда пользователь нажимает кнопку, но не тогда, когда в любое время значение состояния hasServerError
становится ложным?
Должен ли я установить другой флаг, когда пользователь нажимает кнопку, и добавлять его в useEffect
как побочное условие if? Это кажется неразумным подходом, но пока я не могу придумать лучшего решения ...
event
объекта внутриsaveForm
?event
должен существовать только при нажатии кнопки. - person bertdida   schedule 10.08.2020saveForm
был внешним методом redux-thunk, я не обнаружил, что там есть объектevent
... что делаетsaveForm
, так это извлекает из некоторого глобального состояния редукции данных и выполняетPUT
запрос api к серверу, это не включить любой элементdom
.. - person KevDing   schedule 10.08.2020ugly
подход ... - person KevDing   schedule 11.08.2020