คอมโพเนนต์ TextInput ใน React Native เป็นองค์ประกอบหลักสำหรับการป้อนข้อความโดยผู้ใช้ ซึ่งคล้ายกับอิลิเมนต์ input ใน HTML TextInput รองรับสถานะแบบควบคุมและไม่ควบคุม ประเภทคีย์บอร์ดต่างๆ มาสก์การป้อนข้อมูล และการจัดการเหตุการณ์โฟกัส ตาม React Native Docs, 2024 TextInput เป็นคอมโพเนนต์หลักสำหรับฟอร์ม การค้นหา แชท และสถานการณ์ใดๆ ที่ต้องการการป้อนข้อมูลจากผู้ใช้ คอมโพเนนต์จะปรับให้เข้ากับแพลตฟอร์มโดยอัตโนมัติ โดยใช้ UITextField ดั้งเดิมบน iOS และ EditText บน Android
ประเด็นสำคัญ
TextInput เป็นคอมโพเนนต์ React Native ที่อนุญาตให้ผู้ใช้ป้อนข้อความโดยใช้คีย์บอร์ดของอุปกรณ์ เป็นส่วนประกอบหลักสำหรับฟอร์มลงทะเบียน แถบค้นหา ฟิลด์ป้อนข้อความ และสถานการณ์อื่นๆ ที่ต้องการการป้อนข้อมูลจากผู้ใช้ ต่างจากการพัฒนาเว็บที่มีประเภท input แยกต่างหาก (text, email, password, search) ใน React Native รูปแบบทั้งหมดนี้ถูกนำมาใช้ผ่านคอมโพเนนต์ TextInput เดียวกับ props ที่แตกต่างกัน
TextInput รองรับสองโหมดการทำงาน: แบบควบคุม(จัดการผ่านสถานะ React) และไม่ควบคุม (ใช้ ref) ในโหมดควบคุม ค่าของฟิลด์จะถูกเก็บในสถานะของคอมโพเนนต์และอัปเดตผ่าน callback onChangeText วิธีการนี้แนะนำสำหรับแอปพลิเคชันส่วนใหญ่เนื่องจากเป็นแหล่งความจริงเดียวและช่วยให้การตรวจสอบความถูกต้องง่ายขึ้น
ตาม React Native Handling Text Input, 2024 TextInput จะ ปรับ ให้เข้ากับแพลตฟอร์มโดยอัตโนมัติ: บน iOS ใช้ UITextField ดั้งเดิม บน Android — EditText ซึ่งรับประกันการทำงานที่ถูกต้องของการเติมข้อความอัตโนมัติ การแก้ไขอัตโนมัติ และเมนูระบบ (ตัด/คัดลอก/วาง) โดยไม่ต้องกำหนดค่าเพิ่มเติม
TextInput มีชุด props มากมายสำหรับควบคุมการป้อนข้อมูล ลักษณะที่ปรากฏ และพฤติกรรม props ทั้งหมดแบ่งออกเป็นหลายหมวดหมู่: การจัดการค่า ประเภทคีย์บอร์ด การจัดรูปแบบ เหตุการณ์ และคุณสมบัติเฉพาะแพลตฟอร์ม
value — ค่าปัจจุบันของฟิลด์ (สำหรับโหมดควบคุม) onChangeText — callback ที่เรียกทุกครั้งที่มีการเปลี่ยนแปลงข้อความ placeholder — ข้อความแนะนำที่แสดงเมื่อฟิลด์ว่าง defaultValue — ค่าเริ่มต้นสำหรับโหมดไม่ควบคุม maxLength จำกัดจำนวนอักขระสูงสุดที่ผู้ใช้สามารถป้อนได้
คอมโพเนนต์รองรับ onFocus (ฟิลด์ได้รับโฟกัส), onBlur (ฟิลด์เสียโฟกัส), onSubmitEditing (ผู้ใช้กด Enter/Return), onKeyPress (การกดแป้น) เหตุการณ์ onEndEditing จะถูกเรียกหลังจากเสร็จสิ้นการแก้ไขเมื่อเสียโฟกัส callbacks เหล่านี้ช่วยให้สามารถใช้ตรรกะการตรวจสอบความถูกต้องและการส่งฟอร์มที่ซับซ้อนได้
บน iOS: clearButtonMode (ปุ่มล้าง), keyboardAppearance (คีย์บอร์ดสว่าง/มืด), returnKeyType (ประเภทปุ่ม Return), enablesReturnKeyAutomatically บน Android: textContentType (การเติมอัตโนมัติ), underlineColorAndroid, inlineImageLeft secureTextEntry ทำงานบนทั้งสองแพลตฟอร์มสำหรับการป้อนรหัสผ่าน
ใน React Native TextInput สามารถทำงานได้สองโหมด ในโหมด ควบคุม React จะจัดการค่าของฟิลด์: คุณส่งค่าจากสถานะและอัปเดตผ่าน onChangeText ในโหมด ไม่ควบคุม React จะเริ่มต้นฟิลด์เท่านั้น และค่าแบบ DOM จะถูกเก็บไว้ภายในคอมโพเนนต์ดั้งเดิม
โหมดควบคุมแนะนำสำหรับฟอร์มทั้งหมดที่ต้องการ การตรวจสอบ การกรอง หรือการจัดรูปแบบข้อมูลที่ป้อน สถานะของฟิลด์จะซิงค์กับสถานะของคอมโพเนนต์ React ซึ่งให้การควบคุมค่าอย่างสมบูรณ์
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>
);
};
ในตัวอย่างนี้ ทั้งสองฟิลด์ใช้โหมด ควบคุม ฟิลด์อีเมลมีประเภทคีย์บอร์ด email-address และปิดการใช้งานการใช้อักษรตัวพิมพ์ใหญ่โดยอัตโนมัติ ฟิลด์รหัสผ่านใช้ secureTextEntry เพื่อซ่อนอักขระที่ป้อนและจำกัดที่ 32 อักขระผ่าน maxLength
โหมดไม่ควบคุมเหมาะสำหรับฟิลด์ง่ายๆ ที่ไม่ต้องการ การตรวจสอบ หรือการตอบสนองทันทีต่อการป้อนข้อมูล ค่าของฟิลด์จะถูกเรียกผ่าน ref ในเวลาที่ส่งฟอร์ม
const SimpleSearch = () => {
const inputRef = useRef(null);
const handleSearch = () => {
console.log(inputRef.current.value());
};
return (
<TextInput
ref={inputRef}
placeholder="Search..."
onSubmitEditing={handleSearch}
/>
);
};
ในโหมดไม่ควบคุม คอมโพเนนต์จะ เรนเดอร์ ได้เร็วกว่าเนื่องจากไม่ต้องการการซิงค์สถานะทุกครั้งที่มีการเปลี่ยนแปลงข้อความ อย่างไรก็ตาม คุณสูญเสียความสามารถในการกรอง จัดรูปแบบ หรือตรวจสอบการป้อนข้อมูลแบบเรียลไทม์
TextInput รองรับประเภทคีย์บอร์ดต่างๆ ที่ปรับเค้าโครงตามรูปแบบการป้อนข้อมูลที่คาดหวัง การเลือกประเภทคีย์บอร์ดที่ถูกต้องช่วยปรับปรุงประสบการณ์ผู้ใช้และลดข้อผิดพลาดในการป้อนข้อมูลบนอุปกรณ์มือถือ
| ค่า keyboardType | คำอธิบาย | เมื่อใดควรใช้ |
|---|---|---|
| default | คีย์บอร์ดตัวอักษรมาตรฐาน | ชื่อ, นามสกุล, ที่อยู่ |
| numeric | คีย์บอร์ดตัวเลข (เฉพาะตัวเลข) | อายุ, จำนวน, รหัส PIN |
| email-address | คีย์บอร์ดที่มี @ และ .com | ฟิลด์อีเมลในฟอร์มลงทะเบียน |
| phone-pad | คีย์บอร์ดโทรศัพท์ที่มี + และ # | หมายเลขโทรศัพท์ |
| url | คีย์บอร์ดที่มี / และ .com | การป้อนที่อยู่เว็บ |
| decimal-pad | คีย์บอร์ดตัวเลขที่มีจุดทศนิยม | ราคา, น้ำหนัก, ขนาด |
บน iOS มีประเภทเพิ่มเติม: numbers-and-punctuation, twitter, web-search (พร้อมค้นหาด้วยเสียง) บน Android ยังมี visible-password (แสดงรหัสผ่าน) การเลือก keyboardType ที่ถูกต้องเป็นสิ่งสำคัญของ UX ของแอปพลิเคชันมือถือ
คุณสมบัติของแพลตฟอร์มยังรวมถึง autoCapitalize (การใช้อักษรตัวพิมพ์ใหญ่โดยอัตโนมัติสำหรับคำแรก), autoCorrect (การแก้ไขอัตโนมัติ), spellCheck (การตรวจสอบการสะกด), textContentType (การเติมอัตโนมัติบน iOS) props เหล่านี้ทำงานแตกต่างกันบนแต่ละแพลตฟอร์มและต้องการการทดสอบ
ลองพิจารณาสองสถานการณ์จริง: ฟิลด์หลายบรรทัดสำหรับป้อนข้อความและฟิลด์ป้อนหมายเลขโทรศัพท์แบบมีมาสก์ ทั้งสองใช้ TextInput กับ props ที่แตกต่างกันเพื่อให้ได้พฤติกรรมที่ต้องการ
สำหรับการป้อนข้อความยาว (ความคิดเห็น คำอธิบาย) TextInput จะเปลี่ยนเป็นโหมด หลายบรรทัด ผ่าน prop multiline ในโหมดนี้ ฟิลด์จะขยายในแนวตั้งและรองรับการขึ้นบรรทัดใหม่
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 เปิดใช้งานโหมดหลายบรรทัด numberOfLines กำหนดความสูงเริ่มต้นเป็นบรรทัด textAlignVertical: 'top' จัดแนวข้อความไปที่ด้านบน (โดยค่าเริ่มต้น Android TextInput แบบหลายบรรทัดจะจัดกึ่งกลางข้อความในแนวตั้ง)
สำหรับการป้อน หมายเลขโทรศัพท์ มักต้องการการจัดรูปแบบแบบเรียลไทม์ โดยการรวม onChangeText เข้ากับนิพจน์ปกติ คุณสามารถใช้มาสก์การป้อนข้อมูลได้
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}
/>
);
};
ฟังก์ชัน formatPhone จะลบอักขระที่ไม่ใช่ตัวเลขทั้งหมดและจัดรูปแบบหมายเลขเป็นรูปแบบมาตรฐานสากล keyboardType: 'phone-pad' แสดงคีย์บอร์ดโทรศัพท์ วิธีการนี้ช่วยปรับปรุง UX สำหรับการป้อนหมายเลขโทรศัพท์และป้องกันข้อผิดพลาดในการจัดรูปแบบ
คำถามที่พบบ่อย
value ใช้ในโหมดควบคุม — React จัดการข้อความที่แสดงผ่านสถานะ defaultValue ใช้ในโหมดไม่ควบคุม — กำหนดค่าเริ่มต้น และการเปลี่ยนแปลงต่อมาจะถูกเก็บไว้ภายในคอมโพเนนต์
ตั้งค่า prop secureTextEntry เป็น true TextInput จะซ่อนอักขระที่ป้อน โดยแทนที่ด้วยจุดหรือเครื่องหมายดอกจัน เพื่อความปลอดภัยเพิ่มเติม คุณสามารถรวมกับ maxLength และ autoCapitalize: 'none'
onChangeText ถูกเรียกทุกครั้งที่มีการเปลี่ยนแปลงข้อความ รวมถึงการแทรกและการลบอักขระเดี่ยว นี่เป็นพฤติกรรมปกติของคอมโพเนนต์แบบควบคุม สำหรับการปรับให้เหมาะสม คุณสามารถใช้ debounce หรืออัปเดตสถานะเมื่อ onEndEditing
TextInput ไม่รองรับอิลิเมนต์ที่ซ้อนกันโดยตรง วิธีแก้คือสร้างคอนเทนเนอร์ View ด้วย Flexbox ภายในใส่ไอคอนและ TextInput สไตล์ของคอนเทนเนอร์เลียนแบบขอบของฟิลด์ป้อนข้อมูล และ TextInput จะขยายเพื่อเติมเต็มพื้นที่ที่เหลือ
บน Android TextInput มีขอบด้านล่างโดยค่าเริ่มต้น (Material Design) ปิดการใช้งานด้วย underlineColorAndroid: 'transparent' prop นี้ทำงานเฉพาะบน Android และลบเส้นที่มองเห็นได้ใต้ข้อความ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ