React: การจัดการ state
คอมโพเนนต์ React ทุกตัวสามารถมี state
(สถานะ) ของตัวเองได้
state
หมายถึงอะไร? state
คือชุดข้อมูลที่จัดการโดย คอมโพเนนต์
ให้ลองนึกถึง form
ดู ว่าแต่ละองค์ประกอบ input
ของ form
แต่ละตัวนั้นมีหน้าที่รับผิดชอบในการจัดการstate
สิ่งที่ผู้ใช้งานเขียนอยู่ข้างในนั้น
และ button
(ปุ่ม) มีหน้าที่รับผิดชอบในการรับทราบว่ามีการคลิกหรือเปล่าอะไรแบบนี้
ส่วนเองก็ลิงก์มีหน้าที่รับผิดชอบว่าและตรวจสอบว่าเมาส์วางอยู่บนลิงก์นั้นๆหรือเปล่า
ใน React หรือในเฟรมเวิร์ก/ไลบรารี ที่ใช้คอมโพเนนต์อื่นๆ แอปพลิเคชันทั้งหมดของเราจะอิงและใช้งาน state
คอมโพเนนต์ โดยส่วนใหญ่
เราสามารถจัดการstate
ทั่วไปได้โดยใช้ useState
ที่ React
มอบให้มาได้ แต่ในทางเทคนิคแล้วมันคือ hook
(คุณไม่จำเป็นต้องรู้รายละเอียดของhook
ในตอนนี้เท่าไหร่หรอก คิดซะว่ามีมันอยู่ก็พอ)
คุณสามารถ import useState
จาก React
ด้วยวิธีนี้:
import { useState } from "react";
เมื่อเรียก useState()
สิ่งที่คุณจะได้รับกลับมาก็คือ
- ตัวแปร
state
ใหม่ - และฟังก์ชันที่เราสามารถเรียกใช้เพื่อเปลี่ยนค่าของมันได้
useState()
ต้องมีการใส่ค่าเริ่มต้นใส่ให้มันไว้ใน ()
จากนั้นมันจะส่งค่ากลับไปที่ออกไปสองตัวก็คือค่าที่เราใส่ไว้กับฟังก์ชันที่ใช้ในการเปลี่ยนแปลงค่าของมัน
นี่คือตัวอย่างวิธีใช้ useState():
const [count, setCount] = useState(0);
สิ่งนี้สำคัญ: เราไม่สามารถเปลี่ยนค่าของตัวแปรstate
ได้โดยตรง จากการทำ count++
หรือ count = count + 1
เราต้องเรียกใช้ฟังก์ชันที่ใช้ในการแก้ไขข้อมูลของมันนั่นก็คือ setCount()
เท่านั้น
ไม่อย่างนั้น คอมโพเนนต์ React จะไม่อัปเดต UI การเรียกฟังก์ชันนั้นจะเป็นการบอก React ว่าstate
ของคอมโพเนนต์นี้มีการเปลี่ยนแปลงนะ
แต่ไวยากรณ์ค่อนข้างแปลกใช่ไหม? เนื่องจาก useState()
ส่งคืนอาร์เรย์กลับมา ใช้อาร์เรย์ในการรับเพื่อเข้าถึงแต่ละรายการ เช่นนี้:
const [count, setCount] = useState(0)
นี่เป็นตัวอย่างโดยรวม:
import { useState } from "react";
const Counter = () => {
const [count, setCount] = useState(0);
return (
<div>
<p>คลิกไป {count} ครั้ง</p>
<button onClick={() => setCount(count + 1)}>คลิกที่นี่</button>
</div>
);
};
คุณสามารถสร้างหรือใช้ useState()
ได้มากเท่าที่คุณต้องการได้เลย เพื่อสร้างตัวแปรstate
ได้มากเท่าที่คุณต้องการ ซึ่งสามารถเก็บค่าใดๆก็ได้ ไม่จำเป็นจะต้องเป็นแค่ตัวเลข (รวมถึงอ็อบเจ็คและอาร์เรย์ด้วย):
const [count, setCount] = useState(0);
const [name, setName] = useState("John");
const [fruits, setFruits] = useState(["Apple", "Banana", "Orange"]);
const [persons, setPersons] = useState([
{ name: "Samai", score: 10 },
{ name: "Danai", score: 8 },
{ name: "Saman", score: 7 },
]);