รับข้อมูลฟอร์มใน ReactJS


199

ฉันมีรูปแบบที่เรียบง่ายในrenderฟังก์ชั่นของฉันเช่น:

render : function() {
      return (
        <form>
          <input type="text" name="email" placeholder="Email" />
          <input type="password" name="password" placeholder="Password" />
          <button type="button" onClick={this.handleLogin}>Login</button>
        </form>
      );
    },
handleLogin: function() {
   //How to access email and password here ?
}

ฉันควรเขียนสิ่งใดในhandleLogin: function() { ... }การเข้าถึงEmailและPasswordฟิลด์


11
@ssorallen นี่มันไร้สาระอะไร? ผู้ถามอาจสร้าง SPA และอาจไม่ต้องการให้ส่งแบบฟอร์ม HTML ปกติ หากพวกเขาต้องการสิ่งนี้พวกเขาจะกำหนดการกระทำและลบตัวจัดการเหตุการณ์
developerbmw

6
หมายเหตุ: คุณควรจัดการonSubmitกับฟอร์มแทนการคลิกปุ่ม - ด้วยวิธีนี้คุณจะจัดการกับผู้ใช้ที่ส่งแบบฟอร์มโดยการกด Enter
developerbmw

10
<form>มี<button>หรือ<input>ที่มีtype=submitจะได้รับการส่งเมื่อผู้ใช้กดใส่ในใด ๆ <input type=text>ของรูปแบบ หากคุณพึ่งพาonClickปุ่มเพียงปุ่มเดียวผู้ใช้จะต้องคลิกปุ่มหรือโฟกัสมันแล้วกด Enter / Spacebar การใช้onSubmitจะทำให้ทั้งสองกรณีใช้งาน เมื่อฟอร์มไม่สนับสนุน Enter เพื่อส่งพวกเขาจะรู้สึกเสีย
Ross Allen

คำตอบ:


166

ใช้changeเหตุการณ์บนอินพุตเพื่ออัพเดตสถานะของคอมโพเนนต์และเข้าถึงในhandleLogin:

handleEmailChange: function(e) {
   this.setState({email: e.target.value});
},
handlePasswordChange: function(e) {
   this.setState({password: e.target.value});
},
render : function() {
      return (
        <form>
          <input type="text" name="email" placeholder="Email" value={this.state.email} onChange={this.handleEmailChange} />
          <input type="password" name="password" placeholder="Password" value={this.state.password} onChange={this.handlePasswordChange}/>
          <button type="button" onClick={this.handleLogin}>Login</button>
        </form>);
},
handleLogin: function() {
    console.log("EMail: " + this.state.email);
    console.log("Password: " + this.state.password);
}

การทำงานซอ

นอกจากนี้อ่านเอกสารที่มีทั้งส่วนที่ทุ่มเทให้กับการจัดการแบบฟอร์ม : แบบฟอร์ม

ก่อนหน้านี้คุณสามารถใช้ Databinding helper mixin แบบสองทางของ React เพื่อให้ได้สิ่งเดียวกัน แต่ตอนนี้เลิกใช้แล้วเพื่อกำหนดค่าและเปลี่ยนตัวจัดการ (ดังที่กล่าวข้างต้น):

var ExampleForm = React.createClass({
  mixins: [React.addons.LinkedStateMixin],
  getInitialState: function() {
    return {email: '', password: ''};
  },
  handleLogin: function() {
    console.log("EMail: " + this.state.email);
    console.log("Password: " + this.state.password);
  },
  render: function() {
    return (
      <form>
        <input type="text" valueLink={this.linkState('email')} />
        <input type="password" valueLink={this.linkState('password')} />
        <button type="button" onClick={this.handleLogin}>Login</button>
      </form>
    );
  }
});

เอกสารที่นี่: สองทางผูกผู้ช่วย


3
หากต้องการเลียนแบบฟังก์ชันการทำงานอย่างถูกต้องvalueLinkตัวอย่างแรกของคุณควรตั้งค่าvalueองค์ประกอบสัญญาณเข้า หากไม่มีอย่างนั้นค่าจะเป็น"ไม่ควบคุม"ในเงื่อนไขการตอบกลับ <input ... value={this.state.password}>.
Ross Allen

10
นอกจากนี้คุณยังสามารถใช้ onSubmit พร้อมกับแบบฟอร์มแทน onClick ด้วยปุ่ม
sai

59
เหตุใดจึงใช้สถานะสำหรับแต่ละองค์ประกอบของฟอร์ม ใครอื่นคิดว่านี่เป็นรูปแบบที่ไม่ดี?
eveevans

6
ดูเหมือนว่าค่า valueLink ถูกคัดค้าน
Matt Broekhuis

3
นี่ไม่ใช่การจัดเก็บรหัสผ่านเป็นข้อความที่ชัดเจนทางฝั่งไคลเอ็นต์ตลอดเวลาหรือไม่ ดูเหมือนจะไม่เหมาะสมสำหรับเขตข้อมูลรหัสผ่าน
NewbiZ

166

มีสองสามวิธีในการทำสิ่งนี้:

1) รับค่าจากอาร์เรย์ขององค์ประกอบแบบฟอร์มตามดัชนี

handleSubmit = (event) => {
  event.preventDefault();
  console.log(event.target[0].value)
}

2) การใช้คุณสมบัติชื่อใน html

handleSubmit = (event) => {
  event.preventDefault();
  console.log(event.target.elements.username.value) // from elements property
  console.log(event.target.username.value)          // or directly
}

<input type="text" name="username"/>

3) ใช้การอ้างอิง

handleSubmit = (event) => {
  console.log(this.inputNode.value)
}

<input type="text" name="username" ref={node => (this.inputNode = node)}/>

ตัวอย่างเต็ม

class NameForm extends React.Component {
  handleSubmit = (event) => {
    event.preventDefault()
    console.log(event.target[0].value)
    console.log(event.target.elements.username.value)
    console.log(event.target.username.value)
    console.log(this.inputNode.value)
  }
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input
            type="text"
            name="username"
            ref={node => (this.inputNode = node)}
          />
        </label>
        <button type="submit">Submit</button>
      </form>
    )
  }
}

1
นี่คือคำตอบที่ยอดเยี่ยม ขอบคุณที่ทำรายการนี้ได้หลายวิธี
Beau Smith

ตัวเลือก2ไม่ทำงานสำหรับฉัน ไม่มีคุณสมบัติ "องค์ประกอบ" หรือ "ชื่อผู้ใช้" แม้ว่าชื่ออินพุตของฉันคือ "ชื่อผู้ใช้"
Madacol

@Madacol สิ่งนี้อาจเกิดขึ้นได้คือคุณมีอินพุตบางตัวที่มีชื่อเดียวกัน
Aliaksandr Sushkevich

45

วิธีทางเลือกคือการใช้แอตทริบิวต์และการอ้างอิงค่าด้วยref this.refsนี่คือตัวอย่างง่ายๆ:

render: function() {
    return (<form onSubmit={this.submitForm}>
        <input ref="theInput" />
    </form>);
},
submitForm: function(e) {
    e.preventDefault();
    alert(React.findDOMNode(this.refs.theInput).value);
}

ข้อมูลเพิ่มเติมสามารถพบได้ในเอกสารตอบโต้: https://facebook.github.io/react/docs/more-about-refs.html#the-ref-string-attribute

ด้วยเหตุผลหลายประการที่อธิบายไว้ในฉันจะใช้ปุ่มตัวเลือกในการตอบสนองได้อย่างไร? วิธีนี้ไม่ใช่วิธีที่ดีที่สุดเสมอไป แต่เป็นวิธีที่มีประโยชน์ในบางกรณี


1
วิธีแก้ปัญหานี้ดีกว่าจริงๆและไม่มีให้บริการในเวลาที่ถามหรือเป็นวิธีที่ "น่าเกลียด"
Wagner Leonardi

4
จริงๆแล้วคุณไม่จำเป็นต้อง React.findDOMNode this.refs.theInput โหนด html อยู่แล้ว
Fareed Alnamrouti

23

วิธีง่ายๆในการจัดการกับผู้อ้างอิง:

class UserInfo extends React.Component {

  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(e) {
    e.preventDefault();
    
    const formData = {};
    for (const field in this.refs) {
      formData[field] = this.refs[field].value;
    }
    console.log('-->', formData);
  }

  render() {
    return (
        <div>
          <form onSubmit={this.handleSubmit}>
            <input ref="phone" className="phone" type='tel' name="phone"/>
            <input ref="email" className="email" type='tel' name="email"/>
            <input type="submit" value="Submit"/>
          </form>
        </div>
    );
  }
}

export default UserInfo;


2
วิธีนี้จะถูกยกเลิกในอนาคต การอ้างอิงจะใช้กับการเรียกกลับเท่านั้นและไม่ใช้สตริง สำหรับรายละเอียดเพิ่มเติม: facebook.github.io/react/docs/refs-and-the-dom.html
David Labbe

เย็น! :) ฉันชอบที่จะใช้Object.keys()ตามmap()เช่นนี้:Object.keys(this.refs).map(field => formData[field] = this.refs[field].value)
ฟรานซิส Rodrigues

ใช่การอ้างอิงสตริงเลิกใช้แล้ว วิธีที่ดีกว่าที่จะทำตอนนี้คือการใช้การโทรกลับ onChange หากคุณยังต้องการใช้ผู้อ้างอิงคุณสามารถใช้ synctax นี้:<input type="text" ref={(input) => { this.textInput = input; }} />
E. Fortes

I @ E.Fortes คุณช่วยอธิบายวิธีการโทรกลับ onChange ได้ไหม? ขอบคุณมากถ้าคุณจะ โปรดติดแท็กฉันเพื่อฉันจะได้รับคำตอบของคุณ
Simona Adriani

วิธีง่ายๆคือ (ขออภัยที่ตัวจัดรูปแบบโค้ดไม่ทำงาน): คลาส NameForm ขยาย React.Component {ตัวสร้าง (อุปกรณ์ประกอบฉาก) {super (อุปกรณ์ประกอบฉาก); this.state = {value: ''}; this.handleChange = this.handleChange.bind (นี่); } handleChange (เหตุการณ์) {this.setState ({value: event.target.value}); } render () {return (<form> <label> ชื่อ: <input type = "text" value = {this.state.value} onChange = {this.handleChange} /> </label> </form>); }}
E. Fortes

22

การเพิ่มคำตอบของ Michael Schock:

class MyForm extends React.Component {
  constructor() {
    super();
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(event) {
    event.preventDefault();
    const data = new FormData(event.target);

    console.log(data.get('email')); // reference by form input's `name` tag

    fetch('/api/form-submit-url', {
      method: 'POST',
      body: data,
    });
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label htmlFor="username">Enter username</label>
        <input id="username" name="username" type="text" />

        <label htmlFor="email">Enter your email</label>
        <input id="email" name="email" type="email" />

        <label htmlFor="birthdate">Enter your birth date</label>
        <input id="birthdate" name="birthdate" type="text" />

        <button>Send data!</button>
      </form>
    );
  }
}

ดูบทความขนาดกลางนี้: วิธีจัดการแบบฟอร์มด้วยเพียงแค่ตอบสนอง

วิธีนี้รับข้อมูลฟอร์มเมื่อกดปุ่มส่งเท่านั้น IMO สะอาดมาก!


คำตอบที่สมบูรณ์แบบ 👌
มิคาล

16

คุณสามารถสลับonClickตัวจัดการเหตุการณ์บนปุ่มเป็นonSubmitตัวจัดการบนแบบฟอร์ม:

render : function() {
      return (
        <form onSubmit={this.handleLogin}>
          <input type="text" name="email" placeholder="Email" />
          <input type="password" name="password" placeholder="Password" />
          <button type="submit">Login</button>
        </form>
      );
    },

จากนั้นคุณสามารถใช้FormDataการแยกแบบฟอร์ม (และสร้างวัตถุ JSON จากรายการของมันถ้าคุณต้องการ)

handleLogin: function(e) {
   const formData = new FormData(e.target)
   const user = {}

   e.preventDefault()

   for (let entry of formData.entries()) {
       user[entry[0]] = entry[1]
   }

   // Do what you will with the user object here
}

เรียกใช้สิ่งนี้พร้อม 'console.log (ผู้ใช้);' ให้วัตถุที่ไม่มีค่าใช้งาน! ความคิดเห็นใด?
. เมื่อ

@MahdiRafatjah ¯ \ _ (ツ) _ / ¯ - มันทำงานได้ในซอนี้: jsfiddle.net/mschock/exvko2Lf
Michael Schock

เพื่อนของฉันเรียกฉันไปตอบสนองเอกสารและพวกเขาจะทำเช่นนี้reactjs.org/docs/forms.html#controlled-components
เอ็ม

1
ดีที่ดูเหมือนจะสะอาดกว่ามาก =)
Michael Schock

13

ฉันขอแนะนำวิธีต่อไปนี้:

import {Autobind} from 'es-decorators';

export class Form extends Component {

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

    @Autobind
    add(e) {
        e.preventDefault();
        this.collection.add(this.state);
        this.refs.form.reset();
    }

    shouldComponentUpdate() {
        return false;
    }

    render() {
        return (
            <form onSubmit={this.add} ref="form">
                <input type="text" name="desination" onChange={this.handleChange}/>
                <input type="date" name="startDate" onChange={this.handleChange}/>
                <input type="date" name="endDate" onChange={this.handleChange}/>
                <textarea name="description" onChange={this.handleChange}/>
                <button type="submit">Add</button>
            </form>
        )
    }

}

หากคุณไม่ได้แสดงส่วนประกอบซ้ำอีกครั้งคุณจะกำหนดค่าของแต่ละองค์ประกอบตามสถานะปัจจุบันได้อย่างไร เช่น "value = {this.state. ปลายทาง}" นอกจากนี้คุณไม่สามารถเรียกใช้การตรวจสอบการตอบสนองในแบบฟอร์มหากคุณไม่ได้แสดงซ้ำ
Avishay28

13

หากอินพุต / ข้อความของคุณทั้งหมดมีชื่อคุณสามารถกรองทั้งหมดจาก event.target:

onSubmit(event){
  const fields = Array.prototype.slice.call(event.target)
      .filter(el => el.name)
      .reduce((form, el) => ({
        ...form,
        [el.name]: el.value,
      }), {})
}

แบบฟอร์มที่ไม่สามารถควบคุมได้ทั้งหมด😊โดยไม่มีวิธีการเปลี่ยนค่าเริ่มต้นมูลค่า ...


12

สำหรับผู้ที่ไม่ต้องการใช้ ref และรีเซ็ตสถานะด้วยOnChangeเหตุการณ์คุณสามารถใช้การจัดการ OnSubmit แบบธรรมดาและวนลูปผ่านFormDataวัตถุ ตัวอย่างนี้ใช้ React Hooks:

const LoginPage = () =>{
    const handleSubmit = (event) => {
        const formData = new FormData(event.target);
        event.preventDefault();
        for (var [key, value] of formData.entries()) {
            console.log(key, value);
        }
    }

    return (
        <div>
        <form onSubmit={
        handleSubmit
        }

        >
        <input type="text" name="username" placeholder="Email" />
        <input type="password" name="password"
        placeholder="Password" />
        <button type="submit">Login</button>
        </form>
        </div>)
        }

คำตอบที่ดี แต่ nitpick คุณสามารถลบ var โซลูชั่นที่สมบูรณ์แบบเป็นอย่างอื่น!
Louis345

5

นอกจากนี้ยังสามารถใช้งานได้เช่นกัน

handleChange: function(state,e) {
  this.setState({[state]: e.target.value});
},
render : function() {
  return (
    <form>
      <input type="text" name="email" placeholder="Email" value={this.state.email} onChange={this.handleChange.bind(this, 'email')} />
      <input type="password" name="password" placeholder="Password" value={this.state.password} onChange={this.handleChange.bind(this, 'password')}/>
      <button type="button" onClick={this.handleLogin}>Login</button>
    </form>
  );
},
handleLogin: function() {
  console.log("EMail: ", this.state.email);
  console.log("Password: ", this.state.password);
}

4
โปรดระบุคำอธิบายว่าทำไมคำตอบนี้จึงเป็นวิธีที่ถูกต้อง
ทิมฮัทชิสัน

1
ฉันใช้วิธีเดียวเท่านั้นในการเปลี่ยนรูปแบบข้อความ
Yurii Kosygin

รหัสผ่านสามารถเห็นได้ในเครื่องมือตอบสนอง dev, บิตของปัญหาด้านความปลอดภัยหรือไม่?
Neil

5

ให้อินพุตของคุณอ้างอิงเช่นนี้

<input type="text" name="email" placeholder="Email" ref="email" />
<input type="password" name="password" placeholder="Password" ref="password" />

จากนั้นคุณสามารถเข้าถึงได้ใน handleLogin เช่น soo

handleLogin: function(e) {
   e.preventDefault();
    console.log(this.refs.email.value)
    console.log(this.refs.password.value)
}

5

ตัวอย่างที่ชัดเจนยิ่งขึ้นด้วยการทำลายล้าง es6

class Form extends Component {
    constructor(props) {
        super(props);
        this.state = {
            login: null,
            password: null,
            email: null
        }
    }

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

    onSubmit(e) {
        e.preventDefault();
        let login = this.state.login;
        let password = this.state.password;
        // etc
    }

    render() {
        return (
            <form onSubmit={this.onSubmit.bind(this)}>
                <input type="text" name="login" onChange={this.onChange.bind(this)} />
                <input type="password" name="password" onChange={this.onChange.bind(this)} />
                <input type="email" name="email" onChange={this.onChange.bind(this)} />
                <button type="submit">Sign Up</button>
            </form>
        );
    }
}

4

หากคุณกำลังใช้ Redux ในโครงการของคุณคุณสามารถพิจารณาใช้นี้องค์ประกอบที่สูงขึ้นเพื่อhttps://github.com/erikras/redux-form


4

ในหลาย ๆ เหตุการณ์ในจาวาสคริปต์เรามีeventสิ่งที่ให้วัตถุรวมถึงเหตุการณ์ที่เกิดขึ้นและสิ่งที่เป็นค่า ฯลฯ ...

นั่นคือสิ่งที่เราใช้กับแบบฟอร์มใน ReactJs เช่นกัน ...

ดังนั้นในรหัสของคุณคุณตั้งค่าสถานะเป็นค่าใหม่ ... ดังนี้:

class UserInfo extends React.Component {

  constructor(props) {
    super(props);
    this.handleLogin = this.handleLogin.bind(this);
  }

  handleLogin(e) {
    e.preventDefault();
    for (const field in this.refs) {
      this.setState({this.refs[field]: this.refs[field].value});
    }
  }

  render() {
    return (
        <div>
          <form onSubmit={this.handleLogin}>
            <input ref="email" type="text" name="email" placeholder="Email" />
            <input ref="password" type="password" name="password" placeholder="Password" />
            <button type="button">Login</button>
          </form>
        </div>
    );
  }
}

export default UserInfo;

และนี่คือตัวอย่างแบบฟอร์มใน React v.16 เช่นเดียวกับการอ้างอิงสำหรับแบบฟอร์มที่คุณสร้างในอนาคต:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

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

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

4

ฉันใช้สิ่งนี้โดยใช้สถานะการทำปฏิกิริยาส่วนประกอบ:

<input type="text" name='value' value={this.state.value} onChange={(e) => this.handleChange(e)} />

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

3
 onChange(event){
     console.log(event.target.value);
  }
  handleSubmit(event){ 
    event.preventDefault();
    const formData = {};
      for (const data in this.refs) {
        formData[data] = this.refs[data].value;
      }
    console.log(formData);
  }



 <form onSubmit={this.handleSubmit.bind(this)}>
  <input type="text" ref="username" onChange={this.onChange} className="form-control"/>
  <input type="text" ref="password" onChange={this.onChange} className="form-control"/>
  <button type="submit" className="btn-danger btn-sm">Search</button>
 </form>

แนบรูปภาพผลลัพธ์ที่นี่


กรุณาให้คำอธิบายเช่นกัน
BlackBeard

2
ฉันจะพยายามอธิบายสิ่งนี้ซึ่งฉันพบว่ายอดเยี่ยม ในฟังก์ชัน handleSubmit () คุณกำลังสร้างออบเจ็กต์ (formData) ซึ่งคีย์คือแอตทริบิวต์ 'ref' ของทุกอินพุตในรูปแบบ (คำสั่ง 'formData [data]') และค่าคือค่าของอินพุต ด้วยแอตทริบิวต์ 'ref' นี้ (คำสั่ง 'this.refs [data] .value') ด้วย 'formData [data] = this.refs [data] .value' คุณกำลังสร้างวัตถุนี้ คุณกำลังพูดตามตัวอักษร: formData ['ชื่อผู้ใช้'] = (ค่าของชื่อผู้ใช้) และ formData ['รหัสผ่าน'] = (ค่าของรหัสผ่านที่ป้อนเข้า) ผลลัพธ์จะเป็น: {ผู้ใช้: 'blablabla' รหัสผ่าน: 'xxx '}
Simona Adriani

ขอบคุณ @SimonaAdriani สำหรับคำอธิบายของคุณ
มิลาน Panigrahi

2

สิ่งนี้อาจช่วยให้ผู้ใช้ Meteor (v1.3):

render: function() {
    return (
        <form onSubmit={this.submitForm.bind(this)}>
            <input type="text" ref="email" placeholder="Email" />
            <input type="password" ref="password" placeholder="Password" />
            <button type="submit">Login</button>
        </form>
    );
},
submitForm: function(e) {
    e.preventDefault();
    console.log( this.refs.email.value );
    console.log( this.refs.password.value );
}

1
this.submitForm.bind (นี่) ควรเป็นเพียง: this.submitForm
rekarnar

ข้อผิดพลาด: ส่วนประกอบของฟังก์ชันไร้สัญชาติไม่สามารถอ้างอิงได้
holms

คุณใช้ Meteor (v1.3) หรือไม่
Joe L.

1

เพื่อปรับปรุงประสบการณ์ผู้ใช้ เมื่อผู้ใช้คลิกที่ปุ่มส่งคุณสามารถลองรับแบบฟอร์มเพื่อแสดงข้อความที่ส่งก่อน เมื่อเราได้รับการตอบกลับจากเซิร์ฟเวอร์แล้วก็สามารถอัพเดตข้อความตามนั้นได้ เราบรรลุสิ่งนี้ในการตอบโต้โดยการผูกมัดสถานะ ดูcodepenหรือตัวอย่างด้านล่าง:

วิธีการต่อไปนี้ทำให้การเปลี่ยนแปลงสถานะแรก:

handleSubmit(e) {
    e.preventDefault();
    this.setState({ message: 'Sending...' }, this.sendFormData);
}

ทันทีที่ React แสดงข้อความการส่งข้างต้นบนหน้าจอมันจะเรียกวิธีการที่จะส่งข้อมูลแบบฟอร์มไปยังเซิร์ฟเวอร์: this.sendFormData () เพื่อความง่ายฉันได้เพิ่ม setTimeout เพื่อเลียนแบบสิ่งนี้

sendFormData() {
  var formData = {
      Title: this.refs.Title.value,
      Author: this.refs.Author.value,
      Genre: this.refs.Genre.value,
      YearReleased: this.refs.YearReleased.value};
  setTimeout(() => { 
    console.log(formData);
    this.setState({ message: 'data sent!' });
  }, 3000);
}

ใน React เมธอด this.setState () จะแสดงส่วนประกอบด้วยคุณสมบัติใหม่ ดังนั้นคุณสามารถเพิ่มตรรกะบางอย่างในวิธีการแสดงผล () ขององค์ประกอบรูปแบบที่จะทำงานแตกต่างกันไปขึ้นอยู่กับประเภทของการตอบสนองที่เราได้รับจากเซิร์ฟเวอร์ ตัวอย่างเช่น

render() {
  if (this.state.responseType) {
      var classString = 'alert alert-' + this.state.type;
      var status = <div id="status" className={classString} ref="status">
                     {this.state.message}
                   </div>;
  }
return ( ...

codepen


1

หากคุณมีชื่อองค์ประกอบหลายครั้งคุณต้องใช้ forEach ()

HTML

  <input type="checkbox" name="delete" id="flizzit" />
  <input type="checkbox" name="delete" id="floo" />
  <input type="checkbox" name="delete" id="flum" />
  <input type="submit" value="Save"  onClick={evt => saveAction(evt)}></input>

js

const submitAction = (evt) => {
  evt.preventDefault();
  const dels = evt.target.parentElement.delete;
  const deleted = [];
  dels.forEach((d) => { if (d.checked) deleted.push(d.id); });
  window.alert(deleted.length);
};

โปรดสังเกตว่า dels ในกรณีนี้คือ RadioNodeList ไม่ใช่อาร์เรย์และไม่ใช่ Iterable forEach () เป็นวิธีการในตัวของรายการระดับ คุณจะไม่สามารถใช้แผนที่ () หรือลด () ที่นี่


1

อัปเดต: ตอนนี้คุณสามารถใช้ Formik แพ็คเกจภายนอกเพื่อตอบสนองที่ทำให้การจัดการกับฟอร์มง่ายมาก!

นี่คือลิงค์สำหรับเริ่มต้น

https://jaredpalmer.com/formik

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.