ReactJS คือ ตอนที่ 8 : แบบฟอร์ม (Forms) และอินพุต (Inputs)

  1. สรุปย่อเกี่ยวกับ ReactJS
  2. แบบฟอร์ม (Forms) และอินพุต (Inputs) ReactJS: พื้นฐาน
    2.1 ส่วนประกอบที่ควบคุม (Controlled Components)
    2.2 ส่วนประกอบที่ไม่มีการควบคุม (Uncontrolled Components)
  3. การจัดการ Form State ใน React
  4. การจัดการการส่งแบบฟอร์ม (Form Submission)
  5. ตรวจสอบการป้อนข้อมูลในแบบฟอร์ม
    5.1 ไลบรารีแบบฟอร์ม
    5.2 ฟอร์มิก (Formik)
    5.3 แบบฟอร์ม Hook

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

1. สรุปย่อเกี่ยวกับ ReactJS

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

2. แบบฟอร์ม (Forms) และอินพุต (Inputs) ReactJS: พื้นฐาน

ใน HTML แบบดั้งเดิม องค์ประกอบของฟอร์ม เช่น <input>, <textarea>, และ <select> โดยทั่วไปจะรักษาสถานะของตัวเองและอัปเดตตามอินพุตของผู้ใช้ อย่างไรก็ตาม ใน React สถานะที่ไม่แน่นอนนี้มักจะถูกเก็บไว้ในคุณสมบัติสถานะของคอมโพเนนต์ และสามารถอัปเดตได้ผ่าน this.setState(). เราจะเจาะลึกถึงวิธีการที่ React จัดการกับองค์ประกอบของแบบฟอร์มและแนวทางปฏิบัติที่ดีที่สุดที่คุณควรนำมาใช้

2.1 ส่วนประกอบที่ควบคุม (Controlled Components)

ใน React องค์ประกอบรูปแบบเช่น <input>, <textarea> และ<select> โดยปกติจะมีสถานะควบคุมโดยส่วนประกอบ React สิ่งเหล่านี้เรียกว่า “controlled components” ค่าของฟิลด์แบบฟอร์มถูกควบคุมโดยตรงโดยสถานะภายในส่วนประกอบของคุณ

นี่คือตัวอย่างพื้นฐานของส่วนประกอบที่ควบคุมใน React:

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>
    );
  }
}

ReactDOM.render(
  <NameForm />,
  document.getElementById('root')
);

2.2 ส่วนประกอบที่ไม่มีการควบคุม (Uncontrolled Components)

ตรงกันข้ามกับส่วนประกอบที่มีการควบคุม ส่วนประกอบที่ไม่มีการควบคุมจะรักษาสถานะภายในของตนเอง พวกเขาให้ความยืดหยุ่นมากกว่าเล็กน้อยแต่มีความสอดคล้องกันน้อยกว่าในโค้ดของคุณ พวกเขาใช้ ref เพื่อรับค่าแบบฟอร์มจาก DOM แม้ว่าการใช้ส่วนประกอบที่ไม่มีการควบคุมจะไม่เหมือนกัน แต่ก็มีสถานการณ์ที่อาจเป็นประโยชน์

นี่คือตัวอย่างของส่วนประกอบที่ไม่มีการควบคุม:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
  }

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

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

ReactDOM.render(
  <NameForm />,
  document.getElementById('root')
);

3. การจัดการ Form State ใน React

การจัดการสถานะของแบบฟอร์มในแอปพลิเคชัน React เป็นสิ่งสำคัญ วิธีการทั่วไปคือการจัดเก็บ form state ใน local state ของ component และอัพเดททุกการเปลี่ยนแปลงใน input สามารถทำได้โดยใช้ส่วนประกอบควบคุมและ setState ฟังก์ชัน

นี่คือตัวอย่างง่ายๆ ของฟอร์มที่มีอินพุตควบคุมสองอินพุต:

class ReservationForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: '',
      numberOfGuests: ''
    };

    this.handleInputChange = this.handleInputChange.bind(this);
  }

  handleInputChange(event) {
    const target = event.target;
    const value = target.value;
    const name = target.name;

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

  render() {
    return (
      <form>
        <label>
          Name:
          <input
            name="name"
            type="text"
            value={this.state.name}
            onChange={this.handleInputChange} />
        </label>
        <label>
          Number of guests:
          <input
            name="numberOfGuests"
            type="number"
            value={this.state.numberOfGuests}
            onChange={this.handleInputChange} />
        </label>
      </form>
    );
  }
}

ในตัวอย่างนี้ handleInputChange ฟังก์ชันนี้ใช้เพื่ออัปเดตสถานะของช่องฟอร์ม แอตทริบิวต์ name ของแต่ละอินพุตใช้เพื่อระบุสถานะที่จะอัปเดต

4. การจัดการการส่งแบบฟอร์ม (Form Submission)

ใน React องค์ประกอบรูปแบบ HTML จะทำงานแตกต่างจากองค์ประกอบ DOM อื่นๆ เล็กน้อย องค์ประกอบของแบบฟอร์มจะรักษาสถานะภายในไว้ตามธรรมชาติ ใน HTML การส่งแบบฟอร์มมักจะส่งผลให้หน้ารีเฟรช อย่างไรก็ตาม ในแอปพลิเคชัน ReactJS คุณมักจะต้องการให้การส่งแบบฟอร์มได้รับการจัดการโดยฟังก์ชัน JavaScript ที่คุณเขียน หลีกเลี่ยงการรีเฟรชหน้าและควบคุมพฤติกรรมของแบบฟอร์มในการโต้ตอบของผู้ใช้ได้อย่างเต็มที่

ด้านล่างนี้คือตัวอย่างฟอร์มใน React ที่มีตัวจัดการการส่ง:

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>
    );
  }
}

ReactDOM.render(
  <NameForm />,
  document.getElementById('root')
);

ในตัวอย่างนี้ handleSubmit ฟังก์ชันจะป้องกันพฤติกรรมการส่งแบบฟอร์มเริ่มต้นโดยใช้ event.preventDefault() และจัดการการส่งด้วยตนเองแทนด้วยการแจ้งเตือน JavaScript

5. ตรวจสอบการป้อนข้อมูลในแบบฟอร์ม

การตรวจสอบแบบฟอร์มเป็นคุณลักษณะที่สำคัญในการพัฒนาทั้งเว็บและแอป ทำให้มั่นใจได้ว่าข้อมูลที่รวบรวมได้ตรงกับข้อกำหนดที่ตั้งไว้ ใน React คุณสามารถจัดการการตรวจสอบระหว่างการเปลี่ยนแปลงอินพุตหรือขณะส่งแบบฟอร์ม

ต่อไปนี้คือตัวอย่างการตรวจสอบความถูกต้องของช่องป้อนข้อมูลที่ต้องใช้รูปแบบอีเมลระหว่างการเปลี่ยนแปลง:

class EmailForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      email: '',
      error: ''
    };

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

  handleChange(event) {
    const email = event.target.value;
    this.setState({ email });

    if (email.includes('@')) {
      this.setState({ error: '' });
    } else {
      this.setState({ error: 'Please enter a valid email address.' });
    }
  }

  render() {
    return (
      <form>
        <label>
          Email:
          <input type="text" value={this.state.email} onChange={this.handleChange} />
        </label>
        {this.state.error && <p>{this.state.error}</p>}
      </form>
    );
  }
}

ReactDOM.render(
  <EmailForm />,
  document.getElementById('root')
);

ในตัวอย่างข้างต้น handleChange ฟังก์ชันจะตรวจสอบว่าค่าของช่องใส่อีเมลมีอักขระ “@” หรือไม่ หากไม่เป็นเช่นนั้น ระบบจะอัปเดตสถานะข้อผิดพลาดด้วยข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง ข้อความแสดงข้อผิดพลาดจะแสดงด้านล่างช่องป้อนข้อมูลเมื่อใดก็ตามที่สถานะข้อผิดพลาดไม่ว่างเปล่า

5.1 ไลบรารีแบบฟอร์ม

ในขณะที่ตัวอย่างที่ให้ไว้ข้างต้นให้ความเข้าใจพื้นฐานของการจัดการแบบฟอร์มใน React การจัดการแบบฟอร์มที่ซับซ้อนด้วยสถานะที่ซ้อนกันอาจกลายเป็นเรื่องละเอียดและซับซ้อน สำหรับแอปพลิเคชันขนาดใหญ่หรือการจัดการแบบฟอร์มที่ซับซ้อน มีไลบรารีของบุคคลที่สาม เช่น Formik และ React Hook Form ไลบรารีเหล่านี้มีคุณสมบัติขั้นสูง เช่น การตรวจสอบแบบฟอร์ม การจัดการข้อผิดพลาด และการส่งแบบฟอร์ม ด้วย API ที่ง่ายขึ้น

5.2 ฟอร์มิก (Formik)

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

นี่คือตัวอย่างแบบฟอร์มที่ใช้ Formik:

import React from 'react';
import { useFormik } from 'formik';

const SignupForm = () => {
  const formik = useFormik({
    initialValues: {
      email: '',
    },
    onSubmit: values => {
      alert(JSON.stringify(values, null, 2));
    },
  });
  return (
    <form onSubmit={formik.handleSubmit}>
      <label htmlFor="email">Email Address</label>
      <input
        id="email"
        name="email"
        type="email"
        onChange={formik.handleChange}
        value={formik.values.email}
      />
      <button type="submit">Submit</button>
    </form>
  );
};

export default SignupForm;

5.3 แบบฟอร์ม Hook

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

ต่อไปนี้คือวิธีสร้างฟอร์มโดยใช้ React Hook Form:

import React from 'react';
import { useForm } from 'react-hook-form';

function App() {
  const { register, handleSubmit } = useForm();
  const onSubmit = data => alert(JSON.stringify(data));

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input name="firstName" ref={register} placeholder="First name" />
      <input name="lastName" ref={register} placeholder="Last name" />
      <input type="submit" />
    </form>
  );
}

export default App;

ในขณะที่เราทำเว็บ ReactJS และทำแอพการจัดการแบบฟอร์มเป็นทักษะสำคัญที่นักพัฒนาทุกคนต้องเข้าใจ แม้ว่าเรามักจะใช้ไลบรารีของบุคคลที่สามสำหรับสิ่งนี้ แต่การทำความเข้าใจว่า React จัดการกับรูปแบบนอกกรอบนั้นเป็นรากฐานที่สำคัญอย่างไร สอนเราเกี่ยวกับแนวคิดของส่วนประกอบที่มีการควบคุมและไม่มีการควบคุม การจัดการการเปลี่ยนแปลง การจัดการสถานะ และการส่งแบบฟอร์ม

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

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

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

React มีการพัฒนาอย่างต่อเนื่อง และรูปแบบและไลบรารีต่างๆ ที่เกี่ยวข้องกับการจัดการฟอร์มก็เช่นกัน อย่าลืมจับตาดูชุมชน React เพื่อติดตามแนวทางล่าสุดและแนวทางปฏิบัติที่ดีที่สุด ความสามารถในการจัดการแบบฟอร์มอย่างมีประสิทธิภาพเป็นขั้นตอนสำคัญในการทำเว็บ ReactJS และทำแอพช่วยเพิ่มขีดความสามารถของคุณในการสร้างอินเทอร์เฟซแบบไดนามิก โต้ตอบได้ และเป็นมิตรกับผู้ใช้

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


React คืออะไร (ReactJS)

ReactJS คือ ตอนที่ 7 : รายการ (Lists) และคีย์ (Keys)
ReactJS คือ ตอนที่ 9 : ส่วนประกอบขององค์ประกอบ (Component Composition)