aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh hoạ React Native gọi API và hiển thị loading error empty success state

Gọi API trong React Native: loading, error và empty state

admin by admin
22/07/2026
in Lập trình Mobile, React Native
0
585
SHARES
3.3k
VIEWS
Summarize with ChatGPTShare to Facebook

Sau khi đã biết component, state, effect, FlatList và navigation, bạn đã sẵn sàng gọi API. Đây là lúc app bắt đầu lấy dữ liệu thật từ server thay vì dùng mảng giả trong code.

Trong React Native, bạn có thể dùng fetch để gọi HTTP API. Nhưng gọi API không chỉ là lấy dữ liệu. UI còn cần xử lý các trạng thái: đang tải, lỗi, không có dữ liệu và có dữ liệu.

Mẫu state cơ bản khi gọi API

Một màn hình gọi API thường cần ít nhất ba state: data, loading, error.

const [articles, setArticles] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');

articles giữ dữ liệu. loading cho biết đang tải. error giữ thông báo lỗi nếu request thất bại.

Gọi API bằng useEffect

import { useEffect, useState } from 'react';
import { ActivityIndicator, FlatList, Text, View } from 'react-native';

function ArticleListScreen() {
  const [articles, setArticles] = useState([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState('');

  useEffect(() => {
    async function loadArticles() {
      try {
        setLoading(true);
        setError('');

        const response = await fetch('https://example.com/api/articles');
        const data = await response.json();

        setArticles(data);
      } catch (err) {
        setError('Không tải được danh sách bài viết');
      } finally {
        setLoading(false);
      }
    }

    loadArticles();
  }, []);

  if (loading) {
    return <ActivityIndicator style={{ flex: 1 }} />;
  }

  if (error) {
    return <Text>{error}</Text>;
  }

  return (
    <FlatList
      data={articles}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => <Text>{item.title}</Text>}
      ListEmptyComponent={<Text>Chưa có bài viết nào</Text>}
    />
  );
}

Ví dụ này chưa phải kiến trúc hoàn hảo, nhưng rất tốt cho người mới vì nó cho thấy toàn bộ flow: bắt đầu loading, gọi API, set data, bắt lỗi và tắt loading.

Vì sao cần empty state?

Không có dữ liệu không nhất thiết là lỗi. Ví dụ user chưa lưu bài viết nào, chưa có thông báo mới, hoặc category hiện tại chưa có bài. Khi đó empty state giúp người dùng hiểu app vẫn hoạt động bình thường.

Đừng để màn hình trắng. Màn hình trắng làm người dùng tưởng app bị lỗi.

Retry khi lỗi

Với lỗi mạng, bạn nên cho người dùng thử lại. Khi code lớn hơn, hãy tách hàm loadArticles ra ngoài useEffect để có thể gọi lại từ nút Retry.

<Button title="Thử lại" onPress={loadArticles} />

Ở app thật, bạn cũng nên kiểm tra response.ok, xử lý mã lỗi server và cân nhắc timeout nếu cần.

Đưa dữ liệu vào FlatList

Sau khi có data, FlatList là nơi phù hợp để hiển thị danh sách. Hãy nhớ truyền key ổn định, tách item thành component riêng và chuẩn bị loading/empty/error state.

Lỗi thường gặp

Lỗi đầu tiên là chỉ code trường hợp thành công. Lỗi thứ hai là không tắt loading trong nhánh lỗi. Lỗi thứ ba là không có empty state. Lỗi thứ tư là gọi API lặp vô hạn vì dependency của useEffect sai. Lỗi thứ năm là cập nhật state sau khi màn hình đã rời đi trong các flow phức tạp.

Kết luận

Gọi API là bước biến app demo thành app có dữ liệu thật. Hãy luôn nghĩ theo bốn trạng thái: loading, error, empty và success. Khi UI xử lý đủ bốn trạng thái này, app sẽ dễ dùng hơn rất nhiều và người mới cũng debug dễ hơn.

Nguồn tham khảo: React Native: Networking, React: useEffect, React Native: FlatList.

SummarizeShare234
admin

admin

Related Stories

Minh hoạ state thay đổi và làm giao diện React Native cập nhật lại

React Native Switch: cập nhật value từ onValueChange và khóa đúng bằng disabled

by Suong Nguyen
28/10/2026
0

Dựng một cài đặt boolean có nguồn dữ liệu rõ ràng, tránh Switch bật rồi trở lại giá trị cũ và tách trạng thái khóa khỏi giá trị...

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android ClipboardManager: sao chép text và tránh thông báo trùng từ Android 13

by Suong Nguyen
28/10/2026
0

Tạo ClipData đúng label và nội dung, ghi vào clipboard sau thao tác bấm và điều chỉnh phản hồi sao chép theo phiên bản Android.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android Sharesheet: chia sẻ văn bản và đường dẫn bằng ACTION_SEND

by Suong Nguyen
27/10/2026
0

Tạo Intent chia sẻ text đúng MIME type, mở chooser của hệ thống và phân biệt mở bảng chia sẻ với việc người dùng đã gửi nội dung.

Minh hoạ FlatList hiển thị danh sách bài viết trong React Native

React Native SectionList: nhóm dữ liệu với key và tiêu đề riêng cho từng phần

by Suong Nguyen
27/10/2026
0

Dựng danh sách đơn theo trạng thái bằng SectionList, giữ key ổn định và xử lý nhóm rỗng cùng cập nhật dữ liệu.

Next Post
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Tổng hợp 50 câu hỏi/trả lời phỏng vấn Fresher React Native

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native Switch: cập nhật value từ onValueChange và khóa đúng bằng disabled
  • Phỏng vấn JavaScript: vì sao callback trong vòng lặp đều đọc cùng giá trị?
  • Android ClipboardManager: sao chép text và tránh thông báo trùng từ Android 13

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply