React Native ist ein Open-Source-Framework von Meta für Apps auf Android und iOS. Programmiert wird in JavaScript oder TypeScript mit React.
View und Text werden zu echten nativen
UI-Elementen von Android bzw. iOSExpo Snack ist eine Entwicklungsumgebung für React Native im Browser.
Der Code liegt in src/, nach Aufgaben in Ordner aufgeteilt.
src/
├── app/ Routen (Screens), _layout.tsx
├── ui/ Komponenten, Hooks (ViewModels), Theme
├── model/ Datenmodell: City, CurrentWeather
└── data/ Datenquellen: Fake-Daten, Repositorys
└── api/ DTOs für die API (ab Schritt 9)
app.json Name, Icon, Einstellungen der App
package.json Abhängigkeiten und SkripteIn React ist alles eine Komponente: eine Funktion, die beschreibt, was angezeigt wird.
import { Text, View } from 'react-native';
export function WeatherScreen() {
return (
<View>
<Text>Lörrach</Text>
<Text>14 °C</Text>
</View>
);
}Fast Refresh: Speichern genügt, die Änderung ist sofort im Emulator.
r im Terminal): App neu laden, State geht verlorenJede View ist ein Flexbox-Container. Ohne weitere Angabe stehen die Kinder untereinander.
flexDirection: 'column' (Standard): untereinanderflexDirection: 'row': nebeneinanderjustifyContent: Verteilung entlang der HauptachsealignItems: Ausrichtung quer zur Hauptachseflex: 1: nimmt den freien Platz einDie Verschachtelung im Code entspricht der Verschachtelung auf dem Bildschirm.
<View style={styles.card}>
<Text style={styles.city}>Lörrach</Text>
<Text style={styles.emoji}>⛅</Text>
<Text style={styles.temperature}>14 °C</Text>
<View style={styles.row}>
<Text>Wind: 8 km/h</Text>
<Text>Teilweise bewölkt</Text>
</View>
</View>Statt Modifier gibt es die Eigenschaft style, gesammelt in einem StyleSheet am Ende der Datei.
const styles = StyleSheet.create({
card: {
margin: 16, // außen
padding: 24, // innen
borderRadius: 24,
backgroundColor: '#BBDEFB',
alignItems: 'center',
},
// city, emoji, temperature, row …
});Statt fester Texte bekommen Komponenten nun Daten als Props. Die Form der Daten beschreiben Typen in TypeScript.
export type City = {
name: string;
latitude: number;
longitude: number;
};Komponenten sollten Daten als Props erhalten und sie nicht eigenständig holen.
type CurrentWeatherCardProps = {
city: City;
weather: CurrentWeather;
};
function CurrentWeatherCard({ city, weather }: CurrentWeatherCardProps) {
return (
<View style={styles.card}>
<Text style={styles.city}>{city.name}</Text>
{/* ... Emoji, Temperatur, Wind und Wetterlage */}
</View>
);
}Den Header zeigt der Stack aus dem Layout. Jeder Screen setzt seinen Titel selbst.
export function WeatherScreen({ city, weather }: WeatherScreenProps) {
return (
<ScrollView>
<Stack.Screen options={{ title: city.name }} />
<CurrentWeatherCard city={city} weather={weather} />
</ScrollView>
);
}highlighted, die die Karte mit einem Rahmen hervorhebt