крючок react useEffect срабатывает только один раз, хотя обновление магазина redux

#reactjs #react-redux #react-hooks

Вопрос:

Простой компонент крючка ниже, при отправке формы он выдает исключение и запускает триггеры крючка useEffect и выдает сообщение об ошибке.,

если отправить снова по какой-то причине, эффект использования не срабатывает..

Я могу заверить вас, что действие работает так, как ожидалось, так как я выполняю действия с отладчиками.. он не вступает в действие после первой отправки..

компонент:

 import { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'

const { messages, error } = useSelector((state) => state.contact)

  const dispatch = useDispatch()

  useEffect(() => {
    debugger
    if (error) {
      alert(messages)
    }
  }, [error, messages])

  const onSubmitForm = (data) => {
    dispatch(postContact(data))
  }
 

Экшен:

 export const postContact = ({ name, email, website, message }) => async (
  dispatch
) => {
  try {
    dispatch({
      type: CONTACT_POST,
    })
    const response = await axios.post('/contact', {
      data: {
        Name: name,
        Email: email,
        Website: website,
        Message: message,
      },
    })
    dispatch({
      type: CONTACT_POST_SUCCESS,
      payload: response.data,
    })
  } catch (error) {
    debugger
    dispatch({
      type: CONTACT_POST_FAIL,
      error: error.message,
    })
  }
}
 

редуктор:

 export default function contact(state = initialState, action = {}) {
  switch (action.type) {
    case CONTACT_POST:
      return {
        ...state,
      }
    case CONTACT_POST_SUCCESS:
      return {
        ...state,
        messages: 'Completed successfully',
        error:false,
      }
    case CONTACT_POST_FAIL:
      debugger
      return {
        ...state,
        messages: action.error,
        error: true,
      }
    default:
      return state
  }
}
 

Ответ №1:

Потому что для свойства ошибка и сообщение не изменяется значение. Значение ошибки всегда присваивается как «true». Попробуйте прослушать само состояние целиком.

 const contactState = useSelector((state) => state.contact)

 useEffect(() => {
    debugger
    if (error) {
      alert(messages)
    }
  }, [contactState ])
 

Или вам нужно сбросить значение ошибки и сообщение при отправке запроса

  case CONTACT_POST:
      return {
        ...state, error:false, messages:""
      }
 

Комментарии:

1. Второе предложение спасло меня! Спасибо!