官方链接
Basic Components
TextInput
import React from "react";import { SafeAreaView, StyleSheet, TextInput } from "react-native";const App = () => {const [text, onChangeText] = React.useState("Useless Text");const [number, onChangeNumber] = React.useState("");return (<SafeAreaView><TextInputstyle={styles.input}onChangeText={onChangeText}value={text}/><TextInputstyle={styles.input}onChangeText={onChangeNumber}value={number}placeholder="useless placeholder"keyboardType="numeric"/></SafeAreaView>);};const styles = StyleSheet.create({input: {height: 40,margin: 12,borderWidth: 1,padding: 10,},});export default App;
ScrollView
import React from 'react';import { StyleSheet, Text, SafeAreaView, ScrollView, StatusBar } from 'react-native';const App = () => {return (<SafeAreaView style={styles.container}><ScrollView style={styles.scrollView}><Text style={styles.text}>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed doeiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim adminim veniam, quis nostrud exercitation ullamco laboris nisi utaliquip ex ea commodo consequat. Duis aute irure dolor inreprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed doeiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim adminim veniam, quis nostrud exercitation ullamco laboris nisi utaliquip ex ea commodo consequat. Duis aute irure dolor inreprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed doeiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim adminim veniam, quis nostrud exercitation ullamco laboris nisi utaliquip ex ea commodo consequat. Duis aute irure dolor inreprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur. Excepteur sint occaecat cupidatat non proident, sunt inculpa qui officia deserunt mollit anim id est laborum.</Text></ScrollView></SafeAreaView>);}const styles = StyleSheet.create({container: {flex: 1,paddingTop: StatusBar.currentHeight,},scrollView: {backgroundColor: 'pink',marginHorizontal: 20,},text: {fontSize: 42,},});export default App;
StyleSheet
import React from 'react';import { StyleSheet, Text, View } from 'react-native';const App = () => (<View style={container}><Text style={text}>React Native</Text></View>);const page = StyleSheet.create({container: {flex: 1,padding: 24,backgroundColor: '#fff',},text: {fontSize: 30,color: '#000'},});const lists = StyleSheet.create({listContainer: {flex: 1,paddingTop: 50,backgroundColor: '#61dafb',},listItem: {fontStyle: 'italic',fontWeight: 'bold'},});const container = StyleSheet.compose(page.container, lists.listContainer);const text = StyleSheet.compose(page.text, lists.listItem);export default App;
User Interface
Button
import React from 'react';import { StyleSheet, Button, View, SafeAreaView, Text, Alert } from 'react-native';const Separator = () => (<View style={styles.separator} />);const App = () => (<SafeAreaView style={styles.container}><View><Text style={styles.title}>The title and onPress handler are required. It is recommended to set accessibilityLabel to help make your app usable by everyone.</Text><Buttontitle="Press me"onPress={() => Alert.alert('Simple Button pressed')}/></View><Separator /><View><Text style={styles.title}>Adjust the color in a way that looks standard on each platform. On iOS, the color prop controls the color of the text. On Android, the color adjusts the background color of the button.</Text><Buttontitle="Press me"color="#f194ff"onPress={() => Alert.alert('Button with adjusted color pressed')}/></View><Separator /><View><Text style={styles.title}>All interaction for the component are disabled.</Text><Buttontitle="Press me"disabledonPress={() => Alert.alert('Cannot press this one')}/></View><Separator /><View><Text style={styles.title}>This layout strategy lets the title define the width of the button.</Text><View style={styles.fixToText}><Buttontitle="Left button"onPress={() => Alert.alert('Left button pressed')}/><Buttontitle="Right button"onPress={() => Alert.alert('Right button pressed')}/></View></View></SafeAreaView>);const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',marginHorizontal: 16,},title: {textAlign: 'center',marginVertical: 8,},fixToText: {flexDirection: 'row',justifyContent: 'space-between',},separator: {marginVertical: 8,borderBottomColor: '#737373',borderBottomWidth: StyleSheet.hairlineWidth,},});export default App;
Switch
import React, { useState } from "react";import { View, Switch, StyleSheet, Button } from "react-native";const App = () => {const [isEnabled, setIsEnabled] = useState(false);const toggleSwitch = () => setIsEnabled(previousState => !previousState);return (<View style={styles.container}><Buttondisabled={!isEnabled}title={isEnabled? 'Enabled' : 'Disabled'} /><SwitchtrackColor={{ false: "#767577", true: "#81b0ff" }}thumbColor={isEnabled ? "#f5dd4b" : "#f4f3f4"}ios_backgroundColor="#3e3e3e"onValueChange={toggleSwitch}value={isEnabled}/></View>);}const styles = StyleSheet.create({container: {flex: 1,flexDirection: "row",alignItems: "center",justifyContent: "space-between",marginLeft: 10,marginRight: 10,},button: {alignItems: 'center',backgroundColor: '#DDDDDD',padding: 10,marginBottom: 10}});export default App;
List Views
FlatList
import React from 'react';import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar } from 'react-native';const DATA = [{id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',title: 'First Item',},{id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',title: 'Second Item',},{id: '58694a0f-3da1-471f-bd96-145571e29d72',title: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \minim veniam, quis nostrud exercitation ullamco laboris nisi ut \aliquip ex ea commodo consequat. Duis aute irure dolor in \reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \pariatur. Excepteur sint occaecat cupidatat non proident, sunt in \culpa qui officia deserunt mollit anim id est laborum. \Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \minim veniam, quis nostrud exercitation ullamco laboris nisi ut \aliquip ex ea commodo consequat. Duis aute irure dolor in \reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \pariatur. Excepteur sint occaecat cupidatat non proident, sunt in \culpa qui officia deserunt mollit anim id est laborum. \Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do \eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \minim veniam, quis nostrud exercitation ullamco laboris nisi ut \aliquip ex ea commodo consequat. Duis aute irure dolor in \reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \pariatur. Excepteur sint occaecat cupidatat non proident, sunt in \culpa qui officia deserunt mollit anim id est laborum.',},];const Item = ({ title }) => (<View style={styles.item}><Text style={styles.title}>{title}</Text></View>);const App = () => {const renderItem = ({ item }) => (<Item title={item.title} />);return (<SafeAreaView style={styles.container}><FlatListdata={DATA}renderItem={renderItem}keyExtractor={item => item.id}/></SafeAreaView>);}const styles = StyleSheet.create({container: {flex: 1,marginTop: StatusBar.currentHeight || 0,},item: {backgroundColor: '#f9c2ff',padding: 20,marginVertical: 8,marginHorizontal: 16,},title: {fontSize: 32,},});export default App;
SectionList
import React from "react";import { StyleSheet, Text, View, SafeAreaView, SectionList, StatusBar } from "react-native";const DATA = [{title: "Main dishes",data: ["Pizza", "Burger", "Risotto"]},{title: "Sides",data: ["French Fries", "Onion Rings", "Fried Shrimps"]},{title: "Drinks",data: ["Water", "Coke", "Beer"]},{title: "Desserts",data: ["Cheese Cake", "Ice Cream"]}];const Item = ({ title }) => (<View style={styles.item}><Text style={styles.title}>{title}</Text></View>);const App = () => (<SafeAreaView style={styles.container}><SectionListsections={DATA}keyExtractor={(item, index) => item + index}renderItem={({ item }) => <Item title={item} />}renderSectionHeader={({ section: { title } }) => (<Text style={styles.header}>{title}</Text>)}/></SafeAreaView>);const styles = StyleSheet.create({container: {flex: 1,paddingTop: StatusBar.currentHeight,marginHorizontal: 16},item: {backgroundColor: "#f9c2ff",padding: 20,marginVertical: 8},header: {fontSize: 32,backgroundColor: "#fff"},title: {fontSize: 24}});export default App;
Others
ActivityIndicator
import React from "react";import { ActivityIndicator, StyleSheet, Text, View } from "react-native";const App = () => (<View style={[styles.container, styles.horizontal]}><ActivityIndicator /><ActivityIndicator size="large" /><ActivityIndicator size="small" color="#0000ff" /><ActivityIndicator size="large" color="#00ff00" /></View>);const styles = StyleSheet.create({container: {flex: 1,justifyContent: "center"},horizontal: {flexDirection: "row",justifyContent: "space-around",padding: 10}});export default App;
Alert
import React, { useState } from "react";import { View, StyleSheet, Button, Alert } from "react-native";const App = () => {const createTwoButtonAlert = () =>Alert.alert("Alert Title","My Alert Msg",[{text: "Cancel",onPress: () => console.log("Cancel Pressed"),style: "cancel"},{ text: "OK", onPress: () => console.log("OK Pressed") }]);const createThreeButtonAlert = () =>Alert.alert("Alert Title","My Alert Msg",[{text: "Ask me later",onPress: () => console.log("Ask me later pressed")},{text: "Cancel",onPress: () => console.log("Cancel Pressed"),style: "cancel"},{ text: "OK", onPress: () => console.log("OK Pressed") }]);return (<View style={styles.container}><Button title={"2-Button Alert"} onPress={createTwoButtonAlert} /><Button title={"3-Button Alert"} onPress={createThreeButtonAlert} /></View>);}const styles = StyleSheet.create({container: {flex: 1,justifyContent: "space-around",alignItems: "center"}});export default App;
Animated
import React, { useRef } from "react";import { Animated, Text, View, StyleSheet, Button, SafeAreaView } from "react-native";const App = () => {// fadeAnim will be used as the value for opacity. Initial Value: 0const fadeAnim = useRef(new Animated.Value(0)).current;const fadeIn = () => {// Will change fadeAnim value to 1 in 5 secondsAnimated.timing(fadeAnim, {toValue: 1,duration: 5000,useNativeDriver: true,}).start();};const fadeOut = () => {// Will change fadeAnim value to 0 in 3 secondsAnimated.timing(fadeAnim, {toValue: 0,duration: 3000,useNativeDriver: true,}).start();};return (<SafeAreaView style={styles.container}><Animated.Viewstyle={[styles.fadingContainer,{// Bind opacity to animated valueopacity: fadeAnim}]}><Text style={styles.fadingText}>Fading View!</Text></Animated.View><View style={styles.buttonRow}><Button title="Fade In View" onPress={fadeIn} /><Button title="Fade Out View" onPress={fadeOut} /></View></SafeAreaView>);}const styles = StyleSheet.create({container: {flex: 1,alignItems: "center",justifyContent: "center"},fadingContainer: {padding: 20,backgroundColor: "powderblue"},fadingText: {fontSize: 28},buttonRow: {flexBasis: 100,justifyContent: "space-evenly",marginVertical: 16}});export default App;
Dimensions
import React, { useState, useEffect } from "react";import { View, StyleSheet, Text, Dimensions } from "react-native";const window = Dimensions.get("window");const screen = Dimensions.get("screen");const App = () => {const [dimensions, setDimensions] = useState({ window, screen });useEffect(() => {const subscription = Dimensions.addEventListener("change",({ window, screen }) => {setDimensions({ window, screen });});return () => subscription?.remove();});return (<View style={styles.container}><Text style={styles.header}>Window Dimensions</Text>{Object.entries(dimensions.window).map(([key, value]) => (<Text>{key} : {value}</Text>))}<Text style={styles.header}>Screen Dimensions</Text>{Object.entries(dimensions.screen).map(([key, value]) => (<Text>{key} : {value}</Text>))}</View>);}const styles = StyleSheet.create({container: {flex: 1,justifyContent: "center",alignItems: "center"},header: {fontSize: 16,marginVertical: 10}});export default App;
KeyboardAvoidingView
import React from 'react';import { View, KeyboardAvoidingView, TextInput, StyleSheet, Text, Platform, TouchableWithoutFeedback, Button, Keyboard } from 'react-native';const KeyboardAvoidingComponent = () => {return (<KeyboardAvoidingViewbehavior={Platform.OS === "ios" ? "padding" : "height"}style={styles.container}><TouchableWithoutFeedback onPress={Keyboard.dismiss}><View style={styles.inner}><Text style={styles.header}>Header</Text><TextInput placeholder="Username" style={styles.textInput} /><View style={styles.btnContainer}><Button title="Submit" onPress={() => null} /></View></View></TouchableWithoutFeedback></KeyboardAvoidingView>);};const styles = StyleSheet.create({container: {flex: 1},inner: {padding: 24,flex: 1,justifyContent: "space-around"},header: {fontSize: 36,marginBottom: 48},textInput: {height: 40,borderColor: "#000000",borderBottomWidth: 1,marginBottom: 36},btnContainer: {backgroundColor: "white",marginTop: 12}});export default KeyboardAvoidingComponent;
Linking
https://reactnative.dev/docs/linking
Modal
import React, { useState } from "react";import { Alert, Modal, StyleSheet, Text, Pressable, View } from "react-native";const App = () => {const [modalVisible, setModalVisible] = useState(false);return (<View style={styles.centeredView}><ModalanimationType="slide"transparent={true}visible={modalVisible}onRequestClose={() => {Alert.alert("Modal has been closed.");setModalVisible(!modalVisible);}}><View style={styles.centeredView}><View style={styles.modalView}><Text style={styles.modalText}>Hello World!</Text><Pressablestyle={[styles.button, styles.buttonClose]}onPress={() => setModalVisible(!modalVisible)}><Text style={styles.textStyle}>Hide Modal</Text></Pressable></View></View></Modal><Pressablestyle={[styles.button, styles.buttonOpen]}onPress={() => setModalVisible(true)}><Text style={styles.textStyle}>Show Modal</Text></Pressable></View>);};const styles = StyleSheet.create({centeredView: {flex: 1,justifyContent: "center",alignItems: "center",marginTop: 22},modalView: {margin: 20,backgroundColor: "white",borderRadius: 20,padding: 35,alignItems: "center",shadowColor: "#000",shadowOffset: {width: 0,height: 2},shadowOpacity: 0.25,shadowRadius: 4,elevation: 5},button: {borderRadius: 20,padding: 10,elevation: 2},buttonOpen: {backgroundColor: "#F194FF",},buttonClose: {backgroundColor: "#2196F3",},textStyle: {color: "white",fontWeight: "bold",textAlign: "center"},modalText: {marginBottom: 15,textAlign: "center"}});export default App;
PixelRatio
var image = getImage({width: PixelRatio.getPixelSizeForLayoutSize(200),height: PixelRatio.getPixelSizeForLayoutSize(100)});<Image source={image} style={{ width: 200, height: 100 }} />;
import React from "react";import { Image, PixelRatio, ScrollView, StyleSheet, Text, View, Dimensions } from "react-native";const size = 50;const cat = {uri: "https://reactnative.dev/docs/assets/p_cat1.png",width: size,height: size};const screen = Dimensions.get("screen");const App = () => (<View style={{flex:1,paddingTop:0}}><ScrollViewstyle={styles.scrollStyle}contentContainerStyle={styles.contentContainerStyle}><View style={styles.container}><Text>Current Pixel Ratio is:</Text><Text style={styles.value}>{PixelRatio.get()}</Text></View><View style={styles.container}><Text>Current Font Scale is:</Text><Text style={styles.value}>{PixelRatio.getFontScale()}</Text></View><View style={styles.container}><Text>On this device images with a layout width of</Text><Text style={styles.value}>{size} px</Text><Image source={cat} /></View><View style={styles.container}><Text>require images with a pixel width of</Text><Text style={styles.value}>{PixelRatio.getPixelSizeForLayoutSize(size)} px</Text><Imagesource={cat}style={{width: PixelRatio.getPixelSizeForLayoutSize(size),height: PixelRatio.getPixelSizeForLayoutSize(size)}}/></View></ScrollView></View>);const styles = StyleSheet.create({scrollStyle: {flex:1,},contentContainerStyle: {flex:1,justifyContent: "center",},container: {justifyContent: "center",alignItems: "center"},value: {fontSize: 24,marginBottom: 12,marginTop: 4}});export default App;
RefreshControl
import React from 'react';import { RefreshControl, SafeAreaView, ScrollView, StyleSheet, Text } from 'react-native';const wait = (timeout: number) => {return new Promise(resolve => setTimeout(resolve, timeout));}const App = () => {const [refreshing, setRefreshing] = React.useState(false);const onRefresh = React.useCallback(() => {setRefreshing(true);wait(2000).then(() => setRefreshing(false));}, []);return (<SafeAreaView style={styles.container}><ScrollViewcontentContainerStyle={styles.scrollView}refreshControl={<RefreshControlrefreshing={refreshing}onRefresh={onRefresh}/>}><Text>Pull down to see RefreshControl indicator</Text></ScrollView></SafeAreaView>);}const styles = StyleSheet.create({container: {flex: 1,},scrollView: {flex: 1,backgroundColor: 'pink',alignItems: 'center',justifyContent: 'center',},});export default App;
StatusBar
import React, { useState } from 'react';import { Button, Platform, SafeAreaView, StatusBar, StyleSheet, Text, View } from 'react-native';const STYLES = ['default', 'dark-content', 'light-content'];const TRANSITIONS = ['fade', 'slide', 'none'];const App = () => {const [hidden, setHidden] = useState(false);const [statusBarStyle, setStatusBarStyle] = useState(STYLES[0]);const [statusBarTransition, setStatusBarTransition] = useState(TRANSITIONS[0]);const changeStatusBarVisibility = () => setHidden(!hidden);const changeStatusBarStyle = () => {const styleId = STYLES.indexOf(statusBarStyle) + 1;if (styleId === STYLES.length) {setStatusBarStyle(STYLES[0]);} else {setStatusBarStyle(STYLES[styleId]);}};const changeStatusBarTransition = () => {const transition = TRANSITIONS.indexOf(statusBarTransition) + 1;if (transition === TRANSITIONS.length) {setStatusBarTransition(TRANSITIONS[0]);} else {setStatusBarTransition(TRANSITIONS[transition]);}};return (<View style={styles.container}><StatusBaranimated={true}backgroundColor="#61dafb"barStyle={statusBarStyle}showHideTransition={statusBarTransition}hidden={hidden} /><Text style={styles.textStyle}>StatusBar Visibility:{'\n'}{hidden ? 'Hidden' : 'Visible'}</Text><Text style={styles.textStyle}>StatusBar Style:{'\n'}{statusBarStyle}</Text>{Platform.OS === 'ios' ? (<Text style={styles.textStyle}>StatusBar Transition:{'\n'}{statusBarTransition}</Text>) : null}<View style={styles.buttonsContainer}><Buttontitle="Toggle StatusBar"onPress={changeStatusBarVisibility} /><Buttontitle="Change StatusBar Style"onPress={changeStatusBarStyle} />{Platform.OS === 'ios' ? (<Buttontitle="Change StatusBar Transition"onPress={changeStatusBarTransition} />) : null}</View></View>);};const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',backgroundColor: '#ECF0F1'},buttonsContainer: {padding: 10},textStyle: {textAlign: 'center',marginBottom: 8}});export default App;
