ค้นหาเว็บไซต์

javascript - คำถามสำหรับผู้เรียน: ฟังก์ชันสำหรับทุกช่องข้อความ มีวิธีใดที่จะสร้างฟังก์ชันสากลที่สามารถจัดการหลายช่องข้อความได้หรือไม่


โครงการของผมอยู่ใน SPFX, React/TypeScript/Office UI Fabric ผมพบว่าผมกำลังสร้างฟังก์ชันสำหรับทุกช่องข้อความในฟอร์มที่ผมกำลังสร้าง มีฟังก์ชันที่สามารถจัดการหลายช่องที่คล้ายกันได้หรือไม่ แต่ละช่องข้อความมีสถานะเฉพาะของตัวเอง

ฟังก์ชันช่องข้อความตัวอย่าง:

private _onReason = (ev: React.FormEvent<HTMLInputElement>, newValue?: string) => {
    this.setState({
      Reason: newValue
    });
  }

และอีกอันหนึ่งที่เกือบเหมือนกัน:

private _onPurpose = (ev: React.FormEvent<HTMLInputElement>, newValue?: string) => {
    this.setState({
      Purpose: newValue
    });
  }

เป้าหมายของฉันคืออนุญาตให้ผู้ใช้ส่งสถานะของช่องข้อความหลายช่องเหล่านี้ แต่เพียงลดปริมาณโค้ดลง

ฉันได้อ่านสิ่งนี้แล้วแต่ไม่รู้ว่าจะนำไปใช้ในโปรเจกต์ของฉันอย่างไร: https://www.pluralsight.com/guides/handling-multiple-inputs-with-single-onchange-handler-react

ผมคิดว่าสิ่งหนึ่งที่ขัดขวางไม่ให้ผมใช้โซลูชันของ Pluralsight คือความจริงที่ว่าผมกำลังใช้ MS Fabric UI และ React.FormEvent<HTMLInputElement>, NewValue?: string) ไม่เป็นที่ชอบของฟังก์ชันตัวจัดการที่ผมพยายามด้านล่างนี้:

public handleChange (evt: React.FormEvent<HTMLInputElement>, newValue?: string) {
    const value = evt.target.value;
    this.setState({
      ...this.state,
      [evt.target.name]: value
    });
  }

มันไม่ชอบค่าที่อยู่ท้ายของ const value... มันก็ไม่ชอบชื่อที่ท้ายของ [evt.target.name] ด้วยเช่นกัน

อัปเดต: หลังจากลองทำตามคำแนะนำจากลิงก์ของ Peter ฉันสามารถแก้ไขข้อผิดพลาดหนึ่งข้อจากด้านบนได้แล้ว (ข้อผิดพลาดเรื่องค่า) แต่ยังคงขึ้นข้อผิดพลาดสำหรับ [evt.target.name] (ชื่อแบบเจาะจง)

คำตอบ #1

คำถามของคุณเข้าใจง่ายและกระชับมาก ผมยังชอบลิงก์ที่คุณให้เกี่ยวกับบริบทบางอย่างของปัญหาของคุณด้วย ผมใช้ React hooks และวิธีที่ง่ายที่สุดที่ผมพบเพื่อทำให้โค้ดสั้นลงคือการใช้ฟังก์ชันนิรนามในแอตทริบิวต์ของ JSX เช่นนี้:

<label>
  First name
  <input
    type="text"
    onChange={(e) => {setFirstName(e.target.value)}}
  />
</label>
<p> {firstName} </p>

อย่างไรก็ตาม มันจะดูแตกต่างเล็กน้อยเพราะฉันไม่ได้ถนัดกับ TypeScript มาก ดังนั้นคุณจำเป็นต้องกำหนดประเภทให้กับ e(event) และ firstName(string) และคุณไม่ได้ใช้ React hooks สำหรับคุณ คุณจะต้องแยกวัตถุ state ของคุณออกมา และคุณจะมีไวยากรณ์มากขึ้นเพราะคุณมี state ที่ใหญ่ขึ้นและมีหลายวัตถุ หวังว่านี่จะช่วยได้นะ!