react-native之ActivityIndicator组件

环境

react-native 0.57
iphone X模拟器测试

以后会补全安卓的测试

一、官方例子及效果图(官方ActivityIndicator)

import React, {
  Component
} from 'react'
import {
  ActivityIndicator,
  StyleSheet,
  Text,
  View,
} from 'react-native'
export default class App extends Component {
  render() {
    return (
      <View style={[styles.container, styles.horizontal]}>
        <ActivityIndicator size="large" color="#0000ff" />
        <ActivityIndicator size="small" color="#00ff00" />
        <ActivityIndicator size="large" color="#0000ff" />
        <ActivityIndicator size="small" color="#00ff00" />
      </View>
    )
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center'
  },
  horizontal: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    padding: 10
  }
})
效果图

二、Props介绍

animating

是否要显示指示器动画,默认为 true 表示显示,false 则隐藏。

类型 必填
bool

color

滚轮的前景颜色(默认为灰色)。

类型 必填
color

size

指示器的大小,默认为'small'。目前只能在 Android 上设定具体的数值。

类型 必填
enum('small', 'large'), number

hidesWhenStopped

animating为 false 的时候,是否要隐藏指示器(默认为 true)。如果animatinghidesWhenStopped都为 false,则显示一个静止的指示器。

类型 必填 平台
bool iOS

三、尝试看源码

export interface ActivityIndicatorProps extends ViewProps {
    /**
     * Whether to show the indicator (true, the default) or hide it (false).
     */
    animating?: boolean;

    /**
     * The foreground color of the spinner (default is gray).
     */
    color?: string;

    /**
     * Whether the indicator should hide when not animating (true by default).
     */
    hidesWhenStopped?: boolean;

    /**
     * Size of the indicator.
     * Small has a height of 20, large has a height of 36.
     *
     * enum('small', 'large')
     */
    size?: number | "small" | "large";

    style?: StyleProp<ViewStyle>;
}

declare class ActivityIndicatorComponent extends React.Component<ActivityIndicatorProps> {}
declare const ActivityIndicatorBase: Constructor<NativeMethodsMixin> & typeof ActivityIndicatorComponent;
export class ActivityIndicator extends ActivityIndicatorBase {}

以上是官方里面的代码,这里面都只是Props而已,真正怎么实现的,由于我不会原生开发,所以就不再深究了,如果以后步入了,就一篇记录下来。

四、封装基于ActivityIndicator组件的Loading组件

组件介绍:
这个组件也就是在这个组件的下方加一行文字,以此来达到提示的作用,这个组件并不能通过npm下载到自己的项目中,如果看到的有需求,那么可以自己写一个,没有时间的话可以使用对应的插件和复制我写的,如果在使用我的过程中遇到bug,比如说跟其他组件出现不兼容,可以留言,我们一块解决。
需求来源:
在登录过程中,有时候由于网络不好并不能立即登录成功,需要等待后台的反馈;还有就是保存数据到本地的时候,这个过程也是异步的,有时候我们需要保存成功以后告诉使用者,而在使用者按下按钮到保存成功需要时间。
准备工作:
需要安装prop-types 库;安装方法,在自己的项目下输入:

npm install --save prop-types

然后在封装的组件里面导入:

import PropTypes from 'prop-types';

之所以要导入这个组件,因为随着React的升级,现在React官方不支持PropTypes,需要安装这个库才能成功。
组件代码

import React,{Component} from 'react'
import {
    View,
    ActivityIndicator,
    Text,
    Dimensions,
    Platform,
    StatusBar
} from 'react-native'
import PropTypes from 'prop-types';
export default class Loading extends Component{
    
    static defaultProps = {
        animating:true,
        hidesWhenStopped:true,
        size:'small',
        color:'#999'
    };
    static propTypes = {
        // 整个Loading的样式
        loadingStyle:PropTypes.object,
        //加载器的颜色
        color:PropTypes.string,
        //加载器的大小,只有两个值:small|large,以下三个跟ActivityIndicator的样式相同
        size:PropTypes.string,
        animating:PropTypes.bool,
        hidesWhenStopped:PropTypes.bool,
        //文本的样式,也就是下面显示字体的样式
        textStyle:PropTypes.object,
        //要显示的文本,这个是必要值,不能为空
        text:PropTypes.string.isRequired
    }

    render() {
        let {loadingStyle,color,size,animating,hidesWhenStopped,textStyle,text} = this.props
        let {width,height} = Dimensions.get('screen')
        if (Platform.OS === 'android') {
            height += StatusBar.currentHeight
        }
        return (
            <View style={{flex:1,alignItems:'center',position:'absolute',justifyContent:'center',width:width,height:height,...loadingStyle}}>
                <ActivityIndicator animating={animating} hidesWhenStopped={hidesWhenStopped} color={color} size={size} />
                <Text style={{fontSize:12,marginTop:5,...textStyle}}>{text}</Text>
            </View>
        )
    }
}

写测试代码

import React, {
  Component
} from 'react'
import {
  View,
} from 'react-native'
import Loading from './component/Loading'
export default class App extends Component {
  render() {
    return (
      <View style={{flex:1}}>
        <Loading text={'加载中'} color={'red'} />
      </View>
    )
  }
}

看效果图


使用封装组件的效果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,360评论 1 33
  • 原文地址:React.js Forms: Controlled Components 原文作者:Loren Ste...
    iKcamp阅读 813评论 0 5
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 975评论 0 1
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,104评论 2 21
  • 原创分享第396天 周二 今天晚上又开始了新一轮的焦点学习的初级复训,很多期待,很多兴奋,希望通过学习让自...
    禾雨分享阅读 265评论 0 0