Text: มันคืออะไร การแสดงข้อความและ React Native

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-05 เวลาอ่าน: 9 นาที

คอมโพเนนต์ Text ใน React Native เป็นวิธีเดียวในการแสดงข้อความบนหน้าจอ แตกต่างจากเว็บที่ใช้แท็กต่างกัน (p, span, h1-h6) Text รองรับการซ้อนกันสำหรับการสืบทอดสไตล์แบบลดหลั่น การจัดการเหตุการณ์สัมผัส และการตัดบรรทัดอัตโนมัติ ตาม React Native Docs, 2024 Text เป็นคอมโพเนนต์ที่ใช้บ่อยเป็นอันดับสองรองจาก View คอมโพเนนต์นี้เรนเดอร์เป็น UILabel ดั้งเดิมบน iOS และ TextView บน Android เพื่อให้แน่ใจว่าฟอนต์และการเข้าถึงทำงานอย่างถูกต้อง

ประเด็นสำคัญ

  • Text เป็นคอมโพเนนต์ React Native เพียงตัวเดียวสำหรับแสดงข้อความ
  • รองรับการซ้อนกันสำหรับการจัดสไตล์แต่ละส่วนของข้อความ
  • Text สืบทอดสไตล์จากคอมโพเนนต์ Text หลัก
  • เรนเดอร์เป็น UILabel บน iOS และ TextView บน Android
  • รองรับ numberOfLines และ adjustsFontSizeToFit สำหรับควบคุมการแสดงผล

Text ใน React Native คืออะไร

Text เป็นคอมโพเนนต์ React Native สำหรับแสดงเนื้อหาข้อความ ต่างจากการพัฒนาเว็บที่มีแท็กเชิงความหมายมากมายสำหรับข้อความ ใน React Native องค์ประกอบข้อความทั้งหมดถูกสร้างขึ้นผ่าน Text คอมโพเนนต์สามารถแสดงทั้งข้อความธรรมดาและโครงสร้างที่ซับซ้อนด้วย Text ที่ซ้อนกันและส่วนที่จัดสไตล์

Text จัดการการตัดบรรทัดโดยอัตโนมัติ จัดการตระกูลฟอนต์ ขนาด สี และการจัดตำแหน่ง คอมโพเนนต์รองรับเหตุการณ์สัมผัส (onPress) ทำให้สามารถสร้างลิงก์ที่คลิกได้โดยไม่ต้องใช้ตัวห่อเพิ่มเติม ข้อจำกัดสำคัญ: Text ไม่สามารถซ้อนโดยตรงภายใน View — ได้เฉพาะภายในคอมโพเนนต์ Text อื่นหรือเป็นลูกโดยตรง

ตาม React Native Nested Text, 2024 คอมโพเนนต์ Text ที่ซ้อนกันสืบทอดสไตล์จากหลัก ซึ่งช่วยให้สามารถกำหนดสไตล์พื้นฐานในระดับบนสุดและแทนที่คุณสมบัติแต่ละรายการสำหรับส่วนเฉพาะ — คล้ายกับวิธีที่ span ทำงานกับ CSS บนเว็บ

คุณสมบัติและ API ของคอมโพเนนต์ Text

คอมโพเนนต์ Text มีชุด props สำหรับควบคุมการแสดงผล พฤติกรรม และการเข้าถึง หมวดหมู่หลัก: props สไตล์ (ฟอนต์ ขนาด สี การจัดตำแหน่ง), props การแสดงผล (numberOfLines, lineBreakMode) และ props เชิงโต้ตอบ (onPress, onLongPress)

Props การแสดงข้อความ

numberOfLines จำกัดจำนวนบรรทัดที่แสดง เพิ่มจุดไข่ปลาที่ท้าย ellipsizeMode ควบคุมตำแหน่งจุดไข่ปลา (head, middle, tail, clip) adjustsFontSizeToFit ลดขนาดฟอนต์โดยอัตโนมัติเพื่อให้ข้อความพอดีภายในขอบเขตที่กำหนด lineBreakMode กำหนดวิธีตัดข้อความที่เกิน numberOfLines

Props เชิงโต้ตอบ

Text รองรับ onPress และ onLongPress สำหรับจัดการการสัมผัส ซึ่งช่วยให้สร้างลิงก์ข้อความโดยไม่ต้องใช้ TouchableOpacity onTextLayout ส่งคืนข้อมูลเกี่ยวกับเค้าโครงข้อความหลังการเรนเดอร์ — มีประโยชน์สำหรับแอนิเมชันและการวางตำแหน่ง

Props เฉพาะแพลตฟอร์ม

บน iOS มี disabled (ปิดใช้งานข้อความ), selectable (เปิดใช้งานการเลือก), dataDetectorTypes (การตรวจจับลิงก์ โทรศัพท์ ที่อยู่โดยอัตโนมัติ) บน Android มี selectable (ผ่าน textSelectable) และ includeFontPadding (ลบระยะห่างส่วนเกิน)

ความแตกต่างระหว่าง Text กับองค์ประกอบ p และ span ใน HTML

แม้ว่า Text จะมองเห็นคล้ายกับแท็ก HTML p และ span แต่ความแตกต่างทางสถาปัตยกรรมมีนัยสำคัญ React Native ไม่มีโมเดล DOM ที่มีองค์ประกอบข้อความเชิงความหมาย — โหนดข้อความทั้งหมดถูกจัดการผ่านคอมโพเนนต์ Text เดียวที่มี props ต่างกัน

ลักษณะText (React Native)p / span (HTML)
การซ้อนกันText ใน Text — การสืบทอดสไตล์p ไม่สามารถมี p; span ภายใน p
ระยะขอบเริ่มต้นไม่มีระยะขอบเริ่มต้นp มี margin-block-start/end
การตัดบรรทัดอัตโนมัติภายในคอนเทนเนอร์p — บล็อก, span — อินไลน์
การจัดการ onPressรองรับในตัวต้องมีตัวห่อเพิ่มเติม
การสืบทอดสไตล์ใช่ จาก Text หลักใช่ การลดหลั่น CSS

ความแตกต่างหลักคือการสืบทอดสไตล์ผ่านการซ้อนกันของ Text ถ้า Text ภายนอกมี fontSize: 18 และ color: blue คอมโพเนนต์ Text ที่ซ้อนกันทั้งหมดจะสืบทอดสไตล์เหล่านี้ สามารถแทนที่ props ใดก็ได้ใน Text ภายในโดยกำหนดค่าเฉพาะ ซึ่งประหยัดโค้ดและทำให้โครงสร้างสะอาดขึ้น

การจัดสไตล์ข้อความและฟอนต์

Text รองรับคุณสมบัติ CSS ส่วนใหญ่สำหรับการพิมพ์: fontFamily, fontSize, fontWeight, fontStyle, color, letterSpacing, lineHeight, textAlign, textDecorationLine, textTransform ใน React Native ฟอนต์ถูกเชื่อมต่อที่ระดับแพลตฟอร์ม ไม่ใช่ผ่าน @font-face

การใช้ฟอนต์ที่กำหนดเอง

ในการใช้ฟอนต์ที่กำหนดเอง ต้องเพิ่มลงในโฟลเดอร์ assets/fonts และระบุใน react-native.config.js หลังจากสร้างแอปพลิเคชันใหม่ ฟอนต์จะพร้อมใช้งานผ่าน fontFamily React Native ไม่รองรับฟอนต์เว็บ (Google Fonts) โดยตรง — ต้องดาวน์โหลดไฟล์ .ttf หรือ .otf

การสืบทอดสไตล์และการลดหลั่น

กลไกการสืบทอดใน Text แตกต่างจาก CSS สไตล์จะถูกส่งจาก Text ไปยัง Text ที่ซ้อนกันเท่านั้น แต่ไม่ใช่จาก View ไปยัง Text ในการกำหนดฟอนต์สำหรับทั้งแอปพลิเคชัน ให้ใช้ defaultProps ของคอมโพเนนต์ Text หรือคอมโพเนนต์ตัวห่อที่กำหนดเอง

js
<Text style={{ fontSize: 18, color: '#333' }}>
    This text is 18px and color #333
    <Text style={{ fontWeight: 'bold', color: '#007AFF' }}>
        bold and blue
    </Text>
    back to #333 color
</Text>

ในตัวอย่างนี้ Text ภายนอกกำหนด fontSize: 18 และ color: #333 Text ภายในสืบทอด fontSize (18) แต่แทนที่ fontWeight เป็น bold และ color เป็น #007AFF Text ภายนอกสืบทอดเฉพาะสไตล์ของตัวเองเท่านั้น นี่คือการเปรียบเทียบที่ตรงกับวิธีที่ span ซ้อนกันทำงานใน HTML

ตัวอย่างเชิงปฏิบัติกับ Text

มาดูกรณีการใช้งานทั่วไปสองกรณีของ Text ใน React Native: การจัดรูปแบบข้อความด้วยการซ้อนกันและการสร้างคอมโพเนนต์ที่คลิกได้พร้อมการจำกัดบรรทัด

ตัวอย่างที่ 1: การ์ดข่าวพร้อมการจัดรูปแบบ

ในตัวอย่างนี้ Text ใช้เพื่อแสดงข้อความหลายบรรทัดพร้อมองค์ประกอบที่เน้น: หัวเรื่อง วันที่ และเนื้อหาพร้อมลิงก์

js
const NewsCard = ({ title, date, content }) => (
    <View style={styles.card}>
        <Text style={styles.title}>{title}</Text>
        <Text style={styles.date}>{date}</Text>
        <Text style={styles.content}>
            {content}
            {' ' }
            <Text
                style={styles.link}
                onPress={() => Linking.openURL(url)}
            >
                Read more
            </Text>
        </Text>
    </View>
);

โครงสร้างนี้มีคอมโพเนนต์ Text อิสระสามตัว (หัวเรื่อง วันที่ เนื้อหา) แต่ละตัวมีสไตล์ของตนเอง ภายใน Text เนื้อหา มี Text อีกตัวที่มี onPress ซ้อนอยู่สำหรับลิงก์ รูปแบบนี้ใช้สำหรับฟีดข่าว บล็อก และความคิดเห็น

ตัวอย่างที่ 2: ข้อความพร้อมการจำกัดบรรทัด

สำหรับการแสดงตัวอย่างข้อความด้วยจุดไข่ปลา จะใช้ numberOfLines ซึ่งเป็นรูปแบบมาตรฐานสำหรับการ์ดผลิตภัณฑ์และรายการบทความ

js
<Text
    numberOfLines={2}
    ellipsizeMode="tail"
    style={styles.preview}
>
    {longDescription}
</Text>

คุณสมบัติ numberOfLines = 2 จำกัดข้อความไว้ที่สองบรรทัด หากข้อความยาวกว่า React Native จะเพิ่มจุดไข่ปลาที่ท้ายบรรทัดที่สองโดยอัตโนมัติ พารามิเตอร์ ellipsizeMode: 'tail' ระบุว่าจุดไข่ปลาควรอยู่ที่ท้าย (head, middle และ clip ก็พร้อมใช้งาน)

คำถามที่พบบ่อย

ทำไม React Native ถึงไม่มีแท็ก h1, p, span?

React Native ใช้ชุดคอมโพเนนต์ขั้นต่ำสำหรับความเข้ากันได้ข้ามแพลตฟอร์ม แทนที่จะใช้แท็ก HTML เชิงความหมายหลายแท็ก จะใช้ Text เดียวที่มีสไตล์ต่างกัน ซึ่งช่วยลดความซับซ้อนของการเรนเดอร์บนทั้งสองแพลตฟอร์มจากฐานโค้ดเดียว

สามารถใช้ Text เป็นปุ่มได้หรือไม่?

ได้ Text รองรับ onPress และ onLongPress สำหรับจัดการสัมผัส อย่างไรก็ตาม สำหรับปุ่มที่ต้องการการตอบสนองทางภาพ (การเน้นเมื่อกด) ควรใช้ TouchableOpacity หรือ Pressable โดยมี Text อยู่ภายใน Text.onPress ไม่ได้ให้การบ่งชี้ทางภาพเมื่อกดตามค่าเริ่มต้น

ทำไมข้อความของฉันถึงไม่ตัดบรรทัด?

Text จะตัดบรรทัดยาวโดยอัตโนมัติภายในคอนเทนเนอร์เท่านั้น หากข้อความไม่ตัดบรรทัด ให้ตรวจสอบ: ว่า View หลักมีข้อจำกัดด้านความกว้างหรือไม่ มีการตั้งค่า nowrap ในสไตล์หรือไม่ และ numberOfLines ไม่เกินจำนวนบรรทัดที่มีอยู่หรือไม่

จะทำให้ข้อความหนาภายใน Text ได้อย่างไร?

ใช้ Text ที่ซ้อนกันด้วย fontWeight: 'bold' หรือห่อข้อความในคอมโพเนนต์ที่มีสไตล์นี้ คุณยังสามารถใช้ fontWeight: '700' หรือ '800' เพื่อให้ดูหนาขึ้น ความหนาขึ้นอยู่กับความพร้อมใช้งานของตระกูลฟอนต์ที่เกี่ยวข้องบนอุปกรณ์

Text สามารถมีรูปภาพได้หรือไม่?

ไม่ Text สามารถมีได้เฉพาะคอมโพเนนต์ Text อื่นหรือสตริงเท่านั้น Image ไม่สามารถเป็นลูกของ Text ได้ ในการแสดงข้อความพร้อมไอคอน ให้ใช้ View โดยมี Text และ Image เป็นองค์ประกอบพี่น้องหรือคอมโพเนนต์ที่รองรับภาพแบบอินไลน์

สรุป

  • Text เป็นคอมโพเนนต์ React Native เพียงตัวเดียวสำหรับแสดงข้อความ แทนที่ p, span, h1-h6 จากเว็บ
  • รองรับการซ้อนกันพร้อมการสืบทอดสไตล์จากคอมโพเนนต์ Text หลัก
  • props หลัก: numberOfLines, ellipsizeMode, onPress, selectable, adjustsFontSizeToFit
  • Text เรนเดอร์เป็น UILabel ดั้งเดิม (iOS) หรือ TextView (Android)
  • ฟอนต์ถูกเชื่อมต่อที่ระดับแพลตฟอร์มผ่าน fontFamily ใน StyleSheet
  • สไตล์ Text ไม่ได้รับการสืบทอดจาก View — จำเป็นต้องกำหนดอย่างชัดเจนหรือใช้ defaultProps
  • สำหรับลิงก์ที่คลิกได้ ให้ใช้ Text ที่ซ้อนกันด้วย onPress ไม่ใช่ TouchableOpacity

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม