React router 4 рендеринг компонента push истории - PullRequest
2 голосов
/ 28 июня 2019

С redux-saga и react router 4. Я пытаюсь реализовать поток для регистрации пользователей. Я сосредотачиваюсь на той части, где пользователю предоставляется экран регистрации на маршруте /user/register.

ЗАДАЧА

Цель состоит в том, чтобы обновить статус регистрации пользователя на этом же экране как Alert в зависимости от того, успешно ли создан пользователь или уже существует пользователь. Я использую redux-saga и history.push из саги для обновления представления.

ПРОБЛЕМА

Предупреждение отображается, но только после перезагрузки страницы /user/register.

Я передаю состояние в history.push из моей саги, а затем в моем компоненте на основе того состояния, которое я извлекаю из this.props.location.state. Я подготавливаю содержимое для оповещения.

Зарегистрировать компонент

// Form submission handler
handleUserRegistration = user => {
   this.props.registerUser(user, this.props.history);
}

// Prepring the alert content
getAlertUI = signupState =>  {
   if (signupState.signupSuccess) {
       return <UncontrolledAlert color='success'>{'Verification email sent. Please verify your account.'}</UncontrolledAlert>
   }else {
       return <UncontrolledAlert color='danger'>{signupState.error.message}</UncontrolledAlert>
   }
}

render () {
  let alertContent = null;

  const signupResponse = this.props.location.state;
  if (signupResponse) {
   if (signupResponse.error) {
     alertContent = this.getAlertUI({signupSuccess: false, error: signupResponse.error});
   }else {
     if (signupResponse.verificationEmailSent) {
       alertContent = this.getAlertUI({signupSuccess: true})
     }
   }
  }

  return (
   <div> {alertContent} </div>
   // My form component goes here.
  )
}

Пока мой saga. Я использую history.push с необходимой информацией.

saga.js

const registerWithEmailPasswordAsync = async (userData) =>

    await axios.post(apiUrls.SINGUP_USER, userData )
                    .then(response => {
                        return {
                            isError: false,
                            data: response.data,
                        }
                    })
                    .catch(error => {
                        return {
                            isError: true,
                            errorDetails: {
                                status: error.response ? error.response.status : null,
                                message: error.response ? error.response.data : null,
                            }
                        }
                    })

function* registerUser({ payload }) {
    const { history } = payload;
    try {
        const registerUser = yield call(registerWithEmailPasswordAsync, payload.user);
        if (!registerUser.isError) {
            history.push('/user/register', {verificationEmailSent: true});
        } else {
            if (registerUser.errorDetails) {
                history.push('/user/register', {error: registerUser.errorDetails} );
            }
        }
    } catch (error) {
        console.log('register error : ', error)
    }
}

Я довольно новичок в этом, пожалуйста, поделитесь, если это лучший подход или нет? И если это почему не обновляет мой взгляд. Любые указатели высоко ценятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...