查看: 3454|回复: 4
打印 上一主题 下一主题

react-native仿原生弹窗|RN自定义弹窗组件

[复制链接]

该用户从未签到

35

主题

44

帖子

188

积分

注册会员

Rank: 2

积分
188
QQ
跳转到指定楼层
楼主
发表于 2019-8-9 11:29:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaoyan2015 于 2019-8-9 11:30 编辑

最近疯狂的迷上了react原生开发,捣鼓了好几天,采坑了不少,想着进一步提升下技术,就开发了个RN自定义弹窗组件rnPop.js
rnPop是一个基于React/React-Native技术高自定义Modal模态框,功能效果有些类似android、ios、微信弹窗效果。结合了原生Modal及react能力,使得弹窗高度耦合自定义参数,代码结构优雅、简洁。


预览图:








目录结构:


调用方式:
  1. // 引入rnPop.js组件
  2. import RNPop from '../utils/rnPop/rnPop.js'

  3. render() {
  4.     return (
  5.         <View style={styles.container}>
  6.             ...

  7.             {/* 引入弹窗模板 */}
  8.             <RNPop ref="rnPop" />
  9.         </View>
  10.     )
  11. }

  12. 显示:this.refs.rnPop.show({...options});
  13. 隐藏:this.refs.rnPop.hide();
复制代码
如果觉得上面调用方式不够优雅,也可以通过react全局变量控制, 如使用rnPop({…options}) 、 rnPop.close()方式进行弹窗调用
  1. /**************************
  2. *    实例化弹窗接口
  3. */
  4. const Popup = (args) => {
  5.     RNPop.show(args)
  6. }
  7. Popup.close = () => {
  8.     RNPop.close()
  9. }
  10. global.rnPop = Popup
复制代码
  1. //msg提示
  2. handlePress01 = ()=> {
  3.         rnPop({
  4.                 content: 'msg消息提示框(5s后窗口关闭)',
  5.                 shade: true,
  6.                 shadeClose: false,
  7.                 time: 5,
  8.                 xtime: true,
  9.                 anim: 'fadeIn',
  10.         });
  11. }

  12. //msg提示(黑色背景)
  13. handlePress02 = ()=> {
  14.         rnPop({
  15.                 content: '自定义弹窗背景',
  16.                 shade: false,
  17.                 style: {backgroundColor: 'rgba(17,17,17,.7)', borderRadius: 6},
  18.                 contentStyle: {color: '#fff', padding: 10},
  19.                 time: 2
  20.         });
  21. }
复制代码
同时还支持对传入content参数进行自定义模板 content: string | object
  1. // 自定义调用
  2. handlePressAA = () => {
  3.         rnPop({
  4.                 content: (
  5.                         <DefineCp />

  6.                         // <View style={{alignItems: 'center', justifyContent: 'center'}}>
  7.                         //     <Image style={{height: 200, width: 200}} source={require('../assets/qrcode.jpg')} />
  8.                         //     <Text style={{color: '#999'}}>长按或扫一扫二维码,加我好友</Text>
  9.                         //     <View><Text onPress={rnPop.close} style={{backgroundColor: '#61dafb', borderRadius: 20, color: '#fff', marginTop: 15, marginBottom: 10, paddingVertical: 5, paddingHorizontal: 50}}>保存二维码</Text></View>
  10.                         // </View>
  11.                 ),
  12.                 anim: 'bottom'
  13.         });
  14. }


  15. // 自定义模板
  16. const DefineCp = () => {
  17.     return (
  18.         <View style={{alignItems: 'center', justifyContent: 'center'}}>
  19.             <Image style={{height: 200, width: 200}} source={require('../assets/qrcode.jpg')} />
  20.             <Text style={{color: '#999'}}>长按或扫一扫二维码,加我好友</Text>
  21.             <View><Text onPress={rnPop.close} style={{backgroundColor: '#61dafb', borderRadius: 20, color: '#fff', marginTop: 15, marginBottom: 10, paddingVertical: 5, paddingHorizontal: 50}}>保存二维码</Text></View>
  22.         </View>
  23.     )
  24. }
复制代码
  1. /**************************
  2. *        弹窗配置参数
  3. *  andy 2019/8/1  Q:282310962
  4. */
  5. static defaultProps = {
  6.         isVisible: false,       //弹窗显示

  7.         title: '',              //标题
  8.         content: '',            //内容
  9.         style: null,            //自定义弹窗样式 {object}
  10.         contentStyle: null,     //内容样式
  11.         skin: '',               //自定义弹窗风格
  12.         icon: '',               //自定义弹窗图标

  13.         shade: true,            //遮罩层
  14.         shadeClose: true,       //点击遮罩层关闭
  15.         opacity: '',            //遮罩层透明度
  16.         time: 0,                //弹窗自动关闭秒数
  17.         xtime: false,           //显示关闭秒数

  18.         anim: 'scaleIn',        //弹窗动画(scaleIn / fadeIn / top / bottom / left / right)
  19.         follow: null,                        //跟随定位(适用于在长按位置定位弹窗)
  20.         position: '',           //弹窗位置

  21.         btns: null,             //弹窗按钮(不设置则不显示按钮)[{...options}, {...options}]
  22. }
复制代码


原文地址:https://www.cnblogs.com/xiaoyan2017/p/11292096.html

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖
回复

使用道具 举报

  • TA的每日心情
    开心
    2019-8-10 15:08
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    3

    帖子

    -1

    积分

    限制会员

    积分
    -1
    沙发
    发表于 2019-8-10 15:10:51 | 只看该作者
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-8-15 10:21
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    9

    帖子

    17

    积分

    新手上路

    Rank: 1

    积分
    17
    板凳
    发表于 2019-8-15 10:31:47 | 只看该作者
    感谢分享
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-5 10:38
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    14

    帖子

    33

    积分

    新手上路

    Rank: 1

    积分
    33
    地板
    发表于 2019-12-4 09:37:49 | 只看该作者
    看起来很强大
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-5 10:38
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    14

    帖子

    33

    积分

    新手上路

    Rank: 1

    积分
    33
    5#
    发表于 2019-12-4 09:38:30 | 只看该作者
    6666666666666
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Swiper中文网 ( 粤ICP备15001020号

    GMT+8, 2024-11-23 21:29 , Processed in 0.072088 second(s), 30 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表