首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有值的行的重复函数

具有值的行的重复函数
EN

Stack Overflow用户
提问于 2019-10-28 15:43:13
回答 1查看 1K关注 0票数 0

我在我的应用程序中重新创建了这个模块。我在用AntDesign。但是我希望有一个重复的函数,并得到已经被填充的值。

这是我的代码,但它不能运行链接

代码语言:javascript
复制
import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import "./index.css";
import { Form, Input, Icon, Button } from "antd";

let id = 0;

class DynamicFieldSet extends React.Component {
  remove = k => {
    const { form } = this.props;
    // can use data-binding to get
    const keys = form.getFieldValue("keys");
    // We need at least one passenger
    if (keys.length === 1) {
      return;
    }

    // can use data-binding to set
    form.setFieldsValue({
      keys: keys.filter(key => key !== k)
    });
  };

  add = () => {
    const { form } = this.props;
    // can use data-binding to get
    const keys = form.getFieldValue("keys");
    const nextKeys = keys.concat(id++);
    // can use data-binding to set
    // important! notify form to detect changes
    form.setFieldsValue({
      keys: nextKeys
    });
  };

  duplicate = k => {
    const { form } = this.props;
    const keys = form.getFieldValue("keys");
    form.setFieldsValue({
      keys: keys.find(key => key === k)
    });
  };

  handleSubmit = e => {
    e.preventDefault();
    this.props.form.validateFields((err, values) => {
      if (!err) {
        const { keys, names } = values;
        console.log("Received values of form: ", values);
        console.log("Merged values:", keys.map(key => names[key]));
      }
    });
  };

  render() {
    const { getFieldDecorator, getFieldValue } = this.props.form;
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 4 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 20 }
      }
    };
    const formItemLayoutWithOutLabel = {
      wrapperCol: {
        xs: { span: 24, offset: 0 },
        sm: { span: 20, offset: 4 }
      }
    };
    getFieldDecorator("keys", { initialValue: [] });
    const keys = getFieldValue("keys");
    const formItems = keys.map((k, index) => (
      <Form.Item
        {...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
        label={index === 0 ? "Passengers" : ""}
        required={false}
        key={k}
      >
        {getFieldDecorator(`names[${k}]`, {
          validateTrigger: ["onChange", "onBlur"],
          rules: [
            {
              required: true,
              whitespace: true,
              message: "Please input passenger's name or delete this field."
            }
          ]
        })(
          <Input
            placeholder="passenger name"
            style={{ width: "60%", marginRight: 8 }}
          />
        )}
        {keys.length > 1 ? (
          <div>
            <Icon
              className="dynamic-delete-button"
              type="minus-circle-o"
              onClick={() => this.remove(k)}
            />
            <Icon
              className="dynamic-delete-button"
              type="copy"
              onClick={() => this.duplicate(k)}
            />
          </div>
        ) : null}
      </Form.Item>
    ));
    return (
      <Form onSubmit={this.handleSubmit}>
        {formItems}
        <Form.Item {...formItemLayoutWithOutLabel}>
          <Button type="dashed" onClick={this.add} style={{ width: "60%" }}>
            <Icon type="plus" /> Add field
          </Button>
        </Form.Item>
        <Form.Item {...formItemLayoutWithOutLabel}>
          <Button type="primary" htmlType="submit">
            Submit
          </Button>
        </Form.Item>
      </Form>
    );
  }
}

const WrappedDynamicFieldSet = Form.create({ name: "dynamic_form_item" })(
  DynamicFieldSet
);
ReactDOM.render(
  <WrappedDynamicFieldSet />,
  document.getElementById("container")
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-28 16:27:10

在您的复制方法中,您将得到被单击的字段的keyindex。表单值中的keys数组跟踪您所拥有的字段数及其索引。表单值中的names数组跟踪每个字段的值。在重复的方法中,您需要通过向add one field数组添加keys,然后通过添加到names数组来设置该字段的值。见以下方法:

注意:add方法中使用keys.length而不是id来增加。这将始终保持所有键的唯一性。

代码语言:javascript
复制
add = () => {
    const { form } = this.props
    // can use data-binding to get
    const keys = form.getFieldValue("keys")
    const nextKeys = keys.concat(keys.length)
    // can use data-binding to set
    // important! notify form to detect changes
    form.setFieldsValue({
        keys: nextKeys
    })
}

duplicate = k => {
    const { form } = this.props

    // We are using keys to track number of fields
    // and using names to track the value of each field
    const { keys, names } = form.getFieldsValue()

    // We can use the key to access the value of the field for
    // for which the button was clicked
    const nameToDuplicate = names[k]

    /**
     * Add a key to 'keys' array in antd form to render extra field
     * Once the field is rendered we can add the name to the
     * 'names' array of antd form.
     *
     * Note: We add keys first and then add name in callback method because
     * we cannot set a value for a form field before rendering it.
     */
    const newKeys = [...keys, keys.length]

    form.setFieldsValue({ keys: newKeys }, () => {
        const newNames = [...names, nameToDuplicate]
        form.setFieldsValue({ names: newNames })
    })
}

沙箱连接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58594004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档