多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 参考资料 [React Native 中文网](https://reactnative.cn/docs/components-and-apis/) # 一、基础组件 ![](https://img.kancloud.cn/f7/7f/f77f8b0af5c9db8d12b7d1becd90f433_980x354.png) ## Text 【用途】: 一个用于显示文本的 React 组件,并且它也支持嵌套、样式,以及触摸处理。在下面的例子里,嵌套的标题和正文文字会继承来自`styles.baseText`的`fontFamily`字体样式,不过标题上还附加了它自己额外的样式。标题和文本会在顶部依次堆叠,并且被代码中内嵌的换行符分隔开。 ```js renderText: function() { return ( <Text style={styles.baseText}> <Text style={styles.titleText} onPress={this.onPressTitle}> {this.state.titleText + '\n\n'} </Text> <Text numberOfLines={5}> {this.state.bodyText} </Text> </Text> ); }, ... var styles = StyleSheet.create({ baseText: { fontFamily: 'Cochin', }, titleText: { fontSize: 20, fontWeight: 'bold', }, }; ``` ![](https://img.kancloud.cn/a9/f9/a9f969de27ce2490f11031c8056f1a58_320x480.png) 【部分属性】: - onPress&emsp;*function*:当文本被点击以后调用此回调函数 - onLongPress&emsp;*function*:当文本被长按以后调用此回调函数 - numberOfLines&emsp;*number*:用来当文本过长的时候裁剪文本。包括折叠产生的换行在内,总的行数不会超过这个属性的限制。 ## TextInput 【用途】: TextInput是一个允许用户在应用中通过键盘输入文本的基本组件。本组件的属性提供了多种特性的配置,譬如自动完成、自动大小写、占位文字,以及多种不同的键盘类型(如纯数字键盘)等等。 最简单的用法就是丢一个`TextInput`到应用里,然后订阅它的`onChangeText`事件来读取用户的输入。注意,从 TextInput 里取值这就是目前唯一的做法!即使用`onChangeText`写入 state,然后从 this.state 中取出值。它还有一些其它的事件,譬如`onSubmitEditing`和`onFocus`。 ![](https://img.kancloud.cn/97/c7/97c766a94c4b60c2fd54f1a4c384b36d_320x480.png) 【部分属性】: - defaultValue&emsp;*string*:提供一个文本框中的初始值。当用户开始输入的时候,值就可以改变 - placeholder&emsp;*string*:如果没有任何文字输入,会显示此字符串 - editable&emsp;*bool*:如果为 false,文本框是不可编辑的,默认值为 true - maxLength&emsp;*number*:限制文本框中最多的字符数。使用这个属性而不用JS逻辑去实现,可以避免闪烁的现象 - onChange&emsp;*function*:当文本框内容变化时调用此回调函数 - onFocus&emsp;*function*:当文本框获得焦点的时候调用此回调函数 - value&emsp;*string*:文本框中文字的内容 ## View 【用途】: 作为创建 UI 时最基础的组件,`View`是一个支持 Flexbox 布局、样式、一些触摸处理、和一些无障碍功能的容器,并且它可以放到其它的视图里,也可以有任意多个任意类型的子视图。不论在什么平台上,`View`都会直接对应一个平台的原生视图,无论它是`UIView`、`<div>`还是`android.view.View`。下面的例子创建了一个`View`,包含了两个有颜色的方块和一个自定义的组件,并且设置了一个内边距: ```js <View style={{flexDirection: 'row', height: 100, padding: 20}}> <View style={{backgroundColor: 'blue', flex: 0.3}} /> <View style={{backgroundColor: 'red', flex: 0.5}} /> <MyCustomComponent {...customProps} /> </View> ``` `View`的设计初衷是和`StyleSheet`搭配使用,这样可以使代码更清晰并且获得更高的性能。尽管内联样式也同样可以使用。 ![](https://img.kancloud.cn/c5/b5/c5b5f643fecc47da1959e9553cb7985e_320x480.png) 【合成触摸事件】: 用于`View`响应属性 (例如,`onResponderMove`), 合成触摸事件采用以下的格式: * `nativeEvent` * `changedTouches`\- 从上一次事件以来的触摸事件数组。 * `identifier`\- 触摸事件的 ID。 * `locationX`\- 触摸事件相对元素位置的 X 坐标。 * `locationY`\- 触摸事件相对元素位置的 Y 坐标。 * `pageX`\- 触摸事件相对根元素位置的 X 坐标。 * `pageY`\- 触摸事件相对根元素位置的 Y 坐标。 * `target`\- 接收触摸事件的元素 ID. * `timestamp`\- 触摸事件的时间标记,用来计算速度. * `touches`\- 屏幕上所有当前触摸事件的数组. ## Image 【用途】:一个用于显示多种不同类型图片的 React 组件,包括网络图片、静态资源、临时的本地图片、以及本地磁盘上的图片(如相册)等。 【部分属性】: - onLayout&emsp;*function*:当元素挂载或者布局改变的时候调用,参数为:`{nativeEvent: {layout: {x, y, width, height}}}` - onLoad&emsp;*function*:加载成功完成时调用此回调函数。 - source&emsp;*{uri: string}*:`uri`是一个表示图片的资源标识的字符串,它可以是一个 http 地址或是一个本地文件路径(使用`require(相对路径)`来引用)。 【示例】: ```js renderImages() { return ( <View> <Image style={styles.icon} source={require('./icon.png')} /> <Image style={styles.logo} source={{uri: 'http://facebook.github.io/react/img/logo_og.png'}} /> </View> ); } ``` 默认情况下 Android 是不支持 GIF 和 WebP 格式的。你需要在 android/app/build.gradle 文件中根据需要手动添加以下模块: ```js dependencies { // 如果你需要支持Android4.0(API level 14)之前的版本 compile 'com.facebook.fresco:animated-base-support:1.0.1' // 如果你需要支持GIF动图 compile 'com.facebook.fresco:animated-gif:1.0.1' // 如果你需要支持WebP格式,包括WebP动图 compile 'com.facebook.fresco:animated-webp:1.0.1' compile 'com.facebook.fresco:webpsupport:1.0.1' // 如果只需要支持WebP格式而不需要动图 compile 'com.facebook.fresco:webpsupport:1.0.1' } ``` ## StyleSheet StyleSheet 提供了一种类似 CSS 样式表的抽象。 创建一个样式表: ```js const styles = StyleSheet.create({ container: { borderRadius: 4, borderWidth: 0.5, borderColor: '#d6d7da', }, title: { fontSize: 19, fontWeight: 'bold', }, activeTitle: { color: 'red', }, }); ``` 使用一个样式表: ```html <View style={styles.container}> <Text style={[styles.title, this.props.isActive && styles.activeTitle]} /> </View> ``` # 二、交互控件 常见的跨平台交互控件 ![](https://img.kancloud.cn/9e/1f/9e1f104fe290a4af2924edd2f93d319b_1017x331.png) ## Button 【用途】:跨平台的按钮组件 【属性】 - accessibilityLabel&emsp;*string*:用于给残障人士显示的文本(比如读屏器软件可能会读取这一内容) - color&emsp;*string*:文本的颜色(iOS),或是按钮的背景色(Android) - disabled&emsp;*bool*:设置为 true 时此按钮将不可点击 - onPress&emsp;*function*:用户点击此按钮时所调用的处理函数 - title&emsp;*string*:按钮内显示的文本 【示例】: ```html <Button onPress={onPressLearnMore} title="Learn More" color="#841584" accessibilityLabel="Learn more about this purple button" /> ``` ## Picker 本组件可以在 iOS 和 Android 上渲染原生的选择器(Picker)。用例: ```js <Picker selectedValue={this.state.language} onValueChange={(lang) => this.setState({language: lang})}> <Picker.Item label="Java" value="java" /> <Picker.Item label="JavaScript" value="js" /> </Picker> ``` 【属性】 - onValueChange&emsp;*function*:某一项被选中时执行此回调。调用时带有如下参数: - itemValue: 被选中项的 value 属性 - itemPosition: 被选中项在 picker 中的索引位置 - selectedValue&emsp;*any*:默认选中的值。可以是字符串或整数。 - style&emsp;*pickerStyleType* - androidenabled&emsp;*bool* :如果设为 false,则会禁用此选择器。 - androidmode&emsp;*enum('dialog', 'dropdown')*:在 Android 上,可以指定在用户点击选择器时,以怎样的形式呈现选项: - dialog(对话框形式): 显示一个模态对话框。默认选项。 - dropdown(下拉框形式): 以选择器所在位置为锚点展开一个下拉框。 - androidprompt&emsp;*string*:设置选择器的提示字符串。在 Android 的对话框模式中用作对话框的标题。 - iositemStyle&emsp;*itemStylePropType* :指定应用在每项标签上的样式。 # 三、列表视图 ![](https://img.kancloud.cn/58/d1/58d1516d0f8b83822a30802d5d111029_649x174.png) ## FlatList [https://reactnative.cn/docs/0.43/flatlist/](https://reactnative.cn/docs/0.43/flatlist/) 高性能的简单列表组件,支持下面这些常用的功能: * 完全跨平台。 * 支持水平布局模式。 * 行组件显示或隐藏时可配置回调事件。 * 支持单独的头部组件。 * 支持单独的尾部组件。 * 支持自定义行间分隔线。 * 支持下拉刷新。 * 支持上拉加载。 如果需要分组/类/区(section),请使用`<SectionList>` 【部分属性】: - ListFooterComponent&emsp;*ReactClass\<any>* :尾部组件 - ListHeaderComponent&emsp;*ReactClass\<any>* :头部组件 - data&emsp;*Array\<ItemT>*:为了简化起见,data 属性目前只支持普通数组。如果需要使用其他特殊数据结构,例如 immutable 数组,请直接使用更底层的 VirtualizedList 组件。 - refresh? - refreshing? 【示例】: ```html <FlatList data={[{key: 'a'}, {key: 'b'}]} renderItem={({item}) => <Text>{item.key}</Text>} /> ``` # 四、Android 独有的组件和 API 下面很多组件提供了对 Andriod 常用类的封装。 ![](https://img.kancloud.cn/46/ab/46abb3054677dae986e2dc7071a70d24_987x564.png) ## DrawerLayoutAndroid 该组件仅限 Android 平台。 抽屉(通常用于导航切换)是通过`renderNavigationView`方法渲染的,并且 DrawerLayoutAndroid 的直接子视图会成为主视图(用于放置你的内容)。导航视图一开始在屏幕上并不可见,不过可以从`drawerPosition`指定的窗口侧面拖拽出来,并且抽屉的宽度可以使用`drawerWidth`属性来指定。 ![](https://img.kancloud.cn/1e/76/1e76e104de9fe1411f768f67257c2b50_480x800.png =x350) 【属性】 - drawerLockMode&emsp;*enum('unlocked', 'locked-closed', 'locked-open')*:设置抽屉的锁定模式。有三种状态: - unlocked (默认值),意味着此时抽屉可以响应打开和关闭的手势操作。 - locked-closed,意味着此时抽屉将保持关闭,不可用手势打开。 - locked-open,意味着此时抽屉将保持打开,不可用手势关闭。 无论抽屉处于哪种状态,都仍然可以调用 openDrawer/closeDrawer 这两个方法打开和关闭。 - drawerPosition&emsp;*enum(DrawerConsts.DrawerPosition.Left,DrawerConsts.DrawerPosition.Right)* 指定抽屉可以从屏幕的哪一边滑入。 - drawerWidth&emsp;*number*:指定抽屉的宽度,也就是从屏幕边缘拖进的视图的宽度。 - keyboardDismissMode&emsp;*enum('none', "on-drag")*:指定在拖拽的过程中是否要隐藏软键盘。 - none (默认值),拖拽不会隐藏软键盘。 - on-drag 当拖拽开始的时候隐藏软键盘。 - onDrawerOpen&emsp;*function*:每当导航视图(抽屉)被打开之后调用此回调函数。 - onDrawerClose&emsp;*function*:每当导航视图(抽屉)被关闭之后调用此回调函数。 - onDrawerSlide&emsp;*function*:每当导航视图(抽屉)产生交互的时候调用此回调函数。 - onDrawerStateChanged&emsp;*function*:每当抽屉的状态变化时调用此回调函数。抽屉可以有 3 种状态: - idle(空闲),表示现在导航条上没有任何正在进行的交互。 - dragging(拖拽中),表示用户正在与导航条进行交互。 - settling(停靠中),表示用户刚刚结束与导航条的交互,导航条正在结束打开或者关闭的动画。 - renderNavigationView&emsp;*function*:此方法用于渲染一个可以从屏幕一边拖入的导航视图 【示例】: ```js render: function() { var navigationView = ( <View style={{flex: 1, backgroundColor: '#fff'}}> <Text style={{margin: 10, fontSize: 15, textAlign: 'left'}}>I'm in the Drawer!</Text> </View> ); return ( <DrawerLayoutAndroid drawerWidth={300} drawerPosition={DrawerLayoutAndroid.positions.Left} renderNavigationView={() => navigationView}> <View style={{flex: 1, alignItems: 'center'}}> <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>Hello</Text> <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>World!</Text> </View> </DrawerLayoutAndroid> ); }, ``` # 五、其他 ![](https://img.kancloud.cn/dd/7e/dd7edef3cb2ed73293df2f5dd564a148_788x747.png) ## ActivityIndicator 【用途】:显示一个圆形的 loading 提示符号 【属性】: - animating&emsp;*bool*:是否显示指示器,默认为 true - color&emsp;*string*:滚轮的前景颜色,默认为灰色 - ioshidesWhenStopped&emsp;*bool*:在没有动画的时候,是否要隐藏指示器(默认为true) - size&emsp;*enum('small', 'large')*:指示器的大小。small 的高度为 20,large 为 36 【示例】: ```js render() { return ( <ActivityIndicator animating={this.state.animating} style={[styles.centering, {height: 80}]} size="large" /> ) } ``` ## Modal 【用途】: Modal 组件可以用来覆盖包含 React Native 根视图的原生视图(如UIViewController,Activity)。 在嵌入React Native 的混合应用中可以使用 Modal。Modal 可以使你应用中 RN 编写的那部分内容覆盖在原生视图上显示。 【示例】: ```js import React, { Component } from 'react'; import { Modal, Text, TouchableHighlight, View } from 'react-native'; class ModalExample extends Component { constructor(props) { super(props); this.state = {modalVisible: false}; } setModalVisible(visible) { this.setState({modalVisible: visible}); } render() { return ( <View style={{marginTop: 22}}> <Modal animationType={"slide"} transparent={false} visible={this.state.modalVisible} onRequestClose={() => {alert("Modal has been closed.")}} > <View style={{marginTop: 22}}> <View> <Text>Hello World!</Text> <TouchableHighlight onPress={() => { this.setModalVisible(!this.state.modalVisible) }}> <Text>Hide Modal</Text> </TouchableHighlight> </View> </View> </Modal> <TouchableHighlight onPress={() => { this.setModalVisible(true) }}> <Text>Show Modal</Text> </TouchableHighlight> </View> ); } } ```