edux-form (4) - Submit Validation Example
17758 단어 redux-form자바스크립트Reactredux
redux-form (2) - Synchronous Validation Example
redux-form (3) - Field-Level Validation Example
redux-form (4) - Submit Validation Example
redux-form (5) - Initialize From State
redux-form (6) - 사용자 등록
React로 Form component를 만들 때 매우 편리한 redux-form 설명입니다.
redux-form의 개요는 먼저 다음 기사를 참고하십시오.
redux-form (1) - Simple Form Example
Submit Validation Example
Submit Validation Example - Getting Started With redux-form
이번은 Submit시의 에러 처리에 대해입니다.
이번에는 onSubmit이 prop로 지정되어 있지 않으므로 다음 onSubmit 함수(submit)를 handleSubmit()의 인수로 제공합니다.
src/submit.jsimport { SubmissionError } from 'redux-form'
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
function submit(values) {
return sleep(1000).then(() => {
// simulate server latency
if (!['john', 'paul', 'george', 'ringo'].includes(values.username)) {
throw new SubmissionError({
username: 'User does not exist', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
} else if (values.password !== 'redux-form') {
throw new SubmissionError({
password: 'Wrong password', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
} else {
window.alert(`You submitted:\n\n${JSON.stringify(values, null, 2)}`)
}
})
}
export default submit
여기서 주목해야 할 것은 다음 코드입니다. submit 함수가 promise이고 reject에서 new SubmissionError({ field1: 'error', field2: 'error' }) 라는 에러를 던지면, 각각의 field (field1, field2)에 에러가 추가됩니다. 아래 코드는 사용자 이름 필드에 오류를 추가합니다. _error는 개별 필드가 아니며 전체 양식 오류를 표시하려는 경우 추가합니다.
throw new SubmissionError({
username: 'User does not exist', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
wrapped component는 다음과 같이 되어 있습니다. this.props.onSubmit은 전달되지 않았으므로 직접 submit 함수를 import하고 handleSubmit의 인수로 만듭니다.
src/SubmitValidationForm.jsimport React from 'react'
import { Field, reduxForm } from 'redux-form'
import submit from './submit'
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} placeholder={label} type={type} />
{touched && error && <span>{error}</span>}
</div>
</div>
)
const SubmitValidationForm = props => {
const { error, handleSubmit, pristine, reset, submitting } = props
return (
// onSubmitがpropとして渡ってきていないので引数として与える
<form onSubmit={handleSubmit(submit)}>
<Field
name="username"
type="text"
component={renderField}
label="Username"
/>
<Field
name="password"
type="password"
component={renderField}
label="Password"
/>
{error && <strong>{error}</strong>}
<div>
<button type="submit" disabled={submitting}>
Log In
</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>
Clear Values
</button>
</div>
</form>
)
}
export default reduxForm({
form: 'submitValidation' // a unique identifier for this form
})(SubmitValidationForm)
index.js는 원본을 변경하여 최소한으로 수정했습니다.
src/index.jsimport React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { createStore, combineReducers } from 'redux'
import { reducer as reduxFormReducer } from 'redux-form'
const dest = document.getElementById('content')
const reducer = combineReducers({
form: reduxFormReducer // mounted under "form"
})
const store = createStore(reducer)
let render = () => {
const SubmitValidationForm = require('./SubmitValidationForm').default
ReactDOM.hydrate(
<Provider store={store}>
<h2>Form</h2>
<SubmitValidationForm />
</Provider>,
dest
)
}
render()
실행 결과
submit 버튼을 클릭했을 때의 화면입니다.
password 에러시의 화면입니다. password field 개별 오류 'Wrong password'가 표시됩니다. 또한 양식 전체 오류 'Login failed!'가 표시됩니다.
오류없이 성공시 화면입니다.
이번은 이상입니다.
Reference
이 문제에 관하여(edux-form (4) - Submit Validation Example), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sand/items/3913526199b509770c6c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import { SubmissionError } from 'redux-form'
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
function submit(values) {
return sleep(1000).then(() => {
// simulate server latency
if (!['john', 'paul', 'george', 'ringo'].includes(values.username)) {
throw new SubmissionError({
username: 'User does not exist', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
} else if (values.password !== 'redux-form') {
throw new SubmissionError({
password: 'Wrong password', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
} else {
window.alert(`You submitted:\n\n${JSON.stringify(values, null, 2)}`)
}
})
}
export default submit
throw new SubmissionError({
username: 'User does not exist', // 個別のfieldエラー
_error: 'Login failed!' // form全体のエラー
})
import React from 'react'
import { Field, reduxForm } from 'redux-form'
import submit from './submit'
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} placeholder={label} type={type} />
{touched && error && <span>{error}</span>}
</div>
</div>
)
const SubmitValidationForm = props => {
const { error, handleSubmit, pristine, reset, submitting } = props
return (
// onSubmitがpropとして渡ってきていないので引数として与える
<form onSubmit={handleSubmit(submit)}>
<Field
name="username"
type="text"
component={renderField}
label="Username"
/>
<Field
name="password"
type="password"
component={renderField}
label="Password"
/>
{error && <strong>{error}</strong>}
<div>
<button type="submit" disabled={submitting}>
Log In
</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>
Clear Values
</button>
</div>
</form>
)
}
export default reduxForm({
form: 'submitValidation' // a unique identifier for this form
})(SubmitValidationForm)
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { createStore, combineReducers } from 'redux'
import { reducer as reduxFormReducer } from 'redux-form'
const dest = document.getElementById('content')
const reducer = combineReducers({
form: reduxFormReducer // mounted under "form"
})
const store = createStore(reducer)
let render = () => {
const SubmitValidationForm = require('./SubmitValidationForm').default
ReactDOM.hydrate(
<Provider store={store}>
<h2>Form</h2>
<SubmitValidationForm />
</Provider>,
dest
)
}
render()
submit 버튼을 클릭했을 때의 화면입니다.
password 에러시의 화면입니다. password field 개별 오류 'Wrong password'가 표시됩니다. 또한 양식 전체 오류 'Login failed!'가 표시됩니다.
오류없이 성공시 화면입니다.
이번은 이상입니다.
Reference
이 문제에 관하여(edux-form (4) - Submit Validation Example), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sand/items/3913526199b509770c6c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)