react native toast (ios&android)

QQ20181217-160818-HD.gif

今天我带来了Quark浏览器的toast

设置:

  • position => 位置
    ToastPosition.top
    ToastPosition.center
    ToastPosition.bottom默认⚠️
  • duration => 时间
    DURATION.LENGTH_SHORT2秒
    DURATION.LENGTH_NORMAL3秒 默认⚠️
    DURATION.LENGTH_LOG4秒

使用方式

DeviceEventEmitter.emit('toast', 'show toast')

<NurToast
    duration={DURATION.LENGTH_NORMAL}
    position={ToastPosition.center}/>
center.gif
<NurToast
    duration={DURATION.LENGTH_NORMAL}
    position={ToastPosition.top}/>
top.gif

你把这NurToast.js直接调用indexjs或者是mainjs 就OK了比如:

export default class index extends Component {
    render() {
        return (
            ...
  
                {/**就一行*/}
                <NurToast/>
            ...
    }
}

然后想显示toast的时候通过DeviceEventEmitter.emit('toast', msj)这方法把信息发送到NurToast.js就好了

NurToast.js:

import React, {Component} from 'react'
import {DeviceEventEmitter, Dimensions, LayoutAnimation, Platform, Text, UIManager, View} from "react-native";

const window = Dimensions.get('window');

export const ToastPosition = {bottom: 8, center: 2.2, top: 1.2};
export const DURATION = {
    LENGTH_SHORT: 2000,
    LENGTH_NORMAL: 3000,
    LENGTH_LOG: 4000,
};
export default class NurToast extends Component {


    propTypes: {
        ...ViewPropTypes,
        position: PropTypes.number,
        duration: PropTypes.number,
    };

    // 构造
    constructor(props) {
        super(props);

        this.toastCloseNum = 0;
        this.toastCloseNumOld = 0;
        // 初始状态
        this.state = {
            toastR: window.width,
            toastMessage: ''
        };
    }


    componentDidMount() {
        this.toastListner = DeviceEventEmitter.addListener('toast', (text) => {
            this.showToast(text);
        })
    }

    componentWillUnmount() {
        this.toastListner && this.toastListner.remove();
        this.timer && clearTimeout(this.timer)
    }


    /**
     * show toast
     * @param msj
     */
    showToast(msj) {
        let state = this.state;
        if (!state.toastR && state.toastMessage !== msj) {
            this.toastCloseNum += 1;
            this.anim();
            this.setState({
                toastR: window.width,
            });

            this.timer = setTimeout(() => {
                this.anim();
                this.setState({
                    toastR: null,
                    toastMessage: msj,
                });
            }, 300);
            this.closeToast();
        } else if (state.toastR) {
            this.toastCloseNum += 1;

            this.anim();
            this.setState({
                toastR: null,
                toastMessage: msj,
            });
            this.closeToast();
        }
    }

    /**
     * toast close
     */
    closeToast() {
        this.timer = setTimeout(() => {
            this.toastCloseNumOld += 1;
            if (this.toastCloseNumOld === this.toastCloseNum) {
                this.toastCloseNumOld = 0;
                this.toastCloseNum = 0;
                this.anim();
                this.setState({
                    toastR: window.width,
                });
            }
        }, this.props.duration || DURATION.LENGTH_NORMAL);
    }

    /**
     * set动画效果
     */
    anim() {
        if (Platform.OS === 'android') {
            UIManager.setLayoutAnimationEnabledExperimental(true);
        }
        LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
    }


    render() {
        return <View style={{
            backgroundColor: 'black',
            minWidth: 100,
            paddingRight: 20,
            paddingLeft: 10,
            paddingTop: 10,
            paddingBottom: 10,
            marginRight: 20,
            minHeight: 50,
            borderBottomRightRadius: 50,
            borderTopRightRadius: 50,
            position: 'absolute',
            justifyContent: 'center',
            right: this.state.toastR,
            alignItems: 'center',
            opacity: 0.9,
            bottom: (window.height / (this.props.position || ToastPosition.bottom)),
        }}>

            <Text style={{
                color: 'white',
                fontSize: 16,
                backgroundColor: 'transparent',
            }}>{this.state.toastMessage}</Text>

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