เขียน React และ API ทำเว็บสำหรับ CRUD ข้อมูล (2022 Updated for new MUI and react-router-dom@6)

บทความนี้จะเป็นพื้นฐานในการสร้างหน้า Web โดยใช้ React เพื่อทำการ CRUD ข้อมูล ซึ่งประกอบไปด้วย Create (สร้าง), Read (อ่าน), Update (แก้ไข) และ Delete (ลบ) ข้อมูล ผ่านการเรียกใช้ API ตัวจำลอง ที่ให้บริการอยู่บนเว็บ MeCallAPI.com (เว็บผมเองครับ 5555) ซึ่งเป็นการปรับปรุงเนื้อหาให้ล่าสุดจากบทความที่ผ่านมาของผมที่ link นี้นะครับ อัพเดท version ของ MUI ที่ปรับเยอะพอสมควร และ version ใหม่ของ react-router-dom@6 ครับ

สามารถดู clip แบบ Live Code ครับ

ถ้าอยากลองใช้ API สำหรับจำลองการทำ CRUD หรือ Authentication ก็เข้าไปดูรายละเอียดได้ที่ MeCallAPI.com เลยครับ

ส่วนผลลัพธ์ของบทความนี้ มีตัวอย่างให้ลองทดสอบได้ที่ https://www.mecallapi.com/crud/

Software Installation

เริ่มต้นเขียน React

สร้างโปรเจค

npx create-react-app react-crud
cd react-crud

ติดตั้ง package เพิ่มเติม

  • MUI (Material UI) สำหรับใช้แสดงส่วนประกอบต่าง ๆ บนหน้าจอ (เช่น กล่องข้อความ ปุ่ม เป็นต้น)
  • react-router-dom@6 สำหรับจัดการ Route หรือเส้นทางภายใน app ของเรา
npm install @mui/material @emotion/react @emotion/styled 
npm install @mui/icons-material
npm install react-router-dom@6

รัน app ได้เลย

npm start

เข้า URL http://localhost:3000 ด้วย web browser เห็นผลลัพธ์ดังภาพ

สร้างหน้า Read User และ Delete User

แก้ไขไฟล์ index.js โดยใส่ BrowserRouter เพื่อเริ่มใช้ react-router-dom@6 ในการจัดการ path ต่าง ๆ ในเว็บ

แก้ไขไฟล์ App.js โดยใส่ component Navbar และ Users ที่จะสร้างต่อจากนี้

สร้างไฟล์ Navbar.js สำหรับเป็น Component ส่วนของแถบด้านบน โดยใช้ Material UI App bar

สร้างไฟล์ Users.js สำหรับเป็น Component ส่วนของหน้าแสดงรายการ User โดยในหน้านี้ Code จะค่อนข้างเยอะนะครับ เพราะต้องการความสวยงามของ Material UI นิดนึงครับ 555

หน้านี้จะใช้ API สำหรับข้อมูลรายการ User ตามด้านล่าง (Read)
API URL: https://www.mecallapi.com/api/users
Method: GET

และ API สำหรับการลบข้อมูล (Delete) *API นี้ลบได้เฉพาะข้อมูลที่สร้างใหม่เท่านั้น
API URL: https://www.mecallapi.com/api/users/delete
Method: DELETE
ตัวอย่าง Body (JSON):

{
"id": 11
}

อธิบาย Code ซักหน่อยนะครับ 555

  • กำหนด State (บรรทัดที่ 18) ชื่อว่า users และฟังก์ชัน setUsers สำหรับแก้ไขค่า users
  • กำหนดฟังก์ชัน useEffect (บรรทัดที่ 18–21) เป็นวิธีการของ React ที่เรียกว่า Effect Hook สำหรับการให้เรียกฟังก์ชัน useEffect หลังจากมีการโหลดหน้าเว็บขึ้นมา และในทุกครั้งที่มีการอัพเดทของค่าของ State ตัวใดก็ตาม เพื่อให้ข้อมูลที่แสดงอยู่บนหน้าเว็บมีการเปลี่ยนแปลงอยาก dynamic (ไม่ต้อง refresh หน้าใหม่)
  • กำหนดฟังก์ชัน UsersGet (บรรทัดที่ 23–31) เพื่อเรียก API เส้น https://www.mecallapi.com/api/users เพื่อนำค่าที่เป็นรายการของ users มาเก็บอยู่ใน State users
  • บรรทัดที่ 37–58 เป็นส่วนของการเรียก API เส้นที่ใช้สำหรับลบ user
  • บรรทัดที่ 90–108 เป็นการนำ State users มาแสดงทีละรายการเป็นแถวในตารางโดยการใช้ loop (map)

ผลลัพธ์ที่ได้จะเป็นหน้ารายการ User ดังภาพ

สร้างหน้าสำหรับ Create User

สร้างไฟล์ UserCreate.js เพื่อเป็น Component สำหรับหน้าสร้างข้อมูล User

แก้ไขไฟล์ App.js โดยใส่ Router จาก react-router-dom@6 เข้าไป และจัดการแยก Route สำหรับหน้า Users และ UserCreate

ทดสอบหน้าสร้างข้อมูล

สร้างหน้าสำหรับ Update User

สร้างไฟล์ UserUpdate.js เพื่อเป็น Component สำหรับหน้าแก้ไขข้อมูล User โดย code จะแทบเหมือนกับหน้า Create User มีแก้ API จากเส้น create เป็น update

API สำหรับการแก้ไขข้อมูล User (Update)
API URL: https://www.mecallapi.com/api/users/update
Method: PUT
ตัวอย่าง Body (JSON):

{
"id": 11,
"fname": "Cat",
"lname": "Gato",
"username": "cat.gato@mecallapi.com",
"email": "cat.gato@mecallapi.com",
"avatar": "https://www.mecallapi.com/users/cat.png"
}

และ API สำหรับการเรียกดูข้อมูล User โดยอ้างอิงจาก id (Read)
API URL: https://www.mecallapi.com/api/users/1
Method: GET
*เลขที่อยู่ท้าย URL จะใช้เป็น id ในการอ้างอิงเพื่อแสดงข้อมูล User

  • กำหนดฟังก์ชัน useEffect (บรรทัดที่ 11–23) เพื่อให้หลังจากมีการโหลดหน้าเว็บขึ้นมา และในทุกครั้งที่มีการอัพเดทของค่าของ State ตัวใดก็ตาม และรวมถึง Props ด้วย (ยกเว้น id เป็นตัวยกเว้น ที่ใส่ใว้ในวงเล็บเหลี่ยม [ ] ท้ายฟังก์ชัน) เพื่อให้ข้อมูลที่แสดงอยู่บนหน้าเว็บมีการเปลี่ยนแปลงทันที
  • กำหนดฟังก์ชัน handleSubmit (บรรทัดที่ 25–52) สำหรับใช้เรียก API เส้น Update User

แก้ไขไฟล์ App.js โดยเพิ่มหน้า UserUpdate เข้าไปใน Routes

ทดสอบการแก้ไขข้อมูล

เรียบร้อยแล้วครับ หวังว่าจะมีประโยชน์นะครับ :D

บทความโดย อ.ดร.กานต์ ยงศิริวิทย์
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต

--

--

Lecturer at Digital Innovation Technology, Rangsit University

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Karn Yongsiriwit

Karn Yongsiriwit

Lecturer at Digital Innovation Technology, Rangsit University