反应-有条件不在表单提交中发送数据密钥

时间:2019-02-21 17:41:44

标签: javascript reactjs

如果要选择一个复选框,我试图省略值onSubmit,从而不需要特定的标签/输入。如果我选中indefinite runTime框,则不再需要在有效负载中发送runTimeSeconds键,这是在handleSubmit方法本身中完成的吗?

提交表单后,选中此复选框,它仍在发送runTimeSeconds键,并且仍以默认状态值发送。

这是一个复制问题的沙盒:https://codesandbox.io/s/5vvpj40rqk

import React from "react";
import ReactDOM from "react-dom";

import "./styles.css";

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

    this.state = {
      windowLengthSeconds: 1,
      runTimeSeconds: 1,
      indefiniteCheckbox: false
    };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange = e => {
    this.setState({ [e.target.name]: e.target.value });
    this.props.handleChange(e);
    console.log([e.target.value]);
    const value =
      e.target.type === "checkbox" ? e.target.checked : e.target.value;

    this.setState({
      [e.target.name]: value
    });
  };

  render() {
    const { indefiniteCheckbox } = this.state;
    return (
      <div className="params-boxes">
        <div className="checkbox">
          <label>Indefinite runTime:</label>
          <input
            type="checkbox"
            name="indefiniteCheckbox"
            value={this.state.indefiniteCheckbox}
            onChange={this.handleChange}
          />
        </div>
        {!indefiniteCheckbox && (
          <div>
            <label>runTimeSeconds:</label>
            <input
              type="number"
              name="runTimeSeconds"
              value={this.state.runTimeSeconds}
              onChange={this.handleChange}
              placeholder="1"
              min="1"
              required
            />
          </div>
        )}
        <div>
          <label>windowLengthSeconds:</label>
          <input
            type="number"
            name="windowLengthSeconds"
            value={this.state.windowLengthSeconds}
            onChange={this.handleChange}
            placeholder="1"
            min="1"
            step="1"
            required
          />
        </div>
      </div>
    );
  }
}

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

    this.state = {
      runtimeSeconds: 1,
      windowLengthSeconds: 1,
      indefiniteCheckbox: false
    };
  }

  handleChange = ({ target: { name, value } }) => {
    this.setState({ [name]: value });
    console.log([name, value]);
  };

  handleSubmit = e => {
    e.preventDefault();
    data: JSON.stringify({
      parameters: {
        "stream.runtime.seconds": this.state.runTimeSeconds,
        "stream.window.length.seconds": this.state.windowLengthSeconds
      }
    });
    console.log(this.state);
  };

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <div>
          <div>
            <fieldset>
              <legend>Parameters</legend>
              <div>
                <Params handleChange={this.handleChange} />
              </div>
            </fieldset>
          </div>
        </div>
        <div className="btn-group">
          <span className="input-group-btn">
            <button
              className="btnSubmit"
              handleSubmit={this.handleSubmit}
              type="submit"
            >
              Submit
            </button>
            <button
              className="btnReset"
              handleCancel={this.handleCancel}
              type="reset"
              onClick={() => {
                alert(
                  "Are you sure you want to cancel? Doing so will reset this page."
                );
              }}
            >
              Cancel
            </button>
          </span>
        </div>
      </form>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

1 个答案:

答案 0 :(得分:1)

您有2个选择。

如果使用三元条件选中了复选框,则可以将数据变量设置为undefined。在其他情况下,将发送输入中给出的时间:

handleSubmit = e => {
    e.preventDefault();
    const data = JSON.stringify({
        parameters: {
            "stream.runtime.seconds": !this.state.indefiniteCheckbox ? this.state.runTimeSeconds : undefined,
            "stream.window.length.seconds": this.state.windowLengthSeconds
        }
    });
};

或者您可以在单独的变量中创建有效负载,并在条件匹配时从中删除所需的值:

handleSubmit = e => {
    e.preventDefault();
    const parameters = {
        "stream.runtime.seconds": this.state.runTimeSeconds,
        "stream.window.length.seconds": this.state.windowLengthSeconds
    }
    if (!this.state.indefiniteCheckbox) delete parameters['stream.runtime.seconds']

    const data = JSON.stringify({ parameters });
};