在反应中将下拉框重置为原始值

Resetting dropdown box to original value in react

你好,我正在使用 React 并且对它还很陌生,我正在努力在用户提交运动员(点击创建记录按钮后)后将字段值重置为原始状态,我想要下拉菜单如果用户将字段更改为其他内容,则将文本框 return 更改为“其他”。例如。 名字:“约翰”, 姓氏:“史密斯”, 运动:“男子高尔夫”将重置为

名字:“”, 姓: ””, 运动:“其他” 我已经设法重置了所有其他字段,但运动下拉字段没有重置,我不知道为什么。这是我正在使用的代码。

import React from "react";
import "./athleteEntryStyle.css";
import { baseUrl } from "../../serviceConfig";

interface Props {
  username?: string;
  password?: string;
  dominant_foot?: string;
  preferred_name?: string;
  position?: string;
  firstName: string;
  middleName: string;
  lastName: string;
  phone: string;
  email: string;
  dateOfBirth: string;
  sport: string;
}

interface State {
  username?: string;
  password?: string;
  dominant_foot?: string;
  preferred_name?: string;
  position?: string;
  firstName: string;
  middleName: string;
  lastName: string;
  phone: string;
  email: string;
  dateOfBirth: string;
  sport: string;
}

export class AthleteEntry extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      username: props.username,
      password: props.password,
      dominant_foot: props.dominant_foot,
      preferred_name: props.preferred_name,
      position: props.position,
      firstName: props.firstName,
      middleName: props.middleName,
      lastName: props.lastName,
      phone: props.phone,
      email: props.email,
      dateOfBirth: props.dateOfBirth,
      sport: props.sport,
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event: { target: any }) {
    const target = event.target;
    const value = target.value;
    const name = target.name;
    console.log(target);
    console.log(value);
    console.log(name);
    const newState = { [name]: value } as Pick<Props, keyof State>;
    this.setState(newState);
    
  }

  handleSubmit(event: { preventDefault: () => void }) {
    const request = JSON.stringify({
      username: this.state.username,
      email: this.state.email,
      password: this.state.password,
      first_name: this.state.firstName,
      middle_name: this.state.middleName,
      last_name: this.state.lastName,
      phone_number: this.state.phone?.toString(),
      dominant_foot: this.state.dominant_foot,
      sport: this.state.sport,
      position: this.state.position,
      preferred_name: this.state.preferred_name,
      date_of_birth: new Date(this.state.dateOfBirth).toISOString(),
    });

    console.log("Request from app");
    console.log(request);

    const requestOptions = {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: request,
    };
    this.setState({firstName: "", middleName: "", lastName: "", preferred_name: "", dateOfBirth: "date", phone: "", email: "", 
    username: "", password: "", dominant_foot: "", sport: "Other", position: "" });
    //NOTE: This is assuming your service instance is running locally, we have to either make a config file that allows you to switch this as necessary or
    //switch this to the hosted service when that becomes a thing
    fetch(baseUrl + "athlete/create", requestOptions).then(function (response) {
      if (response.status == 201) {
        alert("An athlete was successfully created.");
      } else {
        alert(
          "Error creating athlete: API responded with code " +
            response.status.toString()
        );
      }
    });
    event.preventDefault();

  }

  render() {
    return (
      <form
        className="form"
        onSubmit={this.handleSubmit}
        style={{
          display: "flex",
          padding: "20px",
          height: "100vh",
          background: "linear-gradient(#fff, #d00000)",
        }}
      >
        <div>
          <div style={styles}>
            <label className="label">First Name:</label>
            <input
              name="firstName"
              className="input"
              type="text"
              value={this.state.firstName}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Middle Name:</label>
            <input
              name="middleName"
              className="input"
              type="text"
              value={this.state.middleName}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Last Name:</label>
            <input
              name="lastName"
              className="input"
              type="text"
              value={this.state.lastName}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Preferred Name:</label>
            <input
              name="preferred_name"
              className="input"
              type="text"
              value={this.state.preferred_name}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Date of Birth:</label>
            <input
              name="dateOfBirth"
              className="input"
              type="date"
              value={this.state.dateOfBirth}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Phone Number:</label>
            <input
              name="phone"
              className="input"
              type="text"
              value={this.state.phone}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Email:</label>
            <input
              name="email"
              className="input"
              type="text"
              value={this.state.email}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Username:</label>
            <input
              name="username"
              className="input"
              type="text"
              value={this.state.username}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Password:</label>
            <input
              name="password"
              className="input"
              type="password"
              value={this.state.password}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Dominant Foot:</label>
            <input
              name="dominant_foot"
              className="input"
              type="text"
              value={this.state.dominant_foot}
              onChange={this.handleChange}
            />
          </div>
          <div style={styles}>
            <label className="label">Sport:</label>
            {/* <input
              name="sport"
              className="input"
              type="text"
              value={this.state.sport}
              onChange={this.handleChange}
            /> */}
            <select
              name="sport"
              className="input"
              id="sport"
              defaultValue="Other"
              onChange={this.handleChange}
            >
              <option value="Football (MFB)">Football (MFB)</option>
              <option value="Baseball (MBA)">Baseball (MBA)</option>
              <option value="Softball (WSB)">Softball (WSB)</option>
              <option value="Men's Basketball (MBB)">
                Men's Basketball (MBB)
              </option>
              <option value="Women's Basketball (WBB)">
                Women's Basketball (WBB)
              </option>
              <option value="Men's Cross Country (MCC)">
                Men's Cross Country (MCC)
              </option>
              <option value="Women's Cross Country (WCC)">
                Women's Cross Country (WCC)
              </option>
              <option value="Men's Golf (MGO)">Men's Golf (MGO)</option>
              <option value="Women's Golf (WGO)">Women's Golf (WGO)</option>
              <option value="Women's Soccer (WSO)">Women's Soccer (WSO)</option>
              <option value="Women's Volleyball (WVB)">
                Women's Volleyball (WVB)
              </option>
              <option value="Women’s Bowling (WBW)">
                Women’s Bowling (WBW)
              </option>
              <option value="Men’s Gymnastics (MGY)">
                Men’s Gymnastics (MGY)
              </option>
              <option value="Women’s Gymnastics (WGY)">
                Women’s Gymnastics (WGY)
              </option>
              <option value="Women’s Swimming/Diving (WSW)">
                Women’s Swimming/Diving (WSW)
              </option>
              <option value="Men’s Tennis (MTE)">Men’s Tennis (MTE)</option>
              <option value="Women’s Tennis (WTE)">Women’s Tennis (WTE)</option>
              <option value="Men’s Wrestling (MWR)">
                Men’s Wrestling (MWR)
              </option>
              <option value="Women’s Rifle (WRI)">Women’s Rifle (WRI)</option>
              <option value="Women’s Track (WTO)">Women’s Track (WTO)</option>
              <option value="Men’s Track (MTO)">Men’s Track (MTO)</option>
              <option value="Other">Other</option>
            </select>
          </div>
          <div style={styles}>
            <label className="label">Position:</label>
            <input
              name="position"
              className="input"
              type="text"
              value={this.state.position}
              onChange={this.handleChange}
            />
          </div>
          <div style={{ marginBottom: 12, padding: 10 }}>
            <label>
              <input type="submit" value="Create Record" className="button"/>
            </label>
          </div>
        </div>
      </form>
    );
  }
}
const styles = {
  marginBottom: 12,
};

上面的大部分代码对您来说都无关紧要,除了进行更改的行。所以

this.setState({firstName: "", middleName: "", lastName: "", preferred_name: "", dateOfBirth: "date", phone: "", email: "", 
    username: "", password: "", dominant_foot: "", sport: "Other", position: "" });

是进行更改的地方。

看起来你的 select 组件中有 defaultValue="Other" 作为道具,但你真正想要的是 value={this.state.sport},就像你在注释掉的 input 中一样它上面。这将使它成为受控组件,因此 select 字段的值将基于您的状态。其他字段都是这样完成的,看起来可能只是一个疏忽。