Mengendalikan operasi tak segerak ialah keperluan biasa dalam aplikasi React, terutamanya apabila bekerja dengan API, pangkalan data atau perkhidmatan luaran. Memandangkan operasi JavaScript seperti mengambil data daripada API atau melakukan pengiraan selalunya tidak segerak, React menyediakan alatan dan teknik untuk mengendalikannya dengan anggun.
Dalam panduan ini, kami akan meneroka cara yang berbeza untuk mengendalikan panggilan tak segerak dalam React menggunakan async/wait, Promises dan alatan khusus React yang lain.
React useEffect sesuai untuk melakukan kesan sampingan seperti mengambil data apabila komponen dipasang. Cangkuk itu sendiri tidak boleh terus mengembalikan janji, jadi kami menggunakan fungsi async di dalam kesan.
Berikut ialah cara mengendalikan panggilan tak segerak untuk mengambil data menggunakan cangkuk useEffect.
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; // Example API const AsyncFetchExample = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Using async/await inside useEffect useEffect(() => { const fetchData = async () => { try { const response = await fetch(API_URL); if (!response.ok) { throw new Error('Failed to fetch data'); } const data = await response.json(); setPosts(data); } catch (error) { setError(error.message); } finally { setLoading(false); } }; fetchData(); // Call the async function }, []); // Empty dependency array means this effect runs once when the component mounts if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchExample;
Satu lagi pendekatan biasa ialah menggunakan Janji terus dengan then() dan catch(). Kaedah ini kurang elegan berbanding async/menunggu tetapi masih digunakan secara meluas dalam JavaScript untuk mengendalikan operasi tak segerak.
Berikut ialah contoh menggunakan Promise dan kemudian() untuk panggilan tak segerak:
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; const AsyncFetchWithPromise = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch(API_URL) .then((response) => { if (!response.ok) { throw new Error('Failed to fetch data'); } return response.json(); }) .then((data) => { setPosts(data); setLoading(false); }) .catch((error) => { setError(error.message); setLoading(false); }); }, []); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchWithPromise;
Apabila anda mempunyai peralihan keadaan yang lebih kompleks atau perlu mengendalikan berbilang tindakan semasa proses async (seperti pemuatan, kejayaan, ralat), useReducer ialah alat yang hebat untuk mengurus perubahan keadaan.
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; // Example API const AsyncFetchExample = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Using async/await inside useEffect useEffect(() => { const fetchData = async () => { try { const response = await fetch(API_URL); if (!response.ok) { throw new Error('Failed to fetch data'); } const data = await response.json(); setPosts(data); } catch (error) { setError(error.message); } finally { setLoading(false); } }; fetchData(); // Call the async function }, []); // Empty dependency array means this effect runs once when the component mounts if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchExample;
Dalam sesetengah kes, anda mungkin mahu menggunakan semula logik tak segerak merentas berbilang komponen. Mencipta cangkuk tersuai ialah cara terbaik untuk merangkum logik dan menjadikan kod anda lebih boleh digunakan semula.
import React, { useState, useEffect } from 'react'; const API_URL = 'https://jsonplaceholder.typicode.com/posts'; const AsyncFetchWithPromise = () => { const [posts, setPosts] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch(API_URL) .then((response) => { if (!response.ok) { throw new Error('Failed to fetch data'); } return response.json(); }) .then((data) => { setPosts(data); setLoading(false); }) .catch((error) => { setError(error.message); setLoading(false); }); }, []); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <div> <h1>Posts</h1> <ul> {posts.map((post) => ( <li key={post.id}> <h2>{post.title}</h2> <p>{post.body}</p> </li> ))} </ul> </div> ); }; export default AsyncFetchWithPromise;
Mengendalikan operasi async dalam React adalah penting untuk membina aplikasi web moden. Dengan menggunakan cangkuk seperti useEffect, useReducer dan cangkuk tersuai, anda boleh mengurus tingkah laku tak segerak, mengendalikan ralat dan memastikan pengalaman pengguna yang lancar. Sama ada anda mengambil data, mengendalikan ralat atau melakukan logik async yang kompleks, React memberikan anda alat yang berkuasa untuk mengurus tugasan ini dengan cekap.
Atas ialah kandungan terperinci Mengendalikan Operasi Async dalam React dengan useEffect, Promises dan Custom Hooks. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!