javascript - 如何检查 redux-form 是否存在错误

标签 javascript reactjs redux redux-form

我正在使用 React + Redux 和 redux-form 进行表单处理和验证。到目前为止,它非常易于使用,我可以使用 field.touched 和 field.error 轻松检查各个表单字段的验证状态,但我似乎找不到任何方法或属性来告诉我是否有任何整个表格的错误。 React 的工作方式是,任何表单在加载后都会产生一堆错误,这就是为什么您需要使用 field.touched 来测试各个字段。

我想要做的是在表单中的任何地方有任何错误时显示一些通用标记,但只显示一次。所以真的,我希望有类似 form.touched 和 form.error 的东西。我有一个辅助函数的设计,它将检查表单中的所有字段并返回一个 bool 值,但我希望尽可能避免这种情况。

更新: 根据 Andy_D 的回答,我更新了我的代码以使用表单级属性 dirtyinvaliddirty 似乎没有更新适本地。提交表单并看到个别字段级错误后,表单仍显示 dirty: false

下面包含我的代码的简化版本以及提交表单后 this.props 对象的内容。

import React, { Component } from 'react';
import { reduxForm } from 'redux-form';
import { makeBooking } from '../actions/index';

class PaymentBooking extends Component {
    render() {
        const { fields: { school }, handleSubmit } = this.props;

        return (
            <form className="form-horizontal" onSubmit={handleSubmit(this.props.makeBooking)}>
                {
                    console.log(this)
                }
                {
                    this.props.dirty && this.props.invalid ? <div className="alert alert-danger" role="alert">Test error wrapper</div> : ''
                }
                <h2>Make a New Payment Booking</h2>
                <div className="panel panel-default">
                    <div className="panel-heading">Payment Information</div>
                    <div className="panel-body">
                        <div className={`form-group ${school.touched && school.invalid ? 'has-error' : ''}`}>
                            <label htmlFor="school" className="col-lg-2 control-label">Your School</label>
                            <div className="col-lg-10">
                                <select name="school" className="form-control" {...school}>
                                    <option value="MIT">MIT</option>
                                    <option value="Stanford">Stanford</option>
                                    <option value="Arizona">Arizona</option>
                                </select>
                            </div>
                        </div>
                    </div>
                </div>
                </div>
                <div className="form-submit">
                    <button type="submit" className="btn btn-primary">Book a Payment</button>
                </div>
            </form>
        );
    }
}

function validate(values) {
    const errors = {};

    if (!values.school)
        errors.school = 'School is a required field';

    return errors;
}

export default reduxForm({
    form: 'PaymentBookingForm',
    fields: ['school'],
    validate
}, null, {makeBooking})(PaymentBooking);

提交后的this.props:

{
  "readonly": false,
  "asyncValidating": false,
  "dirty": false,
  "errors": {
    "school": "School is a required field"
  },
  "fields": {
    "school": {
      "name": "school",
      "defaultChecked": false,
      "valid": false,
      "invalid": true,
      "dirty": false,
      "pristine": true,
      "error": "School is a required field",
      "active": false,
      "touched": true,
      "visited": false
    }
  },
  "invalid": true,
  "pristine": true,
  "submitting": false,
  "submitFailed": true,
  "valid": false,
  "values": {}
}

最佳答案

它在你的 Prop 中 - 你正在寻找表单级 Prop pristinevalid .

提交后,pristine将重置,但如果请求不成功,您将收到 submitFailed Prop 。

(!pristine || submitFailed) && !valid && <ErrorMessage />

也有反转的 Prop ,所以你可以使用

(dirty || submitFailed) && invalid

正如我在评论中提到的,如果表单无效,我会阻止提交。

<button
  type="submit"
  className="btn btn-primary"
  disabled={pristine || invalid}
>Book a Payment</button>

关于javascript - 如何检查 redux-form 是否存在错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466539/

相关文章:

javascript - 当我传递给另一个单选按钮时,两个按钮的值都会出现

javascript - 动态网站的分页标题

javascript - 我应该在react-redux应用程序中的哪里存储非UI数据?

reactjs - react 路由器。刷新页面或手动写入url时无法获取

javascript - 使用 props 将 Redux Action 传递给子组件

javascript - Redux normalizr - 嵌套的 API 响应

javascript - 在javascript中追加ruby部分,并传递一个rails变量

javascript - 如何在 UIkit slider 中放置点导航

css - 如何在 React Modal 中添加填充?

javascript - Webpack 可以在不需要它们的情况下处理目录中的所有图像吗?