简体   繁体   English

当按钮在 ReactJs 中提交外部标签 formik 时如何提交 Formik?

[英]How to submit Formik when button submit outside tag formik in ReactJs?

在此处输入图像描述

I have a component composition as above, the box with brown color is the parent and has a blue child box as the formix container and the right side with the green color is the container where the button is placed.我有一个如上的组件组成,棕色的框是父框,蓝色的子框作为formix容器,右侧的绿色是放置按钮的容器。 is it possible to submit a form with a button outside the formix tag?是否可以在表单标签之外提交带有按钮的表单? I read the documentation but still not found the solution.我阅读了文档,但仍然没有找到解决方案。

you can handle it using the Formik tag innerRef reference.您可以使用Formik标记innerRef参考来处理它。 I added a working demo pls find here .我添加了一个工作演示,请在此处找到。

import React, { useRef } from "react";
import { render } from "react-dom";
import { Formik } from "formik";
import * as Yup from "yup";
import "./helper.css";

const App = () => {
  const formRef = useRef();

  const handleSubmit = () => {
    if (formRef.current) {
      formRef.current.handleSubmit();
    }
  };

  return (
    <div className="app">
      <Formik
        innerRef={formRef}
        initialValues={{ email: "" }}
        onSubmit={async (values) => {
          await new Promise((resolve) => setTimeout(resolve, 500));
          alert(JSON.stringify(values, null, 2));
        }}
        validationSchema={Yup.object().shape({
          email: Yup.string().email().required("Required")
        })}
      >
        {(props) => {
          const {
            values,
            touched,
            errors,
            handleChange,
            handleBlur,
            handleSubmit
          } = props;
          return (
            <form onSubmit={handleSubmit}>
              <label htmlFor="email" style={{ display: "block" }}>
                Email
              </label>
              <input
                id="email"
                placeholder="Enter your email"
                type="text"
                value={values.email}
                onChange={handleChange}
                onBlur={handleBlur}
                className={
                  errors.email && touched.email
                    ? "text-input error"
                    : "text-input"
                }
              />
              {errors.email && touched.email && (
                <div className="input-feedback">{errors.email}</div>
              )}
            </form>
          );
        }}
      </Formik>
      <button type="submit" onClick={handleSubmit}>
        Submit
      </button>
    </div>
  );
};

render(<App />, document.getElementById("root"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM