ReactJs with Bootstrap:多步表单验证,使用 Formik 和 Yup

问题描述

我正在 ReactJs 和 Bootstrap 中开发一个多步表单,使用 Formik 和 Yup。 实际上,我在这里有两个问题,尽管我已经阅读了部分 Formik 和 Yup 文档,但我还没有找到答案。

  1. 我更改了我的选择字段的值,但validationSchema 只是忽略这些值,并且只有initialValues 提交到此验证。

  2. 在通过validationSchema验证我的字段值之前,我必须检查选择选项是否不是第一个(这第一个选项相当于每个字段的“选择您的选项”,当用户提交时,它的值对于模式应该是空的),可以在没有validationSchema的情况下通过从Formik创建验证函数来完成,但我想使用Formik,因为我想要一种更漂亮的方式来显示错误。我已经尝试了很多东西,但直到现在我还没有得到任何答案。

这是第 1 步表单代码**

import React,{ Component } from 'react';
import Form from 'react-bootstrap/Form';
import {ErrorMessage,Formik,validateYupSchema} from "formik";
import Col from 'react-bootstrap/Col';
import InputGroup from 'react-bootstrap/InputGroup';
import Button from 'react-bootstrap/Button';
import * as yup from 'yup';
import PropTypes from 'prop-types';
import {Categories} from './categoriesList.jsx';
import {Brands} from './brandsList';
import {ProductTypes} from './productTypesList';
import NewProduct from './newProductComponent.jsx';

let schema = yup.object().shape({
    productCategory: yup.string().required(),productBrand: yup.string().required(),productType: yup.string().required()
    });

class FormProducts1 extends Component {

    reset = () => {
        this.props.handleReset1();
    }

    render() { 

        const {values,handleChange,handleReset1} = this.props;

        const CategoryOptions = Categories,MakeItemCategory = function(itemCategory) {
                return <option value={itemCategory} key={itemCategory}>{itemCategory}</option>;
        };

        const BrandOptions = Brands,MakeItemBrand = function(itemBrand) {
                return <option value={itemBrand} key={itemBrand}>{itemBrand}</option>;
        };

        const ProductOptions = ProductTypes,MakeItemProduct = function(itemProduct) {
                return <option value={itemProduct} key={itemProduct}>{itemProduct}</option>;
        };

        return ( 
            <Formik

            initialValues = {{
                productCategory:'',productBrand: '',productType: ''
            }}

             validationSchema = {schema}

             onSubmit = {
               values => {console.log(values)}
             }

            >
            {({ 
              handleSubmit,handleBlur,touched,isInvalid,//defines what is invalid
              errors //catch up the errors to be displayed
              }) => ( 
              <Form onSubmit={handleSubmit}>
                
                <Form.Group as={Col} md="12" controlId="formProduct.ProductCategory">
                    <Form.Label>Categoria do Produto</Form.Label>
                    <Form.Control 
                        name="productCategory" 
                        as="select" 
                        onChange={handleChange('productCategory')} 
                        value={values.productCategory} 
                        onBlur={() => handleBlur('productCategory',true)}
                        isInvalid={touched.productCategory && errors.productCategory}
                        >
                        {CategoryOptions.map(MakeItemCategory)}
                    </Form.Control>
                    <Form.Control.Feedback type="invalid">{errors.productCategory}</Form.Control.Feedback>
                </Form.Group>
                
                <Form.Group as={Col} md="12" controlId="formProduct.ProductBrand">
                    <Form.Label>marca do Produto</Form.Label>
                    <Form.Control 
                        name="productBrand" 
                        as="select" 
                        onChange={handleChange('productBrand')} 
                        value={values.productBrand}
                        onBlur = {() => handleBlur('productBrand',true)}
                        isInvalid = {touched.productBrand && errors.productBrand} > 
                        {BrandOptions.map(MakeItemBrand)}
                    </Form.Control>
                    <Form.Control.Feedback type="invalid">{errors.productBrand}</Form.Control.Feedback>
                </Form.Group>

                <Form.Group as={Col} md="12" controlId="formProduct.ProductType">
                    <Form.Label>Tipo do Produto</Form.Label>
                    <Form.Control 
                        name="productType" 
                        as="select" 
                        onChange={handleChange('productType')} 
                        value={values.productType}
                        onBlur = {() => handleBlur('productType',true)}
                        isInvalid={touched.productType && errors.productType}>
                        {ProductOptions.map(MakeItemProduct)}
                    </Form.Control>
                    <Form.Control.Feedback type="invalid">{errors.productType}</Form.Control.Feedback>
                </Form.Group>
            
                <Form.Group controlId="buttonsCategory" style={this.formatForm}>
                    <Button variant="secondary m-2" type="reset" style={this.styleAddButton} onClick={this.reset}>
                        Limpar
                    </Button>

                    <Button variant="primary" type="submit" style={this.styleAddButton}>
                       Continuar
                    </Button>
                </Form.Group>
               
              </Form>  
                    
              )}      

            </Formik>

        );
    }
}


export default FormProducts1;

********************这里是步骤的容器组件代码*******************

import React,{ Component } from 'react';
import FormProducts1 from './formProducts1';
import FormProducts2 from './formProducts2';
import FormProducts3 from './formProducts3';
import FormProductsSuccess from './formProductsSuccess';
import PropTypes from "prop-types";

class NewProduct extends Component {

    state = { 
        step:1,productCategory:'',productBrand:'',productType:'',productName:'',productPrice:0,productCode:'',productDescription:''
    }

    formatForm = {
        marginTop:15
    };

    styleAddButton = {
        fontSize:15,fontWeight:"bold"
    };

    //Proceed to the next step
    nextStep = () => {
        const {step} = this.state
        this.setState({
            step: step + 1
        });
    }

    //Go back to prevIoUs step <div>
    
    prevStep = () => {
        const {step} = this.state
        this.setState({
            step: step - 1
        });
    }

    //Handle fields change
    handleChange = input => e => {
        this.setState({
            [input]: e.target.value
        });
    }

    toCurrency(number) {
        const formatter = new Intl.NumberFormat("pt-BR",{
          style: "decimal",currency: "BRL"
        });
    
        return formatter.format(number);
    }


    handleReset1 = () => {
        this.setState({
            productCategory:'',productType:''
        });
    }

    handleReset2 = () => {
        this.setState({
            productName:'',productDescription:''
        });
    }

    render() { 
        
        const {step} = this.state;
        const {productCategory,productBrand,productType,productName,productPrice,productCode,productDescription} = this.state;
        const values = {productCategory,productDescription};
 

        switch(step){
            case 1:
                return (
                    <FormProducts1 nextStep = {this.nextStep}
                    handleChange = {this.handleChange} handleReset1 = {this.handleReset1}
                    values={values}
                    />
                )
            case 2:
                return(
                    <FormProducts2 nextStep = {this.nextStep}
                    prevStep = {this.prevStep} handleChange = {this.handleChange}
                    handleReset2 = {this.handleReset2} 
                    values={values} toCurrency = {this.toCurrency}
                    />
                )
            case 3:
                return(
                    <FormProducts3 nextStep = {this.nextStep} prevStep = {this.prevStep}
                    values={values} toCurrency = {this.toCurrency}
                    />
                )
            case 4:
                return(
                    <FormProductsSuccess/>
                )
        }         
        
    }
}

NewProduct.propTypes = {
    value: PropTypes.string,onChange: PropTypes.func
  };
 
export default NewProduct;

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...