返回顶部
首页 > 资讯 > 前端开发 > html >ReactNative如何实现Toast
  • 190
分享到

ReactNative如何实现Toast

2024-04-02 19:04:59 190人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关ReactNative如何实现Toast,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定义组件import React, 

这篇文章将为大家详细讲解有关ReactNative如何实现Toast,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

定义组件

import React, {Component} from 'react';
import {
  StyleSheet,
  View,
  Easing,
  Dimensions,
  Text,
  Animated
} from 'react-native';
import PropTypes from 'prop-types';
import Toast from "./index";
const {width, height} = Dimensions.get("window");
const viewHeight = 35;
class ToastView extends Component {
  static propTypes = {
    message:PropTypes.string,
  };
  dismisshandler = null;

  constructor(props) {
    super(props);
    this.state = {
      message: props.message !== undefined ? props.message : ''
    }
  }

  render() {
    return (
      <View style={styles.container} pointerEvents='none'>
        <Animated.View style={[styles.textContainer]}><Text
          style={styles.defaultText}>{this.state.message}</Text></Animated.View>
      </View>
    )
  }
  componentDidMount() {
    this.timingDismiss()
  }

  componentWillUnmount() {
    clearTimeout(this.dismissHandler)
  }


  timingDismiss = () => {
    this.dismissHandler = setTimeout(() => {
      this.onDismiss()
    }, 1000)
  };

  onDismiss = () => {
    if (this.props.onDismiss) {
      this.props.onDismiss()
    }
  }
}

const styles = StyleSheet.create({
  textContainer: {
    backgroundColor: 'rgba(0,0,0,.6)',
    borderRadius: 8,
    padding: 10,
    bottom:height/8,
    maxWidth: width / 2,
    alignSelf: "flex-end",
  },
  defaultText: {
    color: "#FFF",
    fontSize: 15,
  },
  container: {
    position: "absolute",
    left: 0,
    right: 0,
    top: 0,
    bottom: 0,
    flexDirection: "row",
    justifyContent: "center",
  }
});
export default ToastView

首先导入我们必须的基础组件以及api,我们自定义组件都需要继承它,Dimensions用于实现动画,Easing用于设置动画的轨迹运行效果,PropTypes用于对属性类型进行定义。

render方法是我们定义组件渲染的入口,最外层view使用position为absolute,并设置left,right,top,bottom设置为0,使其占满屏幕,这样使用Toast显示期间不让界面监听点击事件。内层View是Toast显示的黑框容器,backgroundColor属性设置rgba形式,颜色为黑色透明度为0.6。并设置圆角以及最大宽度为屏幕宽度的一半。然后就是Text组件用于显示具体的提示信息。

我们还看到propTypes用于限定属性message的类型为string。constructor是我们组件的构造方法,有一个props参数,此参数为传递过来的一些属性。需要注意,构造方法中首先要调用super(props),否则报错,在此处,我将传递来的值设置到了state中。

对于Toast,显示一会儿自动消失,我们可以通过setTimeout实现这个效果,在componentDidMount调用此方法,此处设置时间为1000ms。然后将隐藏毁掉暴露出去。当我们使用setTimeout时还需要在组件卸载时清除定时器。组件卸载时回调的时componentWillUnmount。所以在此处清除定时器。

实现动画效果

在上面我们实现了Toast的效果,但是显示和隐藏都没有过度动画,略显生硬。那么我们加一些平移和透明度的动画,然后对componentDidMount修改实现动画效果

在组件中增加两个变量

moveAnim = new Animated.Value(height / 12);
  opacityAnim = new Animated.Value(0);

在之前内层view的样式中,设置的bottom是height/8。我们此处将view样式设置如下

style={[styles.textContainer, {bottom: this.moveAnim, opacity: this.opacityAnim}]}

然后修改componentDidMount

componentDidMount() {
    Animated.timing(
      this.moveAnim,
      {
        toValue: height / 8,
        duration: 80,
        easing: Easing.ease
      },
    ).start(this.timingDismiss);
    Animated.timing(
      this.opacityAnim,
      {
        toValue: 1,
        duration: 100,
        easing: Easing.linear
      },
    ).start();
  }

也就是bottom显示时从height/12到height/8移动,时间是80ms,透明度从0到1转变执行时间100ms。在上面我们看到有个easing属性,该属性传的是动画执行的曲线速度,可以自己实现,在Easing API中已经有多种不同的效果。大家可以自己去看看实现,源码地址是 https://GitHub.com/facebook/react-native/blob/master/Libraries/Animated/src/Easing.js ,自己实现的话直接给一个计算函数就可以,可以自己去看模仿。

定义显示时间

在前面我们设置Toast显示1000ms,我们对显示时间进行自定义,限定类型number,

time: PropTypes.number

在构造方法中对时间的处理

time: props.time && props.time < 1500 ? Toast.SHORT : Toast.LONG,

在此处我对时间显示处理为SHORT和LONG两种值了,当然你可以自己处理为想要的效果。

然后只需要修改timingDismiss中的时间1000,写为this.state.time就可以了。

组件更新

当组件已经存在时再次更新属性时,我们需要对此进行处理,更新state中的message和time,并清除定时器,重新定时。

componentWillReceiveProps(nextProps) {
   this.setState({
      message: nextProps.message !== undefined ? nextProps.message : '',
      time: nextProps.time && nextProps.time < 1500 ? Toast.SHORT : Toast.LONG,
    })
    clearTimeout(this.dismissHandler)
    this.timingDismiss()
  }

组件注册

为了我们的定义的组件以API的形式调用,而不是写在render方法中,所以我们定义一个跟组件

import React, {Component} from "react";
import {StyleSheet, AppReGIStry, View, Text} from 'react-native';
viewRoot = null;
class RootView extends Component {
  constructor(props) {
    super(props);
    console.log("constructor:setToast")
    viewRoot = this;
    this.state = {
      view: null,
    }
  }

  render() {
    console.log("RootView");
    return (<View style={styles.rootView} pointerEvents="box-none">
      {this.state.view}
    </View>)
  }
  static setView = (view) => {
//此处不能使用this.setState
    viewRoot.setState({view: view})
  };
}

const originRegister = AppRegistry.registerComponent;
AppRegistry.registerComponent = (appKey, component) => {
  return originRegister(appKey, function () {
    const OriginAppComponent = component();
    return class extends Component {

      render() {
        return (
          <View style={styles.container}>
            <OriginAppComponent/>
            <RootView/>
          </View>
        );
      };
    };
  });
};
const styles = StyleSheet.create({
  container: {
    flex: 1,
    position: 'relative',
  },
  rootView: {
    position: "absolute",
    left: 0,
    right: 0,
    top: 0,
    bottom: 0,
    flexDirection: "row",
    justifyContent: "center",
  }
});
export default RootView

RootView就是我们定义的根组件,实现如上,通过AppRegistry.registerComponent注册。

包装供外部调用

import React, {
  Component,
} from 'react';
import RootView from '../RootView'
import ToastView from './ToastView'
class Toast {
  static LONG = 2000;
  static SHORT = 1000;

  static show(msg) {
    RootView.setView(<ToastView
      message={msg}
      onDismiss={() => {
        RootView.setView()
      }}/>)
  }

  static show(msg, time) {
    RootView.setView(<ToastView
      message={msg}
      time={time}
      onDismiss={() => {
        RootView.setView()
      }}/>)
  }
}
export default Toast

Toast中定义两个static变量,表示显示的时间供外部使用。然后提供两个static方法,方法中调用RootView的setView方法将ToastView设置到根view。

使用

首先导入上面的Toast,然后通过下面方法调用

Toast.show("测试,我是Toast");
          //能设置显示时间的Toast
          Toast.show("测试",Toast.LONG);

关于“ReactNative如何实现Toast”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: ReactNative如何实现Toast

本文链接: https://lsjlt.com/news/75487.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ReactNative如何实现Toast
    这篇文章将为大家详细讲解有关ReactNative如何实现Toast,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。定义组件import React, ...
    99+
    2024-04-02
  • vue如何实现Toast轻提示
    目录vue实现Toast轻提示首先创建一个toast组件在js文件中引入组件在入口文件中引入上面这个js文件下面就可以在view里全局使用了使用vant的Toast轻提示报错文档中是...
    99+
    2024-04-02
  • Vue如何实现全局的toast组件
    这篇文章主要介绍“Vue如何实现全局的toast组件”,在日常操作中,相信很多人在Vue如何实现全局的toast组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue如何实现全局的toast组件”的疑惑有所...
    99+
    2023-07-05
  • ReactNative错误采集原理在Android中如何实现
    今天小编给大家分享一下ReactNative错误采集原理在Android中如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • 微信小程序如何实现自定义Toast
    这篇文章主要介绍微信小程序如何实现自定义Toast,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序 自定义Toast实例代码Toast样式可以根据需求自定义,本例中是圆形&l...
    99+
    2024-04-02
  • 微信小程序人如何实现自定义toast
    这篇文章给大家分享的是有关微信小程序人如何实现自定义toast的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、微信官方默认toasttoast最常见了,几乎每个App都有这样的...
    99+
    2024-04-02
  • Android中如何实现Toast只显示最后一条
    这篇文章主要介绍了Android中如何实现Toast只显示最后一条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:在做Android开发中,时不时的可能会用到Toas...
    99+
    2023-05-30
    android toast
  • 如何使用vue实现一个toast弹窗组件
    本篇内容介绍了“如何使用vue实现一个toast弹窗组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们来分析一下弹窗组件的特性(需...
    99+
    2023-07-04
  • 小程序如何实现自定义通用toast组件
    这篇文章主要为大家展示了“小程序如何实现自定义通用toast组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现自定义通用toast组件”这篇文章吧...
    99+
    2024-04-02
  • 微信小程序如何实现自定义Toast弹框
    小编给大家分享一下微信小程序如何实现自定义Toast弹框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先来看一下效果图: 怎么用...
    99+
    2024-04-02
  • vue怎么实现Toast轻提示
    这篇文章主要介绍“vue怎么实现Toast轻提示”,在日常操作中,相信很多人在vue怎么实现Toast轻提示问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么实现Toast轻提示”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • ReactNative中如何配置调试端口
    小编给大家分享一下ReactNative中如何配置调试端口,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题是这样的,由于公司的...
    99+
    2024-04-02
  • ReactNative状态管理rematch如何使用
    这篇文章主要介绍“ReactNative状态管理rematch如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ReactNative状态管理rematch如何使用”文章能帮助大家解决问题。Re...
    99+
    2023-07-05
  • ReactNative中实现动态导入的示例代码
    目录背景多业务包动态导入Metro 打包原理打包过程bundle 分析__d函数__r函数方案设计分识别入口树拆分bundle 生成合总结背景 随着业务的发展,每一个 React N...
    99+
    2024-04-02
  • ReactNative中实现确认码组件示例详解
    目录正文实现原理开源方案正文 确认码控件也是一个较为常见的组件了,乍一看,貌似较难实现,但实则主要是障眼法。 实现原理 上图 CodeInput 组件的 UI 结构如下: <...
    99+
    2022-11-13
    React Native确认码组件 React Native
  • 如何使用Angular CDK实现一个Service弹出Toast组件功能
    这篇文章将为大家详细讲解有关如何使用Angular CDK实现一个Service弹出Toast组件功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.环境安装cdk不是angular的默认模块,需要手动...
    99+
    2023-06-20
  • ReactNative状态管理redux-toolkit如何使用
    今天小编给大家分享一下ReactNative状态管理redux-toolkit如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • Android编程实现自定义toast示例
    本文实例讲述了Android编程实现自定义toast。分享给大家供大家参考,具体如下: 效果图: 代码: //自定义布局的toast customViewToast.set...
    99+
    2022-06-06
    toast Android
  • Vue实现全局的toast组件方式
    目录Vue全局的toast组件1.创建toast组件2.创建toast.js文件3.安装并使用 vue自定义toast组件使用总结Vue全局的toast组件 1.创建toa...
    99+
    2023-03-06
    Vue全局的toast组件 Vue全局 Vue toast组件
  • Android模仿Toast实现提示框效果
    本文实例为大家分享了Android模仿Toast实现提示框效果的具体代码,供大家参考,具体内容如下 Toast提示只要提示的时间够长,就可以浮动到其他任何界面之上,所以我们可以模仿T...
    99+
    2022-11-13
    Android Toast 提示框
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作