草庐IT

javascript - 在 Formik 中添加 react-bootstrap 警报以处理提交

coder 2024-07-20 原文

我正在尝试向我的 Formik 表单添加一个 react-bootstrap 警报,以便 handleSubmit 向用户发出表单已提交的警报。

我使用了 react-bootstrap 记录的 Alert 形式,但是我不得不更改最后一行,因为这似乎不起作用(错误说如果我使用 react-bootstrap 记录的形式,我没有导出任何东西警报。

我的警报是:

import React from 'react';

import {
    Alert,
    Button,

  } from "react-bootstrap";

class AlertDismissible extends React.Component {
    constructor(props) {
      super(props);

      this.state = { show: true };
    }

    render() {
      const handleHide = () => this.setState({ show: false });
      const handleShow = () => this.setState({ show: true });
      return (
        <>
          <Alert show={this.state.show} variant="light">
            <Alert.Heading>Thanks for your interest </Alert.Heading>
            <p>
              We'll be in touch with login details shortly.
            </p>
            <hr />
            <div className="d-flex justify-content-end">
              <Button onClick={handleHide} variant="outline-success">
                Close
              </Button>
            </div>
          </Alert>

          {!this.state.show && <Button onClick={handleShow}>Show Alert</Button>}
        </>
      );
    }
  }


export default AlertDismissible;

文档将最后一行显示为:

render(<AlertDismissible />);

如果我尝试使用它,则会出现一条错误消息,指出未定义渲染,并且没有导出任何内容。所以 - 我用我的最后一行替换了那一行。

然后,在我的表格中我有:

handleSubmit = (formState, { resetForm }) => {
        // Now, you're getting form state here!
        const payload = {
            ...formState,
            role: formState.role.value,
            createdAt: firebase.firestore.FieldValue.serverTimestamp()
          }
          console.log("formvalues", payload);

        fsDB
          .collection("register")
          .add(payload)
          .then(docRef => {
            resetForm(initialValues);

          })
          .then => {<AlertDismissible />}

          .catch(error => {
            console.error("Error adding document: ", error);
          });
    }

我实际上并不知道如何让警报起作用(上面的 then 语句是一个猜测——我找不到任何例子。这个猜测给出了一个错误:

Parsing error: Unexpected token, expected ";"

我试过添加“;”在每个我能想到的地方放一个,但它总是产生错误。

如果我这样尝试:

.then(<AlertDismissible />)

我没有收到任何错误并且表单已提交,但未显示警报。

有谁知道如何在 handle submit 函数中调用 react-bootstrap 警报?

提交按钮有:

<Button
  variant="outline-primary"
  type="submit"
  style={style3}
  id="submitRegistration"
  onClick={handleSubmit}
  disabled={!dirty || isSubmitting}>
   Register
</Button>

onSubmit 有:

onSubmit={
  this.handleSubmit
}

我的整个表单如下所示:

import React from 'react';
import { Link } from "react-router-dom";
import { Formik, Form, Field, ErrorMessage, withFormik } from "formik";
import * as Yup from "yup";
import Select from "react-select";
import { fsDB, firebase, settings } from "../../firebase";
import Temporarynav from '../navigation/Temporarynav.jsx';
import Demo from '../landing/Demo.jsx';
import Footer from '../footer/Footer.jsx';
import "./preregister/Form.css";
import AlertDismissible from '../auth/preregister/Alert';


import {
    Badge,
    Button,
    Col,
    ComponentClass,
    Feedback,
    FormControl,
    FormGroup,
    Table,
    Row,
    Container
  } from "react-bootstrap";
import Alert from 'react-bootstrap/Alert';

  const style1 = {
    width: "60%",
    margin: "auto"
  };

  const style2 = {
    paddingTop: "2em"
  };

  const style3 = {
    marginRight: "2em"
  };



const initialValues = {
firstName: "",
lastName: "",
email: "",
role: "",
consent: false,
createdAt: ''
}


class PreregForm extends React.Component {

    // constructor(props) {
    //   super(props);

    //   // the flag isFormDone will control where you will show the Alert component
    //   this.state = {
    //     isFormDone: false
    //   };
    // }
    handleSubmit = (formState, { resetForm }) => {
        // Now, you're getting form state here!
        const payload = {
            ...formState,
            role: formState.role.value,
            createdAt: firebase.firestore.FieldValue.serverTimestamp()
          }
          console.log("formvalues", payload);

        fsDB
          .collection("preregistrations")
          .add(payload)
          .then(docRef => {
            resetForm(initialValues);

          })
          .then(() => {
            // Here is where you flag your form completion and allow the alert to be shown.
            // this.setState((prevState) => {...prevState, isFormDone: true});
          .catch(error => {
            console.error("Error adding document: ", error);
          });
    }

    render() {
        const options = [
            { value: "academic", label: "Academic Researcher" },
            { value: "student", label: "Student (inc PhD)" },
        ] 

        // const {isFormDone} = this.state;

        return(
            <Formik
                initialValues={initialValues}
                validationSchema={Yup.object().shape({
                    firstName: Yup.string().required("First Name is required"),
                    lastName: Yup.string().required("Last Name is required"),
                    email: Yup.string()
                        .email("Email is invalid")
                        .required("Email is required"),
                    role: Yup.string().nullable().required(
                        "It will help us get started if we know a little about your background"
                    ),
                    consent: Yup.boolean().oneOf(
                        [true],
                        "You must accept the Terms of Use and Privacy Policy"
                    )
                })}  
                onSubmit={
                  this.handleSubmit
                }
                render={({ 
                    errors, 
                    status, 
                    touched, 
                    setFieldValue,
                    setFieldTouched, 
                    handleSubmit, 
                    isSubmitting, 
                    dirty, 
                    values 
                }) => {

                  return (
                    <div>  
                    <Temporarynav />  
                    <Form style={style1}>
                      <h1 style={style2}>Get Started</h1>
                      <p>
                        We're almost ready to open this up to the research community. By
                        registering now, you'll be first in line when the doors open.
                      </p>
                      <div className="form-group">
                        <label htmlFor="firstName">First Name</label>
                        <Field
                          name="firstName"
                          type="text"
                          className={
                            "form-control" +
                            (errors.firstName && touched.firstName ? " is-invalid" : "")
                          }
                        />
                        <ErrorMessage
                          name="firstName"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="lastName">Last Name</label>
                        <Field
                          name="lastName"
                          type="text"
                          className={
                            "form-control" +
                            (errors.lastName && touched.lastName ? " is-invalid" : "")
                          }
                        />
                        <ErrorMessage
                          name="lastName"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="email">Email</label>
                        <Field
                          name="email"
                          type="text"
                          placeholder="Please use your work email address"
                          className={
                            "form-control" +
                            (errors.email && touched.email ? " is-invalid" : "")
                          }
                        />
                        <ErrorMessage
                          name="email"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="role">
                        Which role best describes yours?
                        </label>

                        <Select
                        key={`my_unique_select_keyrole`}
                        name="role"
                        className={
                            "react-select-container" +
                            (errors.role && touched.role ? " is-invalid" : "")
                        }
                        classNamePrefix="react-select"
                        value={values.role}
                        onChange={selectedOptions => {
                            // Setting field value - name of the field and values chosen.
                            setFieldValue("role", selectedOptions)}
                            }
                        onBlur={setFieldTouched}
                        options={options}
                        />
                        {errors.role && touched.role && 
                        <ErrorMessage
                        name="role"
                        component="div"
                        className="invalid-feedback d-block"
                        />}
                      </div>


                      <div className="form-group">
                        <div className="checkbox-wrapper">
                            <Field
                              name="consent"
                              type="checkbox"
                              checked={values.consent}
                              className={
                                "checkbox" +
                                (errors.consent && touched.consent ? " is-invalid" : "")
                              }
                            />
                        <label htmlFor="consent" className="checkbox_label_wrapper">
                          You must accept the{" "}
                          <Link className="links" to={"/Terms"}>
                            Terms of Use
                          </Link>{" "}
                          and{" "}
                          <Link className="links" to={"/Privacy"}>
                            Privacy Policy
                          </Link>


                        </label>
                        </div>

                        {errors.consent && touched.consent && 
                        <ErrorMessage
                          name="consent"
                          component="div"
                          className="invalid-feedback d-block"
                        />
                        }
                      </div>


                      <div className="form-group">
                        <Button
                          variant="outline-primary"
                          type="submit"
                          style={style3}
                          id="submitRegistration"
                          onClick={handleSubmit}
                          disabled={!dirty || isSubmitting}

                          >
                          Register
                        </Button>
                      </div>
                    </Form>
                    <Demo />
                    <Footer />
                    </div>


                  );
                }
                } 
            /> 
        )    

    }
}            

export default PreregForm;

下一次尝试

当我尝试 Julius 解决方案时,警报出现,但作为表单下方的页脚 - 而不是弹出警报。

最佳答案

使用状态和条件渲染。不是将组件设置状态返回给变量,而是在您的渲染中使用条件渲染来检查值是否为真。

handleSubmit = (formState, { resetForm }) => {
  // Now, you're getting form state here!
  const payload = {
    ...formState,
    role: formState.role.value,
    createdAt: firebase.firestore.FieldValue.serverTimestamp()
  };
  console.log('formvalues', payload);

  fsDB
    .collection('register')
    .add(payload)
    .then(docRef => {
      resetForm(initialValues);
    })
    .then(e => this.setState({ alert: true }))

    .catch(error => {
      console.error('Error adding document: ', error);
    });
};

在你的渲染中

render() {
 ...
  return(
 ....
   {this.state.alert && <AlertDismissible />}
 ...
  )
}

Example Demo

填写表格

import React from 'react';
import { Link } from 'react-router-dom';
import { Formik, Form, Field, ErrorMessage, withFormik } from 'formik';
import * as Yup from 'yup';
import Select from 'react-select';
import { fsDB, firebase, settings } from '../../firebase';
import Temporarynav from '../navigation/Temporarynav.jsx';
import Demo from '../landing/Demo.jsx';
import Footer from '../footer/Footer.jsx';
import './preregister/Form.css';
import AlertDismissible from '../auth/preregister/Alert';

import {
  Badge,
  Button,
  Col,
  ComponentClass,
  Feedback,
  FormControl,
  FormGroup,
  Table,
  Row,
  Container
} from 'react-bootstrap';
import Alert from 'react-bootstrap/Alert';

const style1 = {
  width: '60%',
  margin: 'auto'
};

const style2 = {
  paddingTop: '2em'
};

const style3 = {
  marginRight: '2em'
};

const initialValues = {
  firstName: '',
  lastName: '',
  email: '',
  role: '',
  consent: false,
  createdAt: ''
};

class PreregForm extends React.Component {
  constructor(props) {
    super(props);

    // the flag isFormDone will control where you will show the Alert component
    this.state = {
      showAlert: false
    };
  }
  handleSubmit = (formState, { resetForm }) => {
    // Now, you're getting form state here!
    const payload = {
      ...formState,
      role: formState.role.value,
      createdAt: firebase.firestore.FieldValue.serverTimestamp()
    };
    console.log('formvalues', payload);

    fsDB
      .collection('preregistrations')
      .add(payload)
      .then(docRef => {
        resetForm(initialValues);
      })
      .then(e => this.setState({ showAlert: true }))
      .catch(error => {
        console.error('Error adding document: ', error);
      });
  };

  render() {
    const options = [
      { value: 'academic', label: 'Academic Researcher' },
      { value: 'student', label: 'Student (inc PhD)' }
    ];

    // const {isFormDone} = this.state;

    return (
      <div>
        {!this.state.showAlert ? (
          <div>
            <Formik
              initialValues={initialValues}
              validationSchema={Yup.object().shape({
                firstName: Yup.string().required('First Name is required'),
                lastName: Yup.string().required('Last Name is required'),
                email: Yup.string()
                  .email('Email is invalid')
                  .required('Email is required'),
                role: Yup.string()
                  .nullable()
                  .required(
                    'It will help us get started if we know a little about your background'
                  ),
                consent: Yup.boolean().oneOf(
                  [true],
                  'You must accept the Terms of Use and Privacy Policy'
                )
              })}
              onSubmit={this.handleSubmit}
              render={({
                errors,
                status,
                touched,
                setFieldValue,
                setFieldTouched,
                handleSubmit,
                isSubmitting,
                dirty,
                values
              }) => {
                return (
                  <div>
                    <Temporarynav />
                    <Form style={style1}>
                      <h1 style={style2}>Get Started</h1>
                      <p>
                        We're almost ready to open this up to the research
                        community. By registering now, you'll be first in line
                        when the doors open.
                      </p>
                      <div className="form-group">
                        <label htmlFor="firstName">First Name</label>
                        <Field
                          name="firstName"
                          type="text"
                          className={
                            'form-control' +
                            (errors.firstName && touched.firstName
                              ? ' is-invalid'
                              : '')
                          }
                        />
                        <ErrorMessage
                          name="firstName"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="lastName">Last Name</label>
                        <Field
                          name="lastName"
                          type="text"
                          className={
                            'form-control' +
                            (errors.lastName && touched.lastName
                              ? ' is-invalid'
                              : '')
                          }
                        />
                        <ErrorMessage
                          name="lastName"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="email">Email</label>
                        <Field
                          name="email"
                          type="text"
                          placeholder="Please use your work email address"
                          className={
                            'form-control' +
                            (errors.email && touched.email ? ' is-invalid' : '')
                          }
                        />
                        <ErrorMessage
                          name="email"
                          component="div"
                          className="invalid-feedback"
                        />
                      </div>
                      <div className="form-group">
                        <label htmlFor="role">
                          Which role best describes yours?
                        </label>

                        <Select
                          key={`my_unique_select_keyrole`}
                          name="role"
                          className={
                            'react-select-container' +
                            (errors.role && touched.role ? ' is-invalid' : '')
                          }
                          classNamePrefix="react-select"
                          value={values.role}
                          onChange={selectedOptions => {
                            // Setting field value - name of the field and values chosen.
                            setFieldValue('role', selectedOptions);
                          }}
                          onBlur={setFieldTouched}
                          options={options}
                        />
                        {errors.role && touched.role && (
                          <ErrorMessage
                            name="role"
                            component="div"
                            className="invalid-feedback d-block"
                          />
                        )}
                      </div>

                      <div className="form-group">
                        <div className="checkbox-wrapper">
                          <Field
                            name="consent"
                            type="checkbox"
                            checked={values.consent}
                            className={
                              'checkbox' +
                              (errors.consent && touched.consent
                                ? ' is-invalid'
                                : '')
                            }
                          />
                          <label
                            htmlFor="consent"
                            className="checkbox_label_wrapper"
                          >
                            You must accept the{' '}
                            <Link className="links" to={'/Terms'}>
                              Terms of Use
                            </Link>{' '}
                            and{' '}
                            <Link className="links" to={'/Privacy'}>
                              Privacy Policy
                            </Link>
                          </label>
                        </div>

                        {errors.consent && touched.consent && (
                          <ErrorMessage
                            name="consent"
                            component="div"
                            className="invalid-feedback d-block"
                          />
                        )}
                      </div>

                      <div className="form-group">
                        <Button
                          variant="outline-primary"
                          type="submit"
                          style={style3}
                          id="submitRegistration"
                          onClick={handleSubmit}
                          disabled={!dirty || isSubmitting}
                        >
                          Register
                        </Button>
                      </div>
                    </Form>
                    <Demo />
                    <Footer />
                  </div>
                );
              }}
            />
          </div>
        ) : (
          <AlertDismissible />
        )}
      </div>
    );
  }
}

export default PreregForm;

关于javascript - 在 Formik 中添加 react-bootstrap 警报以处理提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56230323/

有关javascript - 在 Formik 中添加 react-bootstrap 警报以处理提交的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  6. ruby - 如何在 Ruby 中向现有方法定义添加语句 - 2

    我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca

  7. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  10. ruby-on-rails - 在 Ruby on Rails 中添加 boolean 列值 - 2

    我正在开发一个创建网络博客的RubyonRails项目。我希望将一个名为featured的boolean数据库字段添加到Post模型中。该字段应该可以通过我添加的事件管理界面进行编辑。我使用了以下代码,但我什至没有在网站上显示另一列。$railsgeneratemigrationaddFeaturedfeatured:boolean$rakedb:migrate我是RubyonRails的新手,非常感谢任何帮助。我的index.html.erb文件中的相关代码(views):FeaturedPost架构.rb:ActiveRecord::Schema.define(:version=>

随机推荐