Thành phần TextInput trong React Native là phần tử chính để người dùng nhập văn bản, tương tự như phần tử input trong HTML. TextInput hỗ trợ trạng thái có điều khiển và không điều khiển, nhiều loại bàn phím khác nhau, mặt nạ nhập liệu và xử lý sự kiện tiêu điểm. Theo React Native Docs, 2024, TextInput là thành phần chính cho biểu mẫu, tìm kiếm, trò chuyện và mọi tình huống có nhập liệu từ người dùng. Thành phần này tự động thích ứng với nền tảng, sử dụng UITextField gốc trên iOS và EditText trên Android.
Các điểm chính
TextInput là thành phần React Native cho phép người dùng nhập văn bản bằng bàn phím thiết bị. Nó là khối xây dựng chính cho biểu mẫu đăng ký, thanh tìm kiếm, trường nhập tin nhắn và mọi tình huống khác cần nhập liệu từ người dùng. Không giống như phát triển web, nơi có các loại input riêng biệt (text, email, password, search), trong React Native tất cả các biến thể này được triển khai thông qua một thành phần TextInput duy nhất với các props khác nhau.
TextInput hỗ trợ hai chế độ hoạt động: có điều khiển (được quản lý qua trạng thái React) và không điều khiển (sử dụng ref). Ở chế độ có điều khiển, giá trị trường được lưu trong trạng thái thành phần và được cập nhật qua callback onChangeText. Phương pháp này được khuyến nghị cho hầu hết các ứng dụng vì nó cung cấp một nguồn dữ liệu duy nhất và đơn giản hóa việc xác thực.
Theo React Native Handling Text Input, 2024, TextInput tự động thích ứng với nền tảng: trên iOS nó sử dụng UITextField gốc, trên Android — EditText. Điều này đảm bảo hoạt động chính xác của tính năng tự động hoàn thành, tự động sửa lỗi và menu hệ thống (cắt/sao chép/dán) mà không cần cấu hình thêm.
TextInput cung cấp một bộ props phong phú để kiểm soát nhập liệu, giao diện và hành vi. Tất cả props được chia thành nhiều danh mục: quản lý giá trị, loại bàn phím, kiểu dáng, sự kiện và tính năng dành riêng cho nền tảng.
value — giá trị hiện tại của trường (cho chế độ có điều khiển). onChangeText — callback được gọi mỗi khi văn bản thay đổi. placeholder — văn bản gợi ý hiển thị khi trường trống. defaultValue — giá trị ban đầu cho chế độ không điều khiển. maxLength giới hạn số ký tự tối đa người dùng có thể nhập.
Thành phần hỗ trợ onFocus (trường nhận được tiêu điểm), onBlur (trường mất tiêu điểm), onSubmitEditing (người dùng nhấn Enter/Return), onKeyPress (nhấn phím). Sự kiện onEndEditing được gọi sau khi kết thúc chỉnh sửa khi mất tiêu điểm. Các callback này cho phép triển khai logic xác thực và gửi biểu mẫu phức tạp.
Trên iOS: clearButtonMode (nút xóa), keyboardAppearance (bàn phím sáng/tối), returnKeyType (loại nút Return), enablesReturnKeyAutomatically. Trên Android: textContentType (tự động điền), underlineColorAndroid, inlineImageLeft. secureTextEntry hoạt động trên cả hai nền tảng cho việc nhập mật khẩu.
Trong React Native, TextInput có thể hoạt động ở hai chế độ. Ở chế độ có điều khiển, React quản lý giá trị của trường: bạn truyền giá trị từ trạng thái và cập nhật nó qua onChangeText. Ở chế độ không điều khiển, React chỉ khởi tạo trường và giá trị giống DOM được lưu trữ bên trong thành phần gốc.
Chế độ có điều khiển được khuyến nghị cho tất cả các biểu mẫu yêu cầu xác thực, lọc hoặc định dạng dữ liệu nhập. Trạng thái trường được đồng bộ với trạng thái thành phần React, cho phép kiểm soát hoàn toàn giá trị.
const LoginForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
return (
<View>
<TextInput
placeholder="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
<TextInput
placeholder="Password"
value={password}
onChangeText={setPassword}
secureTextEntry
maxLength={32}
/>
</View>
);
};
Trong ví dụ này, cả hai trường đều sử dụng chế độ có điều khiển. Trường email có loại bàn phím email-address và tắt tính năng tự động viết hoa. Trường mật khẩu sử dụng secureTextEntry để ẩn ký tự nhập và bị giới hạn 32 ký tự qua maxLength.
Chế độ không điều khiển phù hợp cho các trường đơn giản không yêu cầu xác thực hoặc phản ứng tức thời với nhập liệu. Giá trị trường được lấy qua ref tại thời điểm gửi biểu mẫu.
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
Ở chế độ không điều khiển, thành phần hiển thị nhanh hơn vì không cần đồng bộ trạng thái sau mỗi lần thay đổi văn bản. Tuy nhiên, bạn mất khả năng lọc, định dạng hoặc xác thực đầu vào theo thời gian thực.
TextInput hỗ trợ nhiều loại bàn phím khác nhau giúp điều chỉnh bố cục theo định dạng nhập liệu mong đợi. Chọn đúng loại bàn phím cải thiện trải nghiệm người dùng và giảm lỗi nhập liệu trên thiết bị di động.
| Giá trị keyboardType | Mô tả | Khi nào sử dụng |
|---|---|---|
| default | Bàn phím chữ cái tiêu chuẩn | Tên, họ, địa chỉ |
| numeric | Bàn phím số (chỉ chữ số) | Tuổi, số lượng, mã PIN |
| email-address | Bàn phím có @ và .com | Trường email trong biểu mẫu đăng ký |
| phone-pad | Bàn phím điện thoại có + và # | Số điện thoại |
| url | Bàn phím có / và .com | Nhập địa chỉ web |
| decimal-pad | Bàn phím số có dấu thập phân | Giá, cân nặng, kích thước |
Trên iOS, có sẵn các loại bổ sung: numbers-and-punctuation, twitter, web-search (có tìm kiếm bằng giọng nói). Trên Android, cũng có sẵn visible-password (hiển thị mật khẩu). Chọn đúng keyboardType là một khía cạnh quan trọng của UX ứng dụng di động.
Các tính năng nền tảng cũng bao gồm autoCapitalize (tự động viết hoa chữ cái đầu), autoCorrect (tự động sửa lỗi), spellCheck (kiểm tra chính tả), textContentType (tự động điền trên iOS). Các props này hoạt động khác nhau trên mỗi nền tảng và cần được kiểm tra.
Hãy xem xét hai tình huống thực tế: trường nhiều dòng để nhập tin nhắn và trường nhập số điện thoại có mặt nạ. Cả hai đều sử dụng TextInput với các props khác nhau để đạt được hành vi mong muốn.
Để nhập văn bản dài (bình luận, mô tả), TextInput chuyển sang chế độ nhiều dòng qua prop multiline. Ở chế độ này, trường mở rộng theo chiều dọc và hỗ trợ xuống dòng.
const MessageInput = ({ onSend }) => {
const [text, setText] = useState('');
return (
<TextInput
style={styles.input}
multiline
numberOfLines={4}
placeholder="Write a message..."
value={text}
onChangeText={setText}
textAlignVertical="top"
/>
);
};
Prop multiline kích hoạt chế độ nhiều dòng, numberOfLines đặt chiều cao ban đầu theo số dòng. textAlignVertical: 'top' căn chỉnh văn bản lên trên cùng (mặc định, trên Android TextInput nhiều dòng căn giữa văn bản theo chiều dọc).
Để nhập số điện thoại, thường cần định dạng theo thời gian thực. Bằng cách kết hợp onChangeText với biểu thức chính quy, bạn có thể triển khai mặt nạ nhập liệu.
const PhoneInput = () => {
const [phone, setPhone] = useState('');
const formatPhone = (text) => {
const cleaned = text.replace(/\D/g, '');
if (cleaned.length <= 11) {
return cleaned.replace(
/(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})/,
'+$1 ($2) $3 $4 $5'
);
}
return cleaned;
};
return (
<TextInput
keyboardType="phone-pad"
value={phone}
onChangeText={(t) => setPhone(formatPhone(t))}
placeholder="+7 (999) 123 45 67"
maxLength={20}
/>
);
};
Hàm formatPhone loại bỏ tất cả ký tự không phải số và định dạng số theo định dạng quốc tế chuẩn. keyboardType: 'phone-pad' hiển thị bàn phím điện thoại. Phương pháp này cải thiện UX cho việc nhập số điện thoại và ngăn ngừa lỗi định dạng.
Câu hỏi thường gặp
value được sử dụng trong chế độ có điều khiển — React quản lý văn bản hiển thị thông qua trạng thái. defaultValue được sử dụng trong chế độ không điều khiển — nó đặt giá trị ban đầu và các thay đổi tiếp theo được lưu trữ bên trong thành phần.
Đặt prop secureTextEntry thành true. TextInput sẽ ẩn các ký tự nhập, thay thế chúng bằng dấu chấm hoặc dấu sao. Để bảo mật thêm, bạn có thể kết hợp với maxLength và autoCapitalize: 'none'.
onChangeText được gọi mỗi khi văn bản thay đổi, bao gồm chèn và xóa một ký tự. Đây là hành vi bình thường của thành phần có điều khiển. Để tối ưu hóa, bạn có thể sử dụng debounce hoặc cập nhật trạng thái tại onEndEditing.
TextInput không hỗ trợ trực tiếp các phần tử lồng nhau. Giải pháp là tạo một thùng chứa View với Flexbox, bên trong bạn đặt biểu tượng và TextInput. Kiểu của thùng chứa mô phỏng đường viền của trường nhập liệu và TextInput mở rộng để lấp đầy không gian còn lại.
Trên Android, TextInput theo mặc định có đường viền dưới (Material Design). Tắt nó bằng underlineColorAndroid: 'transparent'. Prop này chỉ hoạt động trên Android và loại bỏ đường kẻ hiển thị bên dưới văn bản.
Tổng kết
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.
Đọc thêm