06 β Input va tugmalar¶
β¬ οΈ Oldingi: 05 β Flexbox va layout Β· π Kitob boshi Β· Keyingi: 07 β ScrollView, SafeArea, StatusBar β‘οΈ
Bu bobda: ilovangizni "tirik" qilamiz β foydalanuvchi bilan suhbat boshlaymiz.
TextInputbilan matn kiritishni,Button,PressablevaTouchableOpacitybilan tugma bosishni o'rganamiz. Controlled input (holat bilan bog'langan kiritish maydoni), klaviatura boshqaruvi,Switchva oxirida to'liq kirish formasini yasaymiz.
Suhbat boshlaymiz¶
Hozirgacha biz yasagan ekranlar bir tomonlama edi: ilova matn ko'rsatardi, foydalanuvchi esa faqat tomosha qilardi. Bu β devorga osilgan plakat kabi: chiroyli, ammo siz unga gapira olmaysiz.
Endi esa suhbat boshlaymiz. Suhbat ikki tomonlama bo'ladi:
- Foydalanuvchi sizga gapiradi β matn kiritadi (ismi, paroli, izohi).
- Foydalanuvchi sizga ishora qiladi β tugma bosadi ("Yuborish", "Saqlash", "Yoqish").
- Ilova esa javob beradi β ekranni yangilaydi, xabar chiqaradi.
Hayotiy o'xshatish. Tasavvur qiling, kassada turibsiz. Siz kassirga ismingizni aytasiz (matn kiritish) va "to'lov" tugmasini bosasiz. Kassir eshitadi, tushunadi va chek beradi.
TextInputβ siz gapiradigan mikrofon; tugma β siz bosadigan "to'lov" knopkasi; ilova β sizni eshituvchi kassir.
Bu bob β mobil ilovangizning eshitish va his qilish a'zolarini yasaydi. Boshlaymiz.
TextInput β matn kiritish maydoni¶
TextInput β foydalanuvchi klaviaturadan matn yozadigan maydon. Web'dagi <input> ning React Native'dagi ukasi.
Eng oddiy ko'rinishi:
// app/index.tsx
import { View, TextInput, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<TextInput placeholder="Ismingizni yozing" style={styles.input} />
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
input: {
borderWidth: 1,
borderColor: '#cbd5e1',
borderRadius: 10,
paddingVertical: 12,
paddingHorizontal: 14,
fontSize: 16,
},
});
Bu kodni ishga tushirsangiz, ekranda yozish mumkin bo'lgan maydon paydo bo'ladi. placeholder β maydon bo'sh turganda ko'rinadigan kulrang yo'l-yo'riq matn ("Ismingizni yozing"). Foydalanuvchi yoza boshlasa, u yo'qoladi.
TextInput stilsiz deyarli ko'rinmaydi
TextInput ning o'zida chegara (border) bo'lmaydi β u faqat shaffof maydon. Shuning uchun borderWidth, borderColor va padding qo'shmasak, foydalanuvchi qayerga bosishni bilmaydi. Har doim stil bering.
TextInput ning foydali xususiyatlari¶
TextInput da ko'p sozlama bor. Eng kerakliarini ko'rib chiqamiz:
| Xususiyat | Vazifasi | Misol |
|---|---|---|
placeholder |
Bo'sh maydon yo'l-yo'rig'i | placeholder="Email" |
keyboardType |
Qanday klaviatura ochilsin | keyboardType="numeric" |
secureTextEntry |
Yozilganni yulduzcha bilan yashir (parol) | secureTextEntry |
multiline |
Bir necha qatorli matn | multiline |
maxLength |
Eng ko'pi bilan necha belgi | maxLength={10} |
autoCapitalize |
Bosh harf qoidasi | autoCapitalize="words" |
autoFocus |
Ekran ochilishi bilan klaviatura ochilsin | autoFocus |
editable |
O'zgartirsa bo'ladimi | editable={false} |
keyboardType β ayniqsa foydali. U telefon klaviaturasining qanday ko'rinishini boshqaradi:
"default"β oddiy harf klaviaturasi."numeric"β faqat raqamlar (yosh, miqdor uchun)."email-address"β@belgisi qo'l ostida bo'ladi."phone-pad"β telefon raqami uchun raqam paneli.
Misol β turli klaviaturalar:
// app/index.tsx
import { View, TextInput, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<TextInput
placeholder="email@misol.uz"
keyboardType="email-address"
autoCapitalize="none"
style={styles.input}
/>
<TextInput
placeholder="Yoshingiz"
keyboardType="numeric"
style={styles.input}
/>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20, gap: 12 },
input: {
borderWidth: 1,
borderColor: '#cbd5e1',
borderRadius: 10,
paddingVertical: 12,
paddingHorizontal: 14,
fontSize: 16,
},
});
Email maydonida autoCapitalize=\"none\"
Telefon odatda har gapni bosh harf bilan boshlaydi. Email manzili esa har doim kichik harf bo'ladi (Oqil@... noto'g'ri). Shuning uchun email maydonida autoCapitalize="none" yozing β telefon birinchi harfni katta qilib yuvormaydi.
autoCapitalize ning qiymatlari: "none" (hech qachon), "sentences" (har gap boshida β default), "words" (har so'z boshida β ism uchun yaxshi), "characters" (hammasi katta).
Controlled input β holat bilan bog'lash¶
Yuqoridagi maydonlarning bitta katta kamchiligi bor: biz foydalanuvchi nima yozganini bilmaymiz! Maydon o'zicha matnni saqlaydi, lekin bizning kodimiz uni o'qiy olmaydi.
Buni hal qilish uchun maydonni holatga (state) bog'laymiz. Bu "controlled input" (boshqariladigan kiritish) deyiladi.
Hayotiy o'xshatish. Tasavvur qiling, doskaga kimdir yozyapti, lekin yonida sizning daftaringiz ham bor. Har safar doskaga harf yozilganda, siz o'sha harfni daftaringizga ko'chirasiz. Endi doskada nima bo'lsa, daftaringizda ham aynan shu turadi β ikkisi doim bir xil. Doska β TextInput, daftar β holat (state). Ikkisi bir-biriga bog'langan.
Buning uchun ikkita narsa kerak:
valueβ maydonda nima ko'rinishi (holatdan keladi).onChangeTextβ foydalanuvchi yozganda nima qilish (holatni yangilaydi).
Holatni esa useState bilan saqlaymiz.
useState bu yerda β chuqur 09-bobda
useState β komponentga "xotira" beradigan React hook'i (asbobi). Hozircha shunchaki ishlatib ko'ramiz; uning to'liq sirlarini 09-bobda ochamiz. Hozir esa shuni bilsangiz yetadi: useState('') bizga ikkita narsa beradi β joriy qiymat va uni o'zgartiradigan funksiya.
Mana, controlled input:
// app/index.tsx
import { useState } from 'react';
import { View, TextInput, Text, StyleSheet } from 'react-native';
export default function Index() {
// ism = joriy qiymat, setIsm = uni o'zgartiruvchi funksiya
const [ism, setIsm] = useState('');
return (
<View style={styles.box}>
<TextInput
value={ism} // maydonda holatdagi qiymat ko'rinadi
onChangeText={setIsm} // yozilganda holatni yangilaymiz
placeholder="Ismingizni yozing"
style={styles.input}
/>
<Text style={styles.salom}>Salom, {ism}!</Text>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20, gap: 16 },
input: {
borderWidth: 1,
borderColor: '#cbd5e1',
borderRadius: 10,
paddingVertical: 12,
paddingHorizontal: 14,
fontSize: 16,
},
salom: { fontSize: 20, fontWeight: '700', color: '#1e293b' },
});
Ishga tushiring va yozib ko'ring: har bir harf yozganingizda, pastdagi "Salom, ..." matni darhol o'zgaradi! Sababi:
- Siz harf yozasiz.
onChangeTextchaqiriladi vasetIsmorqali holat yangilanadi.- Holat o'zgargani uchun komponent qayta chiziladi.
value={ism}va{ism}yangi qiymatni ko'rsatadi.
Bu aylanmani diagrammada ko'ramiz:
Diagrammadagi asosiy g'oya: holat β yagona haqiqat manbai. Ekranda nima ko'rinsa, holatda ham aynan shu turadi. Bu React'ning eng muhim tamoyili.
onChangeText, onChange emas
Web'da onChange ishlatiladi va u hodisa obyektini beradi. React Native'da esa onChangeText bor va u to'g'ridan-to'g'ri matn satrini beradi. Shuning uchun onChangeText={setIsm} shunday qisqa yozilishi mumkin β setIsm matnni qabul qiladi. Aralashtirib yubormang.
onSubmitEditing β "tayyor" tugmasini bosish¶
Klaviaturada "tayyor" (return/enter) tugmasi bosilganda biror ish qilish uchun onSubmitEditing ishlatiladi:
<TextInput
value={ism}
onChangeText={setIsm}
placeholder="Ism"
onSubmitEditing={() => console.log('Tayyor bosildi:', ism)}
style={styles.input}
/>
Buni qidiruv maydonida ko'p ishlatamiz: foydalanuvchi yozib bo'lib, klaviaturada "qidirish" tugmasini bossa, qidiruv boshlanadi.
Tugmalar β uch xil yo'l¶
Endi tugmaga o'tamiz. React Native'da tugma yasashning uch yo'li bor. Ularning farqini bilish muhim, chunki ko'pchilik boshlovchilar noto'g'risini tanlaydi.
1. Button β eng oddiy¶
Button β bir qatorda tayyor tugma. Faqat ikki narsa kerak: title (yozuvi) va onPress (bosilganda nima bo'lishi).
// app/index.tsx
import { View, Button, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<Button title="Bos" onPress={() => console.log('Bosildi!')} />
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
});
Button ning kuchli tomoni β soddaligi. Bir qatorda tayyor.
Button ning kamchiligi β uni deyarli bezab bo'lmaydi. Rangini (color) o'zgartirish mumkin, xolos. Ichiga ikonka qo'sha olmaysiz, burchaklarini yumaloqlay olmaysiz, padding bera olmaysiz. Eng yomoni β u iOS'da boshqacha, Android'da boshqacha ko'rinadi (iOS'da rangli matn, Android'da rangli to'rtburchak).
iOS va Android farqi
Button har platformaning o'z uslubiga bo'ysunadi: iOS'da u rangli matn ko'rinishida, Android'da esa to'ldirilgan rangli to'rtburchak ko'rinishida chiqadi. Agar ilovangiz ikkala platformada bir xil ko'rinishi kerak bo'lsa, Button o'rniga Pressable ishlating.
Button ni tez prototip yoki o'rganish uchun ishlating. Haqiqiy ilovada esa odatda Pressable ga o'tasiz.
2. Pressable β zamonaviy va kuchli¶
Pressable β bugungi tavsiya etiladigan usul. U shunchaki "bosish mumkin bo'lgan maydon" β ichiga istalgan narsani (matn, ikonka, View) qo'yasiz va to'liq stil erkinligiga ega bo'lasiz.
// app/index.tsx
import { View, Pressable, Text, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<Pressable
onPress={() => console.log('Pressable bosildi')}
style={styles.tugma}
>
<Text style={styles.tugmaMatn}>Bos meni</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
tugma: {
backgroundColor: '#4f46e5',
paddingVertical: 14,
paddingHorizontal: 24,
borderRadius: 10,
alignItems: 'center',
},
tugmaMatn: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
E'tibor bering: Pressable ning o'zi ko'rinmaydi β biz uni backgroundColor, padding, borderRadius bilan bezadik, ichiga esa <Text> qo'ydik. Demak, tugma ko'rinishini to'liq biz boshqaramiz, ikkala platformada bir xil chiqadi.
Pressable ichida matn β albatta <Text> da
<Pressable>Bos</Pressable> deb yozsangiz, ilova qulaydi! RN qoidasi: har qanday matn <Text> ichida bo'lishi shart. To'g'risi β <Pressable><Text>Bos</Text></Pressable>. Bu eng keng tarqalgan boshlovchi xatosi.
Pressable ning eng zo'r imkoniyati β bosilganda stilni o'zgartirish. Buni quyida alohida ko'ramiz.
3. TouchableOpacity β eski, lekin hali tirik¶
TouchableOpacity β Pressable dan oldingi avlod. U ham bosish maydoni yasaydi, lekin bitta o'ziga xos xususiyati bor: bosilganda xira (yarim shaffof) bo'lib qoladi β go'yo ekranga botgandek.
// app/index.tsx
import { View, TouchableOpacity, Text, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<TouchableOpacity
activeOpacity={0.6} // bosilganda 60% shaffoflik
onPress={() => console.log('Touchable bosildi')}
style={styles.tugma}
>
<Text style={styles.tugmaMatn}>Eski tugma</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
tugma: {
backgroundColor: '#0ea5e9',
paddingVertical: 14,
paddingHorizontal: 24,
borderRadius: 10,
alignItems: 'center',
},
tugmaMatn: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
activeOpacity β bosilgandagi shaffoflik darajasi (0 = ko'rinmas, 1 = o'zgarishsiz). Default 0.2.
TouchableOpacity ni hali ko'p kod bazalarida (ayniqsa eski loyihalarda) uchratasiz, shuning uchun uni bilib qo'yish kerak. Lekin yangi kod yozayotgan bo'lsangiz β Pressable tanlang: u kuchliroq va React Native jamoasi aynan uni tavsiya qiladi.
Qaysi birini tanlash kerak?¶
| Vaziyat | Tavsiya |
|---|---|
| Tez sinab ko'rish, o'rganish | Button |
| Yangi loyiha, chiroyli tugma | Pressable β
|
| Eski kodga qo'shimcha | TouchableOpacity (kod uslubiga moslab) |
Qoida sodda: shubha bo'lsa β Pressable.
Bosish hodisalari¶
Tugma faqat oddiy bosishni emas, balki turli xil teginishni eshitishi mumkin. Pressable (va TouchableOpacity) quyidagi hodisalarni qo'llab-quvvatlaydi:
| Hodisa | Qachon ishlaydi |
|---|---|
onPress |
Bosib qo'yib yuborilganda (oddiy bosish) |
onLongPress |
Uzoq bosib turilganda (~0.5 soniya) |
onPressIn |
Barmoq ekranga tegishi bilan (darhol) |
onPressOut |
Barmoq ekrandan ko'tarilganda |
Hayotiy o'xshatish. Eshik qo'ng'irog'ini tasavvur qiling.
onPressInβ barmoqni knopkaga qo'yganingiz.onPressOutβ barmoqni olganingiz.onPressβ to'liq "bosib-qo'yib yuborish" (qo'ng'iroq jiringladi).onLongPressβ knopkani uzoq bosib turganingiz (uzunroq jiringlash).
Hammasini bir tugmada ko'ramiz:
// app/index.tsx
import { useState } from 'react';
import { View, Pressable, Text, StyleSheet } from 'react-native';
export default function Index() {
const [holat, setHolat] = useState('Tegmagan');
return (
<View style={styles.box}>
<Pressable
onPress={() => setHolat('Bosildi')}
onLongPress={() => setHolat('Uzoq bosildi')}
onPressIn={() => setHolat('Barmoq tushdi')}
onPressOut={() => setHolat('Barmoq ko\'tarildi')}
style={styles.tugma}
>
<Text style={styles.tugmaMatn}>{holat}</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
tugma: {
backgroundColor: '#4f46e5',
paddingVertical: 16,
paddingHorizontal: 24,
borderRadius: 12,
alignItems: 'center',
},
tugmaMatn: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
Tugmani turlicha bosib ko'ring β yozuvi o'zgarib turadi. Ko'pgina hollarda sizga faqat onPress kerak bo'ladi; qolganlari maxsus holatlar uchun (masalan, uzoq bosganda kontekst menyu chiqarish).
Chiroyli tugma yasash β bosilganda effekt¶
Pressable ning eng yoqimli tomoni β bosilganda ko'rinishini o'zgartirish. Buning uchun style ga oddiy obyekt emas, funksiya beriladi. Bu funksiya pressed (bosilganmi?) qiymatini oladi:
<Pressable
style={({ pressed }) => [
styles.tugma, // doimiy stil
pressed && styles.tugmaBosilgan, // bosilganda qo'shiladigan stil
]}
>
style={({ pressed }) => [...]} β bu "agar pressed rost bo'lsa, tugmaBosilgan stilini ham qo'sh" degani. pressed && styles.tugmaBosilgan β JavaScript hiylasi: agar pressed true bo'lsa, stilni qaytaradi; false bo'lsa, hech narsa qo'shilmaydi.
To'liq misol:
// app/index.tsx
import { View, Pressable, Text, StyleSheet } from 'react-native';
export default function Index() {
return (
<View style={styles.box}>
<Pressable
onPress={() => console.log('Yuborildi')}
style={({ pressed }) => [
styles.tugma,
pressed && styles.tugmaBosilgan,
]}
>
<Text style={styles.tugmaMatn}>Yuborish</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20 },
tugma: {
backgroundColor: '#4f46e5',
paddingVertical: 14,
paddingHorizontal: 24,
borderRadius: 12,
alignItems: 'center',
},
// bosilganda: to'qroq rang
tugmaBosilgan: {
backgroundColor: '#4338ca',
},
tugmaMatn: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
Bosib ko'ring β tugma bosilganda rangi to'qlashadi va qo'yib yuborganingizda yana ochroq bo'ladi. Bu foydalanuvchiga "bosding, eshitdim" degan his beradi (UX uchun juda muhim).
Diagrammada bu jarayonni ko'ramiz:
Faqat rangni emas
tugmaBosilgan ichida xohlagan stilni o'zgartiring: rang, o'lcham (transform: [{ scale: 0.97 }]), shaffoflik (opacity: 0.8). Eng tabiiy his β rangni biroz to'qlashtirish yoki tugmani arzimas darajada kichraytirish.
Klaviaturani boshqarish¶
Klaviatura mobil ilovada doim "muammo" tug'diradi: u ekranning yarmini egallaydi va ba'zan kerakmas joyda ochilib qoladi. Bir nechta foydali asbob bilan tanishamiz.
returnKeyType β "tayyor" tugmasi ko'rinishi¶
Klaviaturadagi pastki-o'ng tugmaning yozuvini returnKeyType boshqaradi:
<TextInput
placeholder="Qidirish..."
returnKeyType="search" // "tayyor" o'rniga "qidirish" yozuvi
style={styles.input}
/>
Qiymatlari: "done" (tayyor), "go" (o'tish), "search" (qidirish), "send" (yuborish), "next" (keyingi). Bu klaviaturaning ko'rinishini foydalanuvchi maqsadiga moslaydi.
Keyboard.dismiss() β klaviaturani yopish¶
Ba'zan klaviaturani dasturiy yopish kerak (masalan, foydalanuvchi "tayyor" bosgach yoki bo'sh joyga tegganda). Buning uchun Keyboard modulidan foydalanamiz:
import { Keyboard, TextInput } from 'react-native';
<TextInput
placeholder="Izoh..."
returnKeyType="done"
onSubmitEditing={() => Keyboard.dismiss()} // "tayyor" bosilsa klaviatura yopiladi
style={styles.input}
/>
Keyboard.dismiss() β klaviaturani darhol yopadi. Uni onSubmitEditing ichida yoki tugma onPress ida chaqirish mumkin.
autoFocus β ekran ochilishi bilan yozish¶
Agar ekran ochilishi bilanoq foydalanuvchi yoza boshlashini xohlasangiz (masalan, qidiruv ekrani), autoFocus qo'shing:
Ekran ochilishi bilan klaviatura avtomatik ochiladi va kursor maydonga qo'yiladi.
KeyboardAvoidingView β keyingi bobda
Klaviatura ochilganda maydon uning ostida qolib ketmasligi uchun ekranni yuqoriga surish kerak bo'ladi. Buni KeyboardAvoidingView qiladi β uni 07-bobda batafsil ko'ramiz. Hozircha asosiy g'oyaga e'tibor qaratamiz.
Boshqa kiritish elementlari¶
Matn va tugmadan tashqari yana ikkita keng ishlatiladigan element bor.
Switch β yoqish/o'chirish¶
Switch β ON/OFF tugmachasi (telefon sozlamalaridagi kabi). Sozlamalar, "eslab qol" belgisi, "bildirishnoma yoqilsinmi?" uchun ideal.
Switch ham controlled: value (yoqilganmi?) va onValueChange (o'zgarganda) kerak.
// app/index.tsx
import { useState } from 'react';
import { View, Text, Switch, StyleSheet } from 'react-native';
export default function Index() {
const [yoqilgan, setYoqilgan] = useState(false);
return (
<View style={styles.box}>
<View style={styles.qator}>
<Text style={styles.matn}>Bildirishnoma</Text>
<Switch value={yoqilgan} onValueChange={setYoqilgan} />
</View>
<Text style={styles.holat}>
Bildirishnoma {yoqilgan ? 'yoqilgan' : 'o\'chirilgan'}
</Text>
</View>
);
}
const styles = StyleSheet.create({
box: { flex: 1, justifyContent: 'center', padding: 20, gap: 16 },
qator: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
matn: { fontSize: 18, color: '#1e293b' },
holat: { fontSize: 15, color: '#475569' },
});
Switch ni surganingizda holat o'zgaradi va pastdagi matn yangilanadi. E'tibor bering: TextInput da onChangeText, Switch da esa onValueChange β har element o'zgarishni o'z nomi bilan xabar qiladi.
Switch rangini moslash
trackColor={{ false: '#cbd5e1', true: '#4f46e5' }} bilan o'chiq/yoniq holatdagi "yo'l" rangini, thumbColor bilan esa dumaloq tugmacha rangini berishingiz mumkin.
Slider β qiymatni surib tanlash¶
Slider β qiymatni surib tanlaydigan element (ovoz balandligi, narx oralig'i uchun). U alohida paket orqali keladi (Expo'ning o'zida o'rnatilmagan):
import Slider from '@react-native-community/slider';
<Slider
minimumValue={0}
maximumValue={100}
value={ovoz}
onValueChange={setOvoz}
/>
Slider ni endi sanab o'tdik; uni ko'p loyihalarda kamroq ishlatasiz, shuning uchun batafsil to'xtalmaymiz. Asosiysi β bunday element borligini bilib qo'ying.
To'liq misol β kirish formasi¶
Endi hammasini birlashtiramiz: ism maydoni, parol maydoni, parolni ko'rsatish uchun Switch va "Yuborish" tugmasi. Tugma bosilganda Alert (qalqib chiquvchi xabar) ko'rsatamiz.
Alert.alert('Sarlavha', 'Matn') β telefonning tabiiy ogohlantirish oynasini chiqaradi.
// app/index.tsx
import { useState } from 'react';
import {
View,
Text,
TextInput,
Pressable,
Switch,
Alert,
Keyboard,
StyleSheet,
} from 'react-native';
export default function Index() {
const [ism, setIsm] = useState('');
const [parol, setParol] = useState('');
const [parolKorinsin, setParolKorinsin] = useState(false);
function yuborish() {
// oddiy tekshiruv: ism bo'sh bo'lmasin
if (ism.trim() === '') {
Alert.alert('Xato', 'Iltimos, ismingizni kiriting');
return;
}
Keyboard.dismiss(); // klaviaturani yopamiz
Alert.alert('Salom!', `Xush kelibsiz, ${ism}`);
}
return (
<View style={styles.forma}>
<Text style={styles.sarlavha}>Kirish</Text>
{/* Ism */}
<TextInput
value={ism}
onChangeText={setIsm}
placeholder="Ismingiz"
autoCapitalize="words"
style={styles.input}
/>
{/* Parol β secureTextEntry switch'ga bog'langan */}
<TextInput
value={parol}
onChangeText={setParol}
placeholder="Parol"
secureTextEntry={!parolKorinsin} // ko'rsatish yoqilsa, yashirishni o'chiramiz
style={styles.input}
/>
{/* Parolni ko'rsatish/yashirish */}
<View style={styles.qator}>
<Text style={styles.matn}>Parolni ko'rsatish</Text>
<Switch value={parolKorinsin} onValueChange={setParolKorinsin} />
</View>
{/* Yuborish tugmasi β bosilganda effekt bilan */}
<Pressable
onPress={yuborish}
style={({ pressed }) => [
styles.tugma,
pressed && styles.tugmaBosilgan,
]}
>
<Text style={styles.tugmaMatn}>Yuborish</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
forma: { flex: 1, justifyContent: 'center', padding: 20, gap: 14 },
sarlavha: { fontSize: 26, fontWeight: '700', color: '#1e293b', marginBottom: 8 },
input: {
borderWidth: 1,
borderColor: '#cbd5e1',
borderRadius: 10,
paddingVertical: 12,
paddingHorizontal: 14,
fontSize: 16,
},
qator: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
matn: { fontSize: 16, color: '#475569' },
tugma: {
backgroundColor: '#4f46e5',
paddingVertical: 14,
borderRadius: 10,
alignItems: 'center',
marginTop: 8,
},
tugmaBosilgan: { backgroundColor: '#4338ca' },
tugmaMatn: { color: '#fff', fontSize: 16, fontWeight: '600' },
});
Bu kichik forma β sizning birinchi haqiqiy interaktiv ekraningiz! Unda:
- Ikkita controlled input β ism va parol holatga bog'langan.
- Switch bilan parolni ko'rsatish β
secureTextEntry={!parolKorinsin}orqali.Switchyoqilsa, parol ochiq ko'rinadi. - Tekshiruv (validatsiya) β ism bo'sh bo'lsa, xato xabari chiqadi.
- Bosilganda effekt β
Pressabletugmasi bosilganda rangi to'qlashadi. - Alert β muvaffaqiyatda "Xush kelibsiz" oynasi.
Parolni ko'rsatish hiylasi
secureTextEntry={!parolKorinsin} β bu eng aqlli qism. parolKorinsin false bo'lsa (ko'rsatilmasin), !parolKorinsin true bo'ladi va parol yulduzcha bilan yashiriladi. Switch ni yoqsangiz, aksincha bo'ladi va parol ochiladi. Bitta holat ikkala maydon va tugmachani boshqaradi!
Eslatma β bu kod tekshirilgan. Yuqoridagi barcha kod namunalari jonli Expo SDK 56 loyihasida
npx tsc --noEmitbilan tip-tekshiruvidan o'tkazildi va xatosiz kompilyatsiya bo'ldi.
Xulosa¶
TextInputβ matn kiritish maydoni. Stil bermasangiz deyarli ko'rinmaydi.- Controlled input β
value+onChangeTextbilan maydonni holatga (useState) bog'lash. Holat β yagona haqiqat manbai; ekranda nima bo'lsa, holatda ham aynan shu. - TextInput xususiyatlari:
placeholder,keyboardType,secureTextEntry,multiline,maxLength,autoCapitalize,autoFocus,onSubmitEditing. - Tugmaning 3 yo'li:
Button(oddiy, lekin cheklangan),Pressable(zamonaviy, tavsiya etiladi),TouchableOpacity(eski, hali ishlatiladi). Pressableβstyle={({ pressed }) => [...]}bilan bosilganda stilni o'zgartiradi; ichiga istalgan narsani qo'yib, to'liq bezab bo'ladi.- Bosish hodisalari:
onPress,onLongPress,onPressIn,onPressOut. - Klaviatura:
returnKeyType,Keyboard.dismiss(),autoFocus. Switchβ yoqish/o'chirish;value+onValueChange.Sliderβ qiymatni surib tanlash (alohida paket).- Matn HAR DOIM
<Text>ichida βPressable/TouchableOpacityichida ham.
Amaliy mashqlar¶
-
Salomlashish ekrani. Bitta
TextInput(ism uchun) va bittaPressabletugma yasang. Tugma bosilgandaAlert.alertorqali "Salom, [ism]!" ko'rsating. Agar maydon bo'sh bo'lsa, "Iltimos, ism kiriting" xatosini chiqaring. -
Belgilar hisoblagichi.
multilineTextInputyasang (izoh uchun) vamaxLength={100}qo'ying. Maydon ostida "yozildi: X / 100" deb ko'rsating (maslahat:ism.lengthdan foydalaning, controlled input kerak). -
Parol ko'rsatish/yashirish. Parol
TextInputva yonidaSwitchyasang.Switchyoqilganda parol ochiq, o'chirilganda yashirin bo'lsin (secureTextEntryniSwitchholatiga bog'lang). -
Chiroyli tugma.
Pressablebilan tugma yasang: indigo rang, yumaloq burchak, ichida matn. Bosilganda rangi to'qlashsin vatransform: [{ scale: 0.97 }]bilan biroz kichraysin. (Maslahat:tugmaBosilganstiliga ikkala xususiyatni qo'shing.) -
Mini kalkulyator boshlanishi. Ikkita raqamli
TextInput(keyboardType="numeric") va "Qo'shish" tugmasini yasang. Tugma bosilganda ikki sonni qo'shib, natijaniTextda ko'rsating. (Maslahat: matn satrini songa aylantirish uchunNumber(qiymat)ishlating.)
β¬ οΈ Oldingi: 05 β Flexbox va layout Β· π Kitob boshi Β· Keyingi: 07 β ScrollView, SafeArea, StatusBar β‘οΈ