首页 > 解决方案 > 从反应js中的表单获取数据

问题描述

我开发了一个应用程序,用户可以在主表单标签内添加动态字段,这样他们就可以添加任意数量的字段。现在我有 2 个按钮:
Entire Form SubmitDynamic form Submit
单击第一个我得到整个数据表单,但是当我单击第二个时,我也得到相同的数据,但我只想从中获取数据<DynamicFormComponent/>。单击我想进入的第二个按钮,我将获得的数据:

 const onFinishDynamic = values => {
    console.log("Received values of dynamic form:", values);
  };

现在,代码如下所示:

//Main form
const MainForm = () => {
  const onFinish = values => {
    console.log("Success:", values);
  };

  const onFinishFailed = errorInfo => {
    console.log("Failed:", errorInfo);
  };

  return (
    <Form
      {...layout}
      name="basic"
      initialValues={{ remember: true }}
      onFinish={onFinish}
      onFinishFailed={onFinishFailed}
    >
      <Form.Item
        label="Username"
        name="username"
        rules={[{ required: true, message: "Please input your username!" }]}
      >
        <Input />
      </Form.Item>

      <Form.Item
        label="Password"
        name="password"
        rules={[{ required: true, message: "Please input your password!" }]}
      >
        <Input.Password />
      </Form.Item>

      <Form.Item>
        <DynamicForm />
      </Form.Item>

      <Form.Item {...tailLayout}>
        <Button type="primary" htmlType="submit">
          Entire Form Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

//Dynamic Form
const DynamicForm = () => {
  const onFinishDynamic = values => {
    console.log("Received values of dynamic form:", values);
  };

  return (
    <div>
      <Form.List name="users">
        {(fields, { add, remove }) => {
          return (
            <div>
              {fields.map(field => (
                <Space
                  key={field.key}
                  style={{ display: "flex", marginBottom: 8 }}
                  align="start"
                >
                  <Form.Item
                    {...field}
                    name={[field.name, "first"]}
                    fieldKey={[field.fieldKey, "first"]}
                    rules={[{ required: true, message: "Missing first name" }]}
                  >
                    <Input placeholder="First Name" />
                  </Form.Item>
                  <Form.Item
                    {...field}
                    name={[field.name, "last"]}
                    fieldKey={[field.fieldKey, "last"]}
                    rules={[{ required: true, message: "Missing last name" }]}
                  >
                    <Input placeholder="Last Name" />
                  </Form.Item>

                  <MinusCircleOutlined
                    onClick={() => {
                      remove(field.name);
                    }}
                  />
                </Space>
              ))}

              <Form.Item>
                <Button
                  type="dashed"
                  onClick={() => {
                    add();
                  }}
                  block
                >
                  <PlusOutlined /> Add field
                </Button>
              </Form.Item>
            </div>
          );
        }}
      </Form.List>

      <Form.Item>
        <Button type="primary" htmlType="submit">
          Dynamic form Submit
        </Button>
      </Form.Item>
    </div>
  );
};
演示:https ://codesandbox.io/s/billowing-silence-mub60?file=/DynamicForm.js:235-2132

问题:如何点击以上2个按钮获得不同的数据?

标签: javascriptreactjs

解决方案


您可以获取值,但在挂钩中。我已经修改了您的组件,并且您使用反应的基本原理在 DynamicForm 上获得了更新的值。

您的MainForm.js看起来像

 import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Form, Input, Button } from "antd";
import DynamicForm from "./DynamicForm";

const layout = {
  labelCol: { span: 8 },
  wrapperCol: { span: 16 }
};
const tailLayout = {
  wrapperCol: { offset: 8, span: 16 }
};

const MainForm = () => {
  const [val, setVal] = React.useState({});
  const onFinish = values => {
    console.log("Success:", values);
    setVal(values.users);
  };

  const onFinishFailed = errorInfo => {
    console.log("Failed:", errorInfo);
  };

  return (
    <Form
      {...layout}
      name="basic"
      initialValues={{ remember: true }}
      onFinish={onFinish}
      onFinishFailed={onFinishFailed}
    >
      <Form.Item
        label="Username"
        name="username"
        rules={[{ required: true, message: "Please input your username!" }]}
      >
        <Input />
      </Form.Item>

      <Form.Item
        label="Password"
        name="password"
        rules={[{ required: true, message: "Please input your password!" }]}
      >
        <Input.Password />
      </Form.Item>

      <Form.Item>
        <DynamicForm abc={val}/>
      </Form.Item>

      <Form.Item {...tailLayout}>
        <Button type="primary" htmlType="submit">
          Entire Form Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

ReactDOM.render(<MainForm />, document.getElementById("container"));

您的dynamicForm.js如下所示:

import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Form, Input, Button, Space } from "antd";
import { MinusCircleOutlined, PlusOutlined } from "@ant-design/icons";

const DynamicForm = (props) => {

  React.useEffect(()=>{
    console.log('Received values:-', props.abc)
  },[props.abc])


  return (
    <div>
      <Form.List name="users">
        {(fields, { add, remove }) => {
          return (
            <div>
              {fields.map(field => (
                <Space
                  key={field.key}
                  style={{ display: "flex", marginBottom: 8 }}
                  align="start"
                >
                  <Form.Item
                    {...field}
                    name={[field.name, "first"]}
                    fieldKey={[field.fieldKey, "first"]}
                    rules={[{ required: true, message: "Missing first name" }]}
                  >
                    <Input placeholder="First Name" />
                  </Form.Item>
                  <Form.Item
                    {...field}
                    name={[field.name, "last"]}
                    fieldKey={[field.fieldKey, "last"]}
                    rules={[{ required: true, message: "Missing last name" }]}
                  >
                    <Input placeholder="Last Name" />
                  </Form.Item>

                  <MinusCircleOutlined
                    onClick={() => {
                      remove(field.name);
                    }}
                  />
                </Space>
              ))}

              <Form.Item>
                <Button
                  type="dashed"
                  onClick={() => {
                    add();
                  }}
                  block
                >
                  <PlusOutlined /> Add field
                </Button>
              </Form.Item>
            </div>
          );
        }}
      </Form.List>

      <Form.Item>
        <Button type="primary" htmlType="submit">
          Dynamic form Submit
        </Button>
      </Form.Item>
    </div>
  );
};

export default DynamicForm;

推荐阅读