2017-11-10 13 views
0

redux saga를 사용하여 로그인 단축 문자 양식에 오류를 표시하는 방법을 알아 내려고하고 있습니다. 요청을 할 수는 있지만 응답이 403 - 금지 된 경우 사용자에게 메시지를 표시해야합니다.redux saga 및 redux 양식을 사용하여 반응 앱에 양식 오류를 표시하십시오.

시스템 :

  • 은 16.0.0
  • REDUX 3.7.2
  • REDUX 형식 7.1.2
  • REDUX-사가 0.16.0

반응 login-form.js

import React, {Component} from 'react'; 
import {Field, reduxForm} from 'redux-form'; 
import {connect} from 'react-redux'; 

import {submit} from '../../actions'; 

class Login extends Component { 
    constructor(props) { 
    super(props); 

    this.onSubmit = this.onSubmit.bind(this); 
    } 

    onSubmit(values) { 
    this.props.submit(values); 
    } 

    renderField(field, label) { 
    // ommited 
    } 

    render() { 
    const {handleSubmit, error} = this.props; 

    return (
     <Form onSubmit={handleSubmit(this.onSubmit)}> 

     {error ? error : ''} 

     <Field 
      name="email" 
      label="Email*" 
      type="email" 
      placeholder="Email" 
      component={this.renderField} 
     /> 
     <Field 
      name="password" 
      label="Heslo*" 
      type="password" 
      placeholder="Heslo" 
      component={this.renderField} 
     /> 
     <Button color="primary">Login</Button> 
     </Form> 
    ); 
    } 
} 

export default reduxForm({ 
    form: 'loginForm' 
})(
    connect(null, {submit})(Login) 
); 

actions.js :

export const submit = function(data) { 
    console.log("Action:", data); 
    return { 
    type: 'REQUEST_SUBMIT', 
    data: data 
    }; 
}; 

sagas.js : 예상대로

import {takeEvery, fork, call, put} from 'redux-saga/effects'; 
import axios from 'axios'; 
import {SubmissionError} from 'redux-form'; 

async function submitToServer(data) { 
    try { 
    let response = await axios.post('http://localhost:3000/login', data); 
    yield put({type: 'REQUEST_SUCCESSFUL', payload: result.data}) 
    } catch(error) { 
    throw new SubmissionError({_error: "Some error message"}); 
    } 
} 

function* callSubmit(action) { 
    yield call(submitToServer, action.data); 
} 

function* submitSaga() { 
    yield takeEvery('REQUEST_SUBMIT', callSubmit); 
} 

export default function* root() { 
    yield [ 
    fork(submitSaga) 
    ]; 
} 

모든 것이 작동하지만 실제로 표시하려면 로그인 폼을 만드는 방법을 알아낼 수 없습니다 내 사가에서 던져진 오류 메시지. 실제로 내 무용담에 SubmissionError을 던져야할까요, 아니면 더 좋은 방법이 있을까요?

답변

0

일반적으로 redux 전역 상태가 작동하는 곳입니다.

actions.js 파일의 한 동작 유형은 REQUEST_SUBMIT입니다. 내가 REQUEST_SUCCESSFUL이 있다고 가정합니다. API 호출이 성공하면 무용담으로 파견하기 때문입니다.

http 요청과 같은 비동기식 항목을 사용하면 전체 요청/응답/오류 흐름에 대해 3 가지 조치가 제공 될 수 있습니다.

무용담에서 예외를 잡으면 오류 메시지가 조치 페이로드로 표시된이 세 번째 REQUEST_FAILED 조치를 보내십시오.

당신의 reducers.js에서 다음

yield put({ type: 'REQUEST_FAILED, payload: error });

, 당신은 당신의 감속기이 작업 유형에 대해 듣고 있고, 다음 오류 메시지와 상태를 업데이트 할 것입니다.

마지막으로, 귀하의 구성 요소에서 귀하의 connect 호출에 전달하는 mapStateToProps 함수를 정의하여이 오류 메시지에 액세스 할 수 있습니다. 이 부분은 react-redux lib의 시작 설명서에 나오는 내용입니다.

+0

고마워요.하지만 그건 제가 묻고있는 것이 아닙니다. 당신이 쓴 것의 어떤 것도 redux 형식에 오류를 추가하지 않습니다. 내가 redux 양식 밖에 내 자신의 상태에 어떤 오류를 추가 할 수 있지만, 내가 원하는 것은 실제로 요청을 실패하면 redux 양식 오류 필드를 채우는 것입니다. –

0

Redux-form은 제출 처리자가 약속을 반환하기를 원하고 거부 된 오류를 표시합니다.

가장 쉬운 방법은 같은 일부 접착제 코드를 사용하는 것입니다 https://github.com/mhssmnn/redux-form-saga 또는 https://github.com/afitiskin/redux-saga-routines

그것은 매우 간단 글루 코드입니다 :

  • 반환
  • 가 해결/거부 핸들러 조치를 파견 약속 그것에
  • 해당 양식 특수 작업을 수행하기 위해 무용담을 사용하십시오
  • 당신의 무용담에서 파견 ORM 별 성공/실패 조치
  • /는 약속

또는 호출됩니다에 따라에 거부 접착제의 통화 해결, 당신은 수동으로 REDUX 형태의 액션 제작자와 필드 오류를 설정할 수

  • : https://redux-form.com/7.1.2/docs/api/actioncreators.md/