微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

react native学习之Toast

今天学习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
在组件被加载之前调用方法

完整代码如下:

'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,未完待续。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...