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ạ component React Native như các khối giao diện tái sử dụng

React Native Pressable: tách phản hồi nhấn và hành động

Suong Nguyen by Suong Nguyen
31/10/2026
in React Native
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Nút đổi màu ngay khi ngón tay chạm xuống là phản hồi hữu ích. Nhưng nếu cũng gửi hành động tại onPressIn rồi gửi lại trong onPress, một cử chỉ có thể kích hoạt logic hai lần. Tách hai trách nhiệm giúp nút dễ kiểm tra hơn.

Bài đối chiếu tài liệu React Native 0.88 ngày 31/10/2026. Mẫu dùng component core và state local, không gọi dịch vụ bên ngoài. Chưa build ứng dụng native hoặc chạy thử cử chỉ trên Android/iOS; checklist cuối bài nêu cách xác nhận trên thiết bị.

1. Nhận diện các giai đoạn

Theo tài liệu Pressable, onPressIn báo bắt đầu kích hoạt nhấn; onPressOut báo cử chỉ bị vô hiệu hóa. Với thao tác nhấn thông thường hoàn tất, onPress đến sau onPressOut. Khi giữ đủ lâu, onLongPress có vai trò riêng.

Điểm cần dùng trong thiết kế là ngón tay chạm xuống chưa đồng nghĩa người dùng hoàn tất thao tác. Cử chỉ có thể di chuyển, bị hủy hoặc chuyển sang nhấn giữ. Không dùng onPressOut như một callback “đã xác nhận” cho thao tác gửi dữ liệu.

2. Cho style nhận trạng thái pressed

Đặt component sau trong màn hình của ứng dụng React Native có sẵn. Parent cần bố trí vùng màn hình và safe area phù hợp. Mẫu chỉ tăng số lần nhấn và hiển thị lần tương tác gần nhất để quan sát.

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

export default function PressDemo() {
  const [count, setCount] = useState(0);
  const [lastAction, setLastAction] = useState('Chưa thao tác');

  return (
    <View style={styles.screen}>
      <Text>Số lần nhấn thường: {count}</Text>
      <Text>{lastAction}</Text>
      <View style={styles.touchArea}>
        <Pressable
          accessibilityRole="button"
          accessibilityLabel="Thêm một lần đếm"
          accessibilityHint="Nhấn giữ để xem gợi ý; có nút gợi ý riêng bên dưới"
          hitSlop={8}
          delayLongPress={600}
          onPress={() => {
            setCount(value => value + 1);
            setLastAction('Đã nhấn thường');
          }}
          onLongPress={() => setLastAction('Gợi ý: nút này tăng bộ đếm')}
          style={({pressed}) => [
            styles.button,
            pressed && styles.pressed,
          ]}>
          <Text style={styles.label}>Thêm một lần đếm</Text>
        </Pressable>
      </View>
      <Pressable
        accessibilityRole="button"
        onPress={() => setLastAction('Gợi ý: nút này tăng bộ đếm')}
        style={styles.help}>
        <Text>Xem gợi ý</Text>
      </Pressable>
    </View>
  );
}

const styles = StyleSheet.create({
  screen: {flex: 1, padding: 24, justifyContent: 'center', gap: 12},
  touchArea: {padding: 12, alignItems: 'flex-start'},
  button: {minHeight: 48, padding: 12, backgroundColor: '#075985'},
  pressed: {opacity: 0.65},
  label: {color: '#fff'},
  help: {minHeight: 48, padding: 12, alignSelf: 'flex-start'},
});

Style callback nhận pressed để đổi độ mờ, nên không cần thêm state isPressed chỉ để sao chép trạng thái tương tác. Hành động tăng bộ đếm chỉ đặt trong onPress. Nút gợi ý riêng giúp thông tin vẫn tiếp cận được khi người dùng không dùng thao tác giữ.

3. Dùng nhấn giữ có chủ đích

Mẫu đặt delayLongPress là 600 ms, khác giá trị mặc định 500 ms trong tài liệu đang dẫn. Đây là tham số demo, không phải con số đã được nghiên cứu UX cho sản phẩm của bạn.

Đừng gắn một hành động quan trọng chỉ vào nhấn giữ mà không có đường truy cập khác. Với nghiệp vụ như gửi đơn hoặc xóa, còn cần quản lý trạng thái đang xử lý và chống gửi lặp ở lớp phù hợp. Pressable không tự bảo đảm một thao tác dữ liệu chỉ được thực hiện một lần.

Không lấy việc gọi thủ công handler trong JavaScript làm bằng chứng thứ tự sự kiện native. Mẫu đã được rà theo tài liệu callback, nhưng nhấn giữ và nhấn thường cần được thử bằng các thao tác thật trong ứng dụng.

4. HitSlop có giới hạn hình học

hitSlop={8} nới vùng bắt đầu chạm quanh nút theo đơn vị layout React Native, không làm kích thước hiển thị lớn thêm. Parent của nút trong ví dụ có padding để tạo chỗ quanh vùng hiển thị.

Tài liệu nêu vùng chạm không vượt bounds của parent; sibling chồng lấp cũng ảnh hưởng nơi nhận chạm. Nếu nút sát mép parent hẹp, tăng hitSlop rất lớn không thể biến phần nằm ngoài parent thành vùng thao tác hợp lệ.

Kiểm tra kết quả và lỗi thường gặp

Thử nhấn nhanh một lần: bộ đếm tăng một. Thử giữ để xem gợi ý và quan sát bộ đếm. Thử kéo ra khỏi vùng kích hoạt rồi thả, cũng như tương tác bên trong ScrollView nếu màn hình thật có cuộn. Ghi lại cử chỉ và kết quả thay vì chỉ xem log onPressIn.

Kiểm tra font lớn, screen reader và vùng chạm sát cạnh. Nếu cùng một hành động bị chạy hai lần, tìm các handler đang gọi chung logic trước khi thêm debounce. Nếu màu pressed không phản ánh thao tác, kiểm tra style có bị ghi đè hoặc component đang disabled không.

Bài chỉ xây mẫu quan sát tương tác local. Kiểm thử native và kiểm tra nghiệp vụ cần được làm riêng trước khi đưa mẫu vào màn hình thật.

Nguồn tham khảo

  • React Native: Pressable và trình tự callback
  • React Native: PressEvent
  • React Native: mã nguồn Pressability được tài liệu liên kết

Tags: PressableReact NativeTương tác UI
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh hoạ style và layout trong React Native với màn hình mobile, spacing và typography

React Native useColorScheme: đổi theme mà không cache màu từ module

by Suong Nguyen
01/11/2026
0

Theo dõi thay đổi light/dark bằng useColorScheme, chọn fallback cho null và áp dụng màu trong render thay vì chụp một lần lúc import.

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

React Native RefreshControl: giữ refreshing đúng vòng đời của lượt tải

by Suong Nguyen
30/10/2026
0

Tách trạng thái loading của giao diện với khóa chống lượt refresh chồng nhau, và luôn kết thúc spinner sau thành công hoặc lỗi.

Minh hoạ form TextInput validation và keyboard trong React Native

React Native TextInput: bàn phím numeric không thay thế validation

by Suong Nguyen
29/10/2026
0

Giữ input số lượng dưới dạng string trong lúc nhập, kiểm tra định dạng và khoảng giá trị khi xác nhận.

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ị...

Next Post
Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Pass@k khi đánh giá code AI: đừng đọc như accuracy một lần chạy

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 useColorScheme: đổi theme mà không cache màu từ module
  • Return trong finally có thể che cả return lẫn lỗi ban đầu
  • Android Intent extra: thiếu dữ liệu khác với giá trị 0

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