แบบฟอร์มตอบโต้
เช่นเดียวกับใน HTML React ใช้แบบฟอร์มเพื่อให้ผู้ใช้สามารถโต้ตอบกับหน้าเว็บได้
การเพิ่มแบบฟอร์มใน React
คุณเพิ่มแบบฟอร์มด้วย React เช่นเดียวกับองค์ประกอบอื่น ๆ :
ตัวอย่าง:
เพิ่มแบบฟอร์มที่อนุญาตให้ผู้ใช้ป้อนชื่อ:
function MyForm() {
return (
<form>
<label>Enter your name:
<input type="text" />
</label>
</form>
)
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
ซึ่งจะทำงานได้ตามปกติ แบบฟอร์มจะส่งและหน้าจะรีเฟรช
แต่นี่ไม่ใช่สิ่งที่เราต้องการให้เกิดขึ้นใน React
เราต้องการป้องกันพฤติกรรมเริ่มต้นนี้และให้ React ควบคุมแบบฟอร์ม
แบบฟอร์มการจัดการ
แบบฟอร์มการจัดการเป็นเรื่องเกี่ยวกับวิธีที่คุณจัดการกับข้อมูลเมื่อมีการเปลี่ยนแปลงค่าหรือถูกส่ง
ใน HTML ข้อมูลแบบฟอร์มมักจะถูกจัดการโดย DOM
ใน React ข้อมูลแบบฟอร์มมักจะถูกจัดการโดยส่วนประกอบ
เมื่อข้อมูลได้รับการจัดการโดยส่วนประกอบ ข้อมูลทั้งหมดจะถูกเก็บไว้ในสถานะส่วนประกอบ
คุณควบคุมการเปลี่ยนแปลงได้โดยเพิ่มตัวจัดการเหตุการณ์ใน
onChange
แอตทริบิวต์
เราสามารถใช้useState
Hook เพื่อติดตามค่าอินพุตแต่ละรายการและให้ "แหล่งความจริงเดียว" สำหรับแอปพลิเคชันทั้งหมด
ดูส่วนReact Hooksสำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Hooks
ตัวอย่าง:
ใช้onChange
Hook เพื่อจัดการอินพุต:
import { useState } from "react";
import ReactDOM from 'react-dom';
function MyForm() {
const [name, setName] = useState("");
return (
<form>
<label>Enter your name:
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</label>
</form>
)
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
ส่งแบบฟอร์ม
คุณสามารถควบคุมการส่งโดยเพิ่มตัวจัดการเหตุการณ์ในonSubmit
แอตทริบิวต์สำหรับ<form>
:
ตัวอย่าง:
เพิ่มปุ่มส่งและตัวจัดการเหตุการณ์ในonSubmit
แอตทริบิวต์:
import { useState } from "react";
import ReactDOM from 'react-dom';
function MyForm() {
const [name, setName] = useState("");
const handleSubmit = (event) => {
event.preventDefault();
alert(`The name you entered was: ${name}`)
}
return (
<form onSubmit={handleSubmit}>
<label>Enter your name:
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
</label>
<input type="submit" />
</form>
)
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
ช่องใส่หลายช่อง
คุณสามารถควบคุมค่าของช่องใส่ข้อมูลมากกว่าหนึ่งช่องโดยเพิ่ม
name
แอตทริบิวต์ให้กับแต่ละองค์ประกอบ
เราจะเริ่มต้นสถานะของเราด้วยวัตถุว่างเปล่า
ในการเข้าถึงฟิลด์ในตัวจัดการเหตุการณ์ ให้ใช้
ไวยากรณ์event.target.name
และ
event.target.value
หากต้องการอัพเดตสถานะ ให้ใช้วงเล็บเหลี่ยม [bracket notation] รอบชื่อคุณสมบัติ
ตัวอย่าง:
เขียนแบบฟอร์มที่มีช่องป้อนข้อมูลสองช่อง:
import { useState } from "react";
import ReactDOM from "react-dom";
function MyForm() {
const [inputs, setInputs] = useState({});
const handleChange = (event) => {
const name = event.target.name;
const value = event.target.value;
setInputs(values => ({...values, [name]: value}))
}
const handleSubmit = (event) => {
event.preventDefault();
alert(inputs);
}
return (
<form onSubmit={handleSubmit}>
<label>Enter your name:
<input
type="text"
name="username"
value={inputs.username || ""}
onChange={handleChange}
/>
</label>
<label>Enter your age:
<input
type="number"
name="age"
value={inputs.age || ""}
onChange={handleChange}
/>
</label>
<input type="submit" />
</form>
)
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
หมายเหตุ:เราใช้ฟังก์ชันตัวจัดการเหตุการณ์เดียวกันสำหรับช่องป้อนข้อมูลทั้งสองช่อง เราสามารถเขียนตัวจัดการเหตุการณ์ได้หนึ่งตัวสำหรับแต่ละช่อง แต่สิ่งนี้ช่วยให้โค้ดสะอาดขึ้นและเป็นวิธีที่แนะนำใน React
Textarea
องค์ประกอบ textarea ใน React นั้นแตกต่างจาก HTML ทั่วไปเล็กน้อย
ใน HTML ค่าของ textarea คือข้อความระหว่างแท็กเริ่มต้นและแท็
ก<textarea>
สิ้นสุด</textarea>
<textarea>
Content of the textarea.
</textarea>
ใน React ค่าของ textarea จะถูกวางไว้ใน value แอตทริบิวต์ เราจะใช้useState
Hook เพื่อจัดการค่าของ textarea:
ตัวอย่าง:
textarea ง่าย ๆ ที่มีเนื้อหาบางส่วน:
import { useState } from "react";
import ReactDOM from "react-dom";
function MyForm() {
const [textarea, setTextarea] = useState(
"The content of a textarea goes in the value attribute"
);
const handleChange = (event) => {
setTextarea(event.target.value)
}
return (
<form>
<textarea value={textarea} onChange={handleChange} />
</form>
)
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
เลือก
รายการดรอปดาวน์หรือกล่องเลือกใน React นั้นแตกต่างจาก HTML เล็กน้อย
ใน HTML ค่าที่เลือกในรายการแบบหล่นลงถูกกำหนดด้วยselected
แอตทริบิวต์:
HTML:
<select>
<option value="Ford">Ford</option>
<option value="Volvo" selected>Volvo</option>
<option value="Fiat">Fiat</option>
</select>
ใน React ค่าที่เลือกถูกกำหนดด้วยvalue
แอตทริบิวต์บนselect
แท็ก:
ตัวอย่าง:
กล่องเลือกอย่างง่ายซึ่งค่าที่เลือก "Volvo" ถูกเตรียมใช้งานในตัวสร้าง:
function MyForm() {
const [myCar, setMyCar] = useState("Volvo");
const handleChange = (event) => {
setMyCar(event.target.value)
}
return (
<form>
<select value={myCar} onChange={handleChange}>
<option value="Ford">Ford</option>
<option value="Volvo">Volvo</option>
<option value="Fiat">Fiat</option>
</select>
</form>
)
}
ด้วยการเปลี่ยนแปลงเล็กน้อยเหล่านี้<textarea>
และ<select>
React สามารถจัดการองค์ประกอบอินพุตทั้งหมดได้ในลักษณะเดียวกัน