Flexbox layout
React Native-д бүх View автоматаар Flexbox ашигладаг. Flexbox бол element-үүдийг эгнээнд эсвэл баганад зохион байгуулах систем. Нэг удаа сайн ойлговол дурын нарийн layout-ийг хийж чадна — энэ бол React Native-н layout-н гол мэдлэг.
Үндсэн тэнхлэгүүд
Flexbox-д хоёр тэнхлэг байдаг:
- Main axis (үндсэн тэнхлэг) —
flexDirection-оор тодорхойлогдоно - Cross axis (хөндлөн тэнхлэг) — үндсэнтэй перпендикуляр
React Native-д flexDirection-н анхдагч утга нь 'column' — элементүүд дороос доош эгнэнэ. Вэбийн CSS-д 'row' байдагтай харьцуулбал эсрэг.
import { View, Text, StyleSheet } from "react-native";
export default function App() {
return (
<View style={styles.container}>
{/* Баганад (column) — анхдагч */}
<View style={styles.column}>
<View style={styles.box}>
<Text style={styles.label}>1</Text>
</View>
<View style={styles.box}>
<Text style={styles.label}>2</Text>
</View>
<View style={styles.box}>
<Text style={styles.label}>3</Text>
</View>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: "#0b1120", padding: 20 },
column: { flexDirection: "column", gap: 8 },
box: {
backgroundColor: "#22d3ee",
padding: 16,
borderRadius: 8,
alignItems: "center",
},
label: { color: "#0b1120", fontWeight: "bold", fontSize: 16 },
});
justifyContent ба alignItems
Эдгээр хоёр өмч нь element-үүдийг тэнхлэгийн дагуу байршуулдаг:
justifyContent — үндсэн тэнхлэгийн дагуу байршуулна:
'flex-start'— эхлэлд (анхдагч)'flex-end'— төгсгөлд'center'— голд'space-between'— хоорондын зайг тэгш хуваана'space-around'— эргэн тойрон тэгш зай
alignItems — хөндлөн тэнхлэгийн дагуу байршуулна:
'flex-start'— зүүн/дээр'flex-end'— баруун/доор'center'— голд'stretch'— сунгана (анхдагч)
const styles = StyleSheet.create({
// Дэлгэцийн яг голд байршуулах
centered: {
flex: 1,
justifyContent: "center",
alignItems: "center",
backgroundColor: "#0b1120",
},
// Хэвтээ эгнээ, тэгш зайтай
row: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
padding: 16,
},
});
flex: 1 гэж юу гэсэн үг вэ?
flex: 1 нь "боломжтой бүх зайг эзэл" гэсэн утгатай. Хоёр element хоёулаа flex: 1 байвал тэнцүү хуваана. flex: 2 нь flex: 1-ийнхээс хоёр дахин их зай авна:
import { View, StyleSheet } from "react-native";
export default function App() {
return (
<View style={styles.container}>
<View style={[styles.panel, { flex: 1, backgroundColor: "#1e3a5f" }]} />
<View style={[styles.panel, { flex: 2, backgroundColor: "#0f172a" }]} />
<View style={[styles.panel, { flex: 1, backgroundColor: "#1e3a5f" }]} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: "row",
backgroundColor: "#0b1120",
},
panel: {
borderWidth: 1,
borderColor: "#1e293b",
},
});
Дотроос нь: нийт 4 flex unit байгаа тул дунд нь 2/4 = 50%, хажуу талууд тус бүр 1/4 = 25% авна.
Бодит жишээ: navigation bar
import { View, Text, StyleSheet } from "react-native";
export default function NavBar() {
return (
<View style={styles.navbar}>
<Text style={styles.logo}>ulaanbaatar.app</Text>
<View style={styles.actions}>
<Text style={styles.link}>Сургалтууд</Text>
<Text style={styles.link}>Профайл</Text>
</View>
</View>
);
}
const styles = StyleSheet.create({
navbar: {
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
backgroundColor: "#0f172a",
paddingHorizontal: 20,
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: "#1e293b",
},
logo: {
fontSize: 16,
fontWeight: "bold",
color: "#22d3ee",
},
actions: {
flexDirection: "row",
gap: 20,
},
link: {
fontSize: 14,
color: "#94a3b8",
},
});
Дараагийн хичээлд:
Flexbox-оор layout хийж сурлаа. Дараагийн хичээлд TouchableOpacity ба Pressable — хэрэглэгч дарахад хариу үйлдэл хийдэг товч, дарах элементүүдийг хийнэ. Апп интерактив болно!