react native学习之Toast

前端之家收集整理的这篇文章主要介绍了react native学习之Toast前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@

今天学习react native中的另外一些API,在android开发中,经常会需要用到ToastAndroid,其实facebook也封装好了该组件,ToastAndroid。

ToastAndroid学习

先看下使用ToastAndroid的方法属性

方法
static show(message: string,duration: number) 

属性
SHORT: MemberExpression 

LONG: MemberExpression
  • String message: 一个字符串,表示将要显示的文本内容
  • int duration: 提示信息持续显示的时间。可以是ToastAndroid.SHORT或者ToastAndroid.LONG

ToastAndroid简单学习

下面我写了一个简单的ToastAndroid的demo,先看下效果吧:

关键代码如下:

_onPress: function(duration,content) {
     ToastAndroid.show(content,duration);
  },render() {
    return (
        <View style={{flexDirection: 'column'}}>
            <Text onPress={()=> this._onPress(ToastAndroid.SHORT,'this is short')} style={styles.button}>click shorts toast</Text>
            <Text style={styles.button} onPress={()=> this._onPress(ToastAndroid.LONG,'this is long')}>click longs toast</Text>
        </View>
    );
  }

var styles = StyleSheet.create({
  button: {
    backgroundColor: '#gray',padding: 3,marginBottom: 10,textAlign: 'center',color: '#ffffff',},});

这里自定义了一个_onPress方法,当点击当前Text的时候,自己回调到_onPress方法,并且传入参数,来显示不同的toast。

PixelRatio

PixelRatio类提供了访问设备的像素密度的方法。大家有没有注意到,在reactnative中并没有为我们提供类似于px,dp这样的单位,可以先学习下下面这篇文章
React宽度单位和像素密度

PixelRatio常用方法

官方给的PixelRatio的常用方法有下面这些:

static get() 

返回设备的像素密度,例如:

PixelRatio.get() === 1
mdpi Android 设备 (160 dpi)
PixelRatio.get() === 1.5
hdpi Android 设备 (240 dpi)
PixelRatio.get() === 2
iPhone 4,4S
iPhone 5,5c,5s
iPhone 6
xhdpi Android 设备 (320 dpi)
PixelRatio.get() === 3
iPhone 6 plus
xxhdpi Android 设备 (480 dpi)
PixelRatio.get() === 3.5
Nexus 6


static getFontScale() 
返回字体大小缩放比例。

static getPixelSizeForLayoutSize(layoutSize: number)
将一个布局尺寸(dp)转换为像素尺寸(px)。
一定会返回一个整数数值。

PixelRatio的使用

PixelRatio最常用的就是根据像素密度获取指定大小的图片,看下面代码

var image = getImage({ width: PixelRatio.getPixelSizeForLayoutSize(200),height: PixelRatio.getPixelSizeForLayoutSize(100),}); <Image source={image} style={{width: 200,height: 100}} />

此时需要在屏幕上显示一个宽200高100的图片,PixelRatio.getPixelSizeForLayoutSize(200)方法会根据当前设备的pixelratio返回对应值,比如当前设备的pixelratio为2,则返回 200 * 2 = 400,最后生成的参数为{ width: 400,height: 200 }

NetInfo

NetInfo是react native提供的可以用来获取当前设备的联网或离线的状态信息。android的联网信息有如下部分:

NONE - 设备处于离线状态
BLUETOOTH - 蓝牙数据连接
DUMMY - 模拟数据连接
ETHERNET - 以太网数据连接
MOBILE - 移动网络数据连接
MOBILE_DUN - 拨号移动网络数据连接
MOBILE_HIPRI - 高优先级移动网络数据连接
MOBILE_MMS - 彩信移动网络数据连接
MOBILE_SUPL - 安全用户面定位(SUPL)数据连接
VPN - 虚拟网络连接。需要Android5.0以上
WIFI - WIFI数据连接
WIMAX - WiMAX数据连接
UNKNOWN - 未知数据连接

注意:在android平台使用NetInfo需要添加如下权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

添加完权限以后,如果不生效,需要重新启动一下服务,以及重新编译当前项目:

// 启动服务
react-native start 
// 重新编译并运行
react-native run-android

NetInfo属性方法

NetInfo提供了下面的属性方法的操作来获取当前的网络状态信息的。

  • isConnectionExpensive
    用于判断当前的网络是否需要资费,该方法只在android平台可以使用
NetInfo.isConnectionExpensive((isConnectionExpensive) => { console.log('Connection is ' + (isConnectionExpensive ? 'Expensive' : 'Not Expensive')); });
  • isConnected
    用于判断当前设备是否连接到网络
//添加一个网络监听事件,当当前网络状态发生变化的时候,会回调该方法
static addEventListener(eventName: ChangeEventName,handler: Function) 
//去除当前的监听事件
static removeEventListener(eventName: ChangeEventName,handler: Function) 

static fetch() 
//判断当前的网络是否需要资费
static isConnectionExpensive(callback: (metered: ?boolean,error?: string) => void)

NetInfo栗子

下面,我根据官方提供的代码加上自己的整合,写了一个关于NetInfo的简单demo,先看下效果吧:

声明周期


关键周期如下:
- getDefaultProps
在组件被加载之前调用方法

  • getInitialState()
    在组件被加载并创建的时候,会首先调用getInitialState()方法

  • componentWillMount
    在加载组件之前会调用方法,该方法在整个生命周期中只会被调用一次

  • componentDidMount
    在组件第一次绘制完成,会调用componentDidMount方法,该方法也是只被调用一次

  • componentWillUnmount
    当组件要被从界面上移除的时候,会调用componentWillUnmount方法

完整代码如下:

'use strict';

var React = require('react-native');

var {
  StyleSheet,Text,View,AppRegistry,NetInfo,} = React;


var secondProject = React.createClass({

 getInitialState() {
    return { 
      isConnected: null,//初始化当前网络是否连接状态
      isConnectionExpensive: (null : ?boolean),// 初始化当前网络的状态是否消耗资费
      connectionInfo: null,//当前网络的链接信息
      connectionInfoHistory: [],};
  },// 此时虚拟 DOM 已经构建完成,改方法只会执行一次,这里添加了一些网络状态改变的监听
  componentDidMount: function() {
    // 添加网络连接状态的监听事件,并在_handleConnectivityChange方法中处理
    NetInfo.isConnected.addEventListener(
        'change',this._handleConnectivityChange
    );
    // 以异步方式获取一个布尔值,用于判断当前设备是否联网
    NetInfo.isConnected.fetch().done(
        (isConnected) => { this.setState({isConnected}); }
    );

    NetInfo.isConnectionExpensive(
        (isConnectionExpensive) => { this.setState({isConnectionExpensive}); }
    );

    // 添加网络连接信息状态的监听事件。
    NetInfo.addEventListener(
        'change',this._handleConnectionInfoChange
    );
    NetInfo.fetch().done(
        (connectionInfo) => { this.setState({connectionInfo}); }
    );
  },componentWillUnmount: function() {
    NetInfo.isConnected.removeEventListener(
        'change',this._handleConnectivityChange
    );

    NetInfo.removeEventListener(
        'change',this._handleConnectionInfoChange
    );

  },_handleConnectionInfoChange: function(connectionInfo) {
    this.setState({
      connectionInfo,});

    const connectionInfoHistory = this.state.connectionInfoHistory.slice();
    connectionInfoHistory.push(connectionInfo); //向数组的末尾添加一个新的connectionInfo
    this.setState({
      connectionInfoHistory,});
  },_handleConnectivityChange: function(isConnected) {
    this.setState({
      isConnected,render() {
    return (
        <View>
          <Text>网络状态:{this.state.isConnected ? 'Online' : 'Offline'}</Text>
          <Text>网络资费:{this.state.isConnectionExpensive === true ? 'Expensive' :
                this.state.isConnectionExpensive === false ? 'Not expensive'
                : 'Unknown'}</Text>
          <Text>网络信息:{this.state.connectionInfo}</Text>
          <Text>网络ConnectionInfoSubscription:{JSON.stringify(this.state.connectionInfoHistory)}</Text>
        </View>
    );
  }
});

AppRegistry.registerComponent('secondProject',() => secondProject);

ok,未完待续。

原文链接:https://www.f2er.com/react/307296.html

猜你在找的React相关文章