Hello World
import React from 'react';
import { Text, View } from 'react-native';
const YourApp = () => {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>
Try editing me! 🎉
</Text>
</View>
);
}
export default YourApp;
Snack Player : 沙盒环境 Expo公司提供的演示学习React Native的交互工具。可以直接运行代码 snack.expo.dev
函数式组件与Class组件
React可以使用函数式组件或者Class组件。
函数式组件
import React from 'react';
import { Text, View } from 'react-native';
const HelloWorldApp = () => {
return (
<View style={{
flex: 1,
justifyContent: 'center',
alignItems: 'center'
}}>
<Text>Hello, world!</Text>
</View>
);
}
export default HelloWorldApp;
Class组件
import React, { Component } from 'react';
import { Text, View } from 'react-native';
class HelloWorldApp extends Component {
render() {
return (
<View style={{
flex: 1,
justifyContent: "center",
alignItems: "center"
}}>
<Text>Hello, world!</Text>
</View>
);
}
}
export default HelloWorldApp;
React基础
React Native的基础是React。
几个React核心概念:
-
components(组件)
React中元素构成组件(复杂组件是由多个组件构成),组件又构成了应用。React核心思想是组件化,其中组件通过属性(props)和状态(state)传递数据
-
jSX
React使用JSX来替代常规的JavaScript。JSX是一个看起来很像XML的Javascript的语法扩展
-
props属性
-
state 状态
尝试写一个组件
import React from 'react';
import { Text } from 'react-native';
const Cat = () => {
return (
<Text>Hello, I am your cat!</Text>
);
}
export default Cat;
定义一个Cat组件 ,第一步使用import 来引入React和React Native的Text组件
import React from 'react'; import {Text} from 'react-native';
然后一个简单的函数作为组件
const Cat = ()->{};
函数的返回值就会被渲染为一个React 元素,这里Cat会渲染一个元素
const Cat = ()=>{
return <Text>Hello,I am your cat!</Text>
}
export default Cat;
上面的代码使用了export default 语句来导出这个组件,以便在其他地方引入使用
上面只是导出组件的写法之一[handy cheatsheet on JavaScript ] 总结了imports和exports整理的各种不同的写法
Hello,I am your cat!是一种简化的React元素的写法,这种语法名字叫做JSX
JSX React和React Native都使用JSX语法。这种语法使你可以在Javascript中直接输出元素
这里我们为猫声明一个变量name并用括号放在中
import React from 'react'
import {Text} from 'react-native'
const Cat = ()=>{
const name="Maru";
return (
<Text>Hello, I am{name}!</Text>
);
}
export default Cat;
括号内可以使用任意JavaScript表达式,包括调用函数
import React from 'react';
import {Text} from 'react-native';
const getFullName = (firstName,secondName,thirdName) =>{
return firstName+" "+secondName+" "+thirdName;
}
const Cat = ()=>{
return (
<Text>
Hello,I am {getFullName("Rum","Tum","Tugger")}!
</Text>
);
}
export default Cat;
在别处通过来引用这个组件
const Cafe = ()=>{
return (
<Text>Welcome!</Text>
<Cat />
<Cat />
)
}
我们把包含其他组件的组件成为父组件或者父容器,这里Cafe就是一个父组件,而Cat是子组件
Props属性
Props 是 ”properties“(属性)的简写。Props使我们可以定制组件,比如可以给每只一个不同的名字
import React from 'react';
import {Text,View} from 'react-native'
const Cat =(props)=>{
return(
<View>
<Text>Hello, I am {props.name}!</Text>
</View>
);
}
const Cafe=()=>{
return (
<View>
<Cat name="maru"/>
<Cat name="jellylorum"/>
<Cat name="Spot"/>
</View>
);
}
export default Cafe;
Image组件的source属性
<Image
source={{
uri:"https://reactnative.dev/docs/assets/p_cat1.png"
}}
style={{width:200,height:200}}
/>
style属性的宽高所使用双层括号{{}}, 因为JS引用值的时候需要使用{}. 而JS中定义对象时,也需要大括号:{width:200,height:200}.所以使用到了双层括号{{}}
State状态
如果把props理解为制定组件渲染的参数,那么state就像是组件的私人数据数据记录。状态用于记录那些随时间或者用户交互而变化的数据。状态使组件拥有了记忆
按照惯例 props用来配置组件的第一次渲染(初始状态)。state用来记录组件中任意可能随时间变化的数据。
import React, { useState } from "react";
import { Button, Text, View } from "react-native";
const Cat =(props) =>{
const [isHungry,setIsHungry] = useState(true);
return(
<View>
<Text>I am {props.name},and I am {isHungry? "hungrty":"full"}</Text>
<Button
onPress={()=>{
setIsHungry(false);
}}
disabled={!isHungry}
title={isHungry?"Pour me some milk, please!" : "Thank you!"}
/>
</View>
);
}
const Cafe = ()=>{
return(
<>
<Cat name="Mukustrap" />
<Cat name="Spot" />
</>
);
}
export default Cafe;
1.首先从react中引入useState:
import React,{useState} from 'react';
2.在函数内使用useState来为组件声明状态,在本实例中useState创建了一个isHungry状态变量:
const Cat =(props) =>{
const[isHungry,setIsHungry]= useState(true);
}
可以使用useState来记录各种类型的数据 ,例如记录猫咪被爱抚的次数:const[timesPetted,setTimespetted]= useState[0]
useState实质上做了两件事:
- 创建了一个状态变量 并赋予一个初始值
- 创建一个函数用于设置此状态变量的值 setIsHungry
<></> 这一对JSX标签成为Fragments(片段) JSX语法要求根元素必须为单个元素。如果我们需要在根节点并列多个元素,在此之前不得不额外套一个没有实际意义的View。但是有个Fragment后就不需要引入额外的容器视图了。
处理文本输入
import React,{useState} from 'react';
import {Text,TextInput,View} from 'react-native';
const PizzaTranslator = ()=>{
const [text,setText] = useState('')
return(
<View style={{padding:10}}>
<Textinput
style={{padding:40}}
placeholder="Type here to translate!"
onChangeText={text=>setText(text)}
defaultValue={text}
/>
<Text style={{padding:10,fontSize:42}}>
{text.split(' ').map((word) => word && '🍕').join(' ')}
</Text>
</View>
);
}
export default PizzaTranslator
特定平台代码
React Native提供了两种方法区分平台:
- 使用Platform欧快
- 使用特定扩展名
Platform模块
import {Platform,StyleSheet} from 'react-native'
const styles = StyleSheet.create({
height:Platform.OS === 'ios'?200:100
});
Platform.OS 在IOS上会返回ios,而在Android设备或模拟器上返回android
import {Platform,StyleSheet} from 'react-native'
const styles = StyleSheet.create({
container:{
flex:1,
...Platform.select({
ios:{backgroundColor:'red'},
android:{backgroundColor:'blue'}
})
}
});
针对不同平台返回不同组件
const Component = Platform.select({
ios:()=>request('ComponentIOS')
android:()=>require('ComponentAndroid')
});
<Component />
检测Android版本
import {Platform} form 'react-native'
if(Platform.Version = 25){
console.log('Running on Nougat!')
}
特定平台扩展名
React native会检测某个文件是否具有 .ios 或者 .android 的扩展名。然后根据当前运行的平台自动加载正确对应的文件
BigButton.ios.js
BigButton.android.js
import BigButton form './BigButton'
使用滚动视图
import React from 'react';
import {Image,ScrollView,Text} from 'react-native';
const logo={
uri:"https://reactnative.dev/img/tiny_logo.png",
width:64,
height:64
}
export default App = ()=>(
<ScrollView>
<Text style={{fontSize:96}}>Scroll me plz</Text>
<Image source={logo} />
<Image source={logo} />
<Image source={logo} />
<Image source={logo} />
<Image source={logo} />
</ScrollView>
)
使用长列表
React Native提供了FlatList 和 SectionList展示长列表数据的组件
FlatList 更适合长列表,且元素个数可以增删。FlatList并不立刻渲染所有元素,而是优先渲染屏幕上可见的元素
import React from 'react'
import {FlatList,StyleSheet,Text,View} from 'react-native'
const styles = StyleSheet.creat({
container:{
flex:1,
paddingTop:22
},
item:{
padding:10,
fontSize:18,
height:44
}
});
const FlatListBasiscs = ()=>{
return (
<View style={styles.container}>
<FlatView
data={[
{key: 'Devin'},
{key: 'Dan'},
{key: 'Dominic'},
{key: 'Jackson'},
{key: 'James'},
{key: 'Joel'},
{key: 'John'},
{key: 'Jillian'},
{key: 'Jimmy'},
{key: 'Julie'},
]}
renderItem={({item})=>
<Text style={styles.item}>{item.key}</Text>
}
/>
</View>
);
}
如果要渲染一组需要分组的数据,也许还带有分组的标签的,那么SectionList 将是不错的选择
import React from 'react';
import { SectionList, StyleSheet, Text, View } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 22
},
sectionHeader: {
paddingTop: 2,
paddingLeft: 10,
paddingRight: 10,
paddingBottom: 2,
fontSize: 14,
fontWeight: 'bold',
backgroundColor: 'rgba(247,247,247,1.0)',
},
item: {
padding: 10,
fontSize: 18,
height: 44,
},
})
const SectionListBasics = () => {
return (
<View style={styles.container}>
<SectionList
sections={[
{title: 'D', data: ['Devin', 'Dan', 'Dominic']},
{title: 'J', data: ['Jackson', 'James', 'Jillian', 'Jimmy', 'Joel', 'John', 'Julie']},
]}
renderItem={({item}) => <Text style={styles.item}>{item}</Text>}
renderSectionHeader={({section}) => <Text style={styles.sectionHeader}>{section.title}</Text>}
keyExtractor={(item, index) => index}
/>
</View>
);
}
export default SectionListBasics;