View: nó là gì, thuộc tính container và React Native

Tác giả: IT Sectr Đã đăng: 2026-07-05 Thời gian đọc: 10 phút

Thành phần View trong React Native là khối xây dựng cơ bản của giao diện người dùng, tương tự như phần tử div HTML cho các nền tảng di động. View hỗ trợ lồng nhau ở bất kỳ độ sâu nào, quản lý sự sắp xếp của các phần tử con thông qua Flexbox và xử lý các sự kiện chạm. Theo React Native Docs, 2024, View là thành phần được sử dụng thường xuyên nhất trong các ứng dụng — hầu như mọi màn hình đều được xây dựng từ các container View lồng nhau. Thành phần này render thành UIView gốc trên iOS và android.view.View trên Android, đảm bảo hiệu suất và khả năng tiếp cận gốc.

Những điểm chính

  • View — container cơ bản của React Native, tương tự div HTML cho màn hình di động
  • Thành phần hỗ trợ Flexbox để định vị các phần tử con
  • View render thành các view gốc của iOS và Android
  • Hỗ trợ các sự kiện chạm, cử chỉ và hoạt ảnh thông qua Animated API
  • View không có biểu diễn trực quan mặc định — kiểu được đặt thông qua StyleSheet

View trong React Native là gì

View là một thành phần cơ bản của React Native, đóng vai trò là container cho các thành phần khác. Nó hỗ trợ tạo kiểu thông qua StyleSheet, bố cục thông qua Flexbox, xử lý chạm, hoạt ảnh và biến đổi. View là một lớp trừu tượng trên các phần tử container gốc: UIView trên iOS và android.view.View trên Android.

Trong React Native, không thể sử dụng các phần tử HTML — thay vào đó, tất cả các bố cục được xây dựng từ View. Ngay cả Text và Image cũng thường được bọc trong View để định vị. Thành phần có thể trống (chỉ là một container) hoặc chứa bất kỳ số lượng phần tử con nào ở bất kỳ độ sâu lồng nhau nào.

View hỗ trợ render trên cả hai nền tảng từ một cơ sở mã JavaScript duy nhất. Các thuộc tính Flexbox, lề, nền, bóng và đường viền hoạt động giống hệt nhau trên iOS và Android. Sự khác biệt giữa các nền tảng là tối thiểu — ví dụ: bóng trên iOS sử dụng shadowColor/shadowOffset, trong khi trên Android sử dụng elevation.

Theo React Native Layout Docs, 2024, View được tối ưu hóa cho thiết bị di động: nó không tạo các view gốc bổ sung trong quá trình tối ưu hóa flatten và xử lý chính xác các cập nhật xếp tầng khi kiểu của phần tử cha thay đổi.

Thuộc tính và API của thành phần View

Thành phần View có một bộ props phong phú để kiểm soát giao diện, bố cục và tính tương tác. Tất cả các props được chia thành nhiều loại: props kiểu, sự kiện chạm, khả năng tiếp cận và các tính năng dành riêng cho nền tảng. Hãy khám phá các nhóm chính.

Props kiểu của View

View hỗ trợ tất cả các thuộc tính CSS tiêu chuẩn cho các nền tảng di động. Các thuộc tính chính bao gồm: flexDirection, justifyContent, alignItems để định vị; margin, padding để tạo khoảng cách; backgroundColor, borderRadius cho giao diện; width, height, maxHeight cho kích thước.

Sự kiện chạm và cử chỉ

View có thể xử lý các sự kiện chạm thông qua các props onStartShouldSetResponder, onMoveShouldSetResponder và onResponderGrant. Các sự kiện này cho phép triển khai cử chỉ tùy chỉnh mà không cần thư viện. Đối với các thao tác chạm tiêu chuẩn, onTouchStart, onTouchEnd và onPress (thông qua Pressable hoặc TouchableOpacity) được sử dụng.

Props dành riêng cho nền tảng

Trên iOS, shadowColor, shadowOffset, shadowOpacity, shadowRadius có sẵn cho bóng. Trên Android, các thuộc tính này bị bỏ qua — thay vào đó, elevation được sử dụng (bóng kiểu thẻ). Callback onLayout được kích hoạt khi kích thước của View thay đổi, hữu ích cho các bố cục thích ứng.

Bố cục với View và Flexbox

Flexbox là cơ chế bố cục duy nhất trong React Native (không giống như web, nơi có Grid và Float). Tất cả việc định vị phần tử được thực hiện thông qua các thuộc tính Flexbox của thành phần View. Theo mặc định, View có flexDirection được đặt thành column, không phải row như trên web, phù hợp với hướng dọc của màn hình di động.

Các thuộc tính Flexbox chính trong View

flexDirection xác định hướng của trục chính: column (mặc định) hoặc row. justifyContent kiểm soát sự phân bố dọc theo trục chính (flex-start, center, space-between). alignItems — dọc theo trục chéo (stretch — giá trị mặc định). flex chỉ định tỷ lệ không gian khả dụng cho phần tử con.

js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';

const CardLayout = () => (
    <View style={styles.card}>
        <View style={styles.row}>
            <View style={styles.avatar} />
            <View style={styles.content}>
                <Text style={styles.name}>John Doe</Text>
                <Text style={styles.role}>Developer</Text>
            </View>
        </View>
    </View>
);

Ví dụ cho thấy một cấu trúc điển hình: View bên ngoài — thẻ, row bên trong — một hàng với hình đại diện và khối văn bản, content — một cột với tên và vai trò. Cấu trúc View lồng nhau này là tiêu chuẩn cho bất kỳ màn hình React Native nào.

Sự khác biệt giữa View và div HTML

Mặc dù View về mặt khái niệm tương tự như div HTML, nhưng có những khác biệt chính cần hiểu khi chuyển mã từ web sang React Native. Những khác biệt này liên quan đến việc render, kiểu và hành vi mặc định.

Đặc điểmView (React Native)div (HTML)
flexDirection mặc địnhcolumnrow (trong ngữ cảnh block)
width/heightMặc định 100% của chaauto dựa trên nội dung
CuộnKhông được hỗ trợ (cần ScrollView)overflow: auto/scroll
BóngiOS: shadow*, Android: elevationbox-shadow
Xử lý sự kiệnHệ thống ResponderSự kiện DOM
Render gốcUIView / android.view.ViewPhần tử DOM

Sự khác biệt quan trọng nhất là flexDirection: column theo mặc định. Điều này có nghĩa là nếu không có cấu hình rõ ràng, các phần tử con được sắp xếp theo chiều dọc, không phải chiều ngang. Sự khác biệt thứ hai: chiều rộng và chiều cao của View theo mặc định mở rộng để lấp đầy tất cả không gian khả dụng của cha (tương tự như width: 100% trong CSS).

Ví dụ thực tế với View

Hãy xem hai ví dụ thực tế về việc sử dụng View trong các ứng dụng React Native: căn giữa nội dung trên toàn màn hình và tạo lưới thẻ phản hồi. Cả hai mẫu đều xuất hiện trong mọi dự án.

Ví dụ 1: Màn hình giữ chỗ với căn giữa

Để tạo trạng thái trống, một View với flex: 1 và căn giữa trên cả hai trục được sử dụng. Đây là mẫu tiêu chuẩn cho màn hình tải, trạng thái lỗi và danh sách trống.

js
const EmptyState = ({ message }) => (
    <View style={styles.container}>
        <Text style={styles.icon}>{icon}</Text>
        <Text style={styles.message}>{message}</Text>
    </View>
);

const styles = StyleSheet.create({
    container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
    icon: { fontSize: 48 },
    message: { fontSize: 16, color: '#666', marginTop: 16 },
});

Sự kết hợp của justifyContent: center và alignItems: center trong View với flex: 1 căn giữa nội dung trên cả hai trục trên toàn màn hình. Đây là mẫu phổ biến nhất của việc sử dụng View trong React Native.

Ví dụ 2: Lưới thẻ với Flexbox

Để hiển thị hai cột sản phẩm hoặc bài viết, một View với flexDirection: row, flexWrap: wrap và các View con có chiều rộng cố định được sử dụng. Mẫu này thay thế CSS Grid trong React Native.

js
const ProductGrid = ({ products }) => (
    <View style={styles.grid}>
        {products.map((product) => (
            <View key={product.id} style={styles.card}>
                <Image source={{ uri: product.image }} />
                <Text>{product.name}</Text>
            </View>
        ))}
    </View>
);

const styles = StyleSheet.create({
    grid: {
        flexDirection: 'row',
        flexWrap: 'wrap',
        justifyContent: 'space-between',
    },
    card: { width: '48%', marginBottom: 16 },
});

Trong ví dụ này, View bên ngoài với flexWrap: wrap hoạt động như một đối tượng tương tự của CSS Grid. Mỗi thẻ chiếm 48% chiều rộng, để lại khoảng trống giữa các cột. Đây là mẫu điển hình cho danh mục và nguồn cấp nội dung.

Câu hỏi thường gặp

View trong React Native khác với div như thế nào?

View có flexDirection: column theo mặc định (không phải row như container flex trong HTML), không hỗ trợ cuộn, chiều rộng mặc định mở rộng đến 100% của cha và bóng được đặt thông qua các thuộc tính shadow* trên iOS và elevation trên Android.

View có thể nhấp được không?

Có, View hỗ trợ xử lý sự kiện chạm thông qua onTouchStart, onTouchEnd và hệ thống Responder. Tuy nhiên, đối với các nút bấm, tốt hơn nên sử dụng TouchableOpacity, Pressable hoặc Button — chúng cung cấp phản hồi trực quan và tuân thủ API tiếp cận.

Tôi có cần sử dụng View cho mọi phần tử không?

Không nhất thiết. React Native tối ưu hóa việc render thông qua View flattening — các View bổ sung không có kiểu và sự kiện sẽ bị xóa khỏi cây gốc. Tuy nhiên, để dễ đọc mã, tốt hơn nên sử dụng View làm container cho các khối giao diện logic.

Làm thế nào để tạo View hình tròn?

Đặt borderRadius bằng một nửa chiều rộng và chiều cao (ví dụ: width: 50, height: 50, borderRadius: 25). Nếu chiều rộng và chiều cao bằng nhau, View sẽ trở thành một hình tròn. Đây là mẫu tiêu chuẩn cho hình đại diện.

Làm thế nào để làm cho View trong suốt?

Đặt opacity từ 0 đến 1 (ví dụ: opacity: 0.5). Bạn cũng có thể sử dụng backgroundColor với RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). Sự khác biệt là opacity áp dụng cho toàn bộ container và nội dung của nó, trong khi RGBA chỉ áp dụng cho nền.

Tổng kết

  • View — container cơ bản của React Native, tương tự div HTML để xây dựng giao diện
  • Thành phần hỗ trợ Flexbox với flexDirection: column theo mặc định
  • View render thành UIView gốc (iOS) và android.view.View (Android)
  • Props chính: thuộc tính kiểu Flexbox, sự kiện chạm qua hệ thống Responder, onLayout cho kích thước
  • View flattening tự động xóa các container bổ sung khỏi cây gốc
  • Đối với nút bấm, hãy sử dụng TouchableOpacity hoặc Pressable thay vì View với onTouch
  • View lồng nhau là kiến trúc tiêu chuẩn của bất kỳ màn hình nào trong ứng dụng React Native

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm