วิธีการ Fetch Data ใน React Hooks

Nattara
2 min readAug 16, 2019

--

ก่อนหน้านี้ได้เขียนถึง React Functional Components ไป ซึ่งมีส่วนที่เกี่ยวข้องกับ React Hooks อยู่ด้วย ทีนี้ถ้าหากใครได้ลองใช้งาน React Hooks แล้วอาจสงสัยว่า เราจะ Fetch data จาก Service และใช้งานร่วมกับ React Hooks ได้ยังไง บทความนี้จะกล่าวถึงเรื่องนี้กัน

Table of Contents

บทความนี้เป็นเรื่องของการ Fetch Data จาก Api Service โดยใช้ State และ Effect ใน React Hooks กัน เลือกอ่านตามความขยันนะ :)

Fetching Data in React Hooks

การดึงข้อมูลจาก Api Service มาแสดงผล ใน React Hooks โดยจะเขียนไว้ในฟังก์ชัน useEffect ดังตัวอย่างด้านล่าง

calling api service

สังเกตว่า ในคำสั่ง useEffect จะใส่แค่ [] เท่านั้น เพื่อให้ทำงานเฉพาะตอน mount และ unmount เท่านั้น

Note: React v16.8.2: ไม่แนะนำให้ใช้ฟังก์ชัน async ใน useEffect

ทีนี้หากว่าเรามีการเรียก Service มากกว่าหนึ่งตัว เราสามารถที่จะกำหนดให้อยู่ในรูปแบบของฟังก์ชันได้เลย

reflector to function

Fetching Data when trigger a hook

เมื่อต้องการ fetch ข้อมูลใหม่ เช่น ทุกครั้งที่มีการพิมพ์ข้อความลงใน input สามารถทำได้ โดยการระบุ state ที่ต้องการให้ Fetch ข้อมูล เมื่อมีการเปลี่ยนแปลง

Trigger a Hook for Fetch data

ตัวอย่างด้านบน จะเห็นว่ามีการ เพิ่ม [query] ลงไปในบรรทัดที่ 20 ซึ่งหมายความว่า เมื่อ state ของ query มีการเปลี่ยนแปลง จะทำให้ useEffect ทำงานนั่นเอง

ในกรณีที่อยากจะให้มีการ Fetch ข้อมูลตอนที่กดคลิ๊กปุ่มเท่านั้น สามารถทำได้ง่ายๆ ด้วยการเปลี่ยน [query] เป็น [search] ซึ่งหมายความว่า useEffect จะทำงานเมื่อ state ของ search มีการเปลี่ยนแปลง

Trigger a Hook for Fetch data when click button

Loading Indicator

ขณะที่ Fetch ข้อมูลใหม่ ถ้าหากเราต้องการแสดงสถานะ เพื่อบอกว่ากำลังโหลดข้อมูลอยู่ สามารถทำได้ด้วยการเพิ่ม isLoading state เข้าไป ตามโค๊ดข้างล่างนี้

Loading Indicator

Error Handling

การ Handle Error ต่างๆ ที่เกิดขึ้น ก็ใช้วิธีเดียวกับการแสดงสถานะ Loading เช่นเดียวกัน

Error Handling

Custom Data Fetching

จากตัวอย่างที่ผ่านมาสังเกตได้ว่า มีการใช้งาน State มากขึ้น ถ้าหากเรามีการ Fetching Data มากกว่า 1 Service อาจทำให้โค๊ดที่เขียนรกและทำให้ดูยากว่า state ไหนเป็นของอันไหน เพราะฉนั้น เราสามารถจัดกลุ่มของการ Fetching data เพื่อความสะดวกได้ด้วยการเขียนแยกออกไปอีกฟังก์ชัน

Move code to new function

จากนั้นก็เรียกฟังค์ชันนั้นมาใช้งานอีกทีนึง (ถ้าแยกไว้ไฟล์อื่น ก็ import มันเข้ามาก่อน)

import and use post list

Reducer Hook for Data Fetching

โค๊ดของเราตอนนี้จะเห็นได้ว่าทุกครั้งที่มีการเรียกใช้ฟังก์ชันที่เขียนไว้ เพื่อ Fetching data จะมี state อื่นๆ ที่นอกเหนือจาก data ที่ส่งมาด้วยเสมอนั่น คือ isLoading, isError ในส่วนนี้สามารถส่งค่าทั้งหมดมาด้วยกันได้ โดยใช้ Reducer Hook

const [state, dispatch] = useReducer(reducer, initialArg);

การสร้าง Reducer ขึ้นมาจะใช้คำสั่ง useReducer ซึ่งต้องระบุค่า parameter ด้วยกัน 2 ค่า ได้แก่ reducer function และ initialArg ( Argument เริ่มต้นของ state) โดย useReducer จะส่งค่ากลับมา 2 ค่า คือ object ของ state และ dispatch function (บรรทัดที่ 9)

basic structure of redux

Reducer function ทำหน้าที่รับ state ปัจจุบัน และ action ซึ่งภายในประกอบไปด้วย type ของ action ที่เกิดขึ้นและ data อื่นๆ ที่ส่งเข้ามาด้วย

ใน Reducer function จัดการข้อมูลต่างๆ ใน state ก่อนที่จะส่งค่า state ใหม่กลับไป (Reducer function ถูกเรียกผ่านคำสั่ง dispatch)

reducer function

การใช้งาน dispatch ทำโดยระบุค่าของ Type ของ action ที่เกิดขึ้น และข้อมูลที่จะส่งไป

how to use dispatch

สุดท้ายก็ return state เพื่อใช้งานต่อไป

example of reducer

ถ้าอ่านมาถึงตรงนี้แล้ว เชื่อว่าทุกคนได้เรียนรู้วิธีใช้การ State และ Effects ในการดึงข้อมูลกันแล้ว หวังว่าบทความนี้มีประโยชน์กับทุกคนที่กำลังศึกษา React Hooks อยู่ นะครับ :)

--

--

Nattara
Nattara

Written by Nattara

It always seems impossible until it’s done. ʕ´•ᴥ•`ʔ

Responses (2)