RN 全局loading实现方式

2023-01-05  本文已影响0人  wustzhy

用modal方式实现的弹窗,不好用,因为需要嵌入到 视图层,并在视图代码里写 展示隐藏的state变量,耦合太大。
有没有像原生那样随时随地调用 A.show()这么Nice的方式,调用处anywhere都可以,不必拘泥于视图层
方式一: rn-global-modal
方式二: react-native-root-siblings

// import Pop from 'rn-global-modal';
import RootSiblings from 'react-native-root-siblings';
import {ActivityIndicator} from '@ant-design/react-native';
import React from 'react';
import {View, StyleSheet} from 'react-native';

/**
 * @description 全局loading视图
 *
 * 示例
 * import GlobalLoading from '../utils/GlobalLoading';
 * GlobalLoading.startLoading(); //或 GlobalLoading.startLoading({text: '图片上传中'});
 * GlobalLoading.endLoading();
 */

// 方案二
let sibling;
export default class GlobalLoading {
  /**
   * 展示loading
   * @param {text: string} 提示文案
   */
  static startLoading(...args) {
    let text = '';
    for (var element of args) {
      if (element instanceof Object && element.hasOwnProperty('text')) {
        text = element.text;
        break;
      }
    }
    // console.log(Pop);
    let tip = text && text.length ? text : '加载中...';

    // 方案一 global-modal 【iOS native会present一个vc,RCTModalHostViewController】
    // bug:当调用了 该modal方法时,再调一键登录页 将无法再present出来
    // Pop.show(<ActivityIndicator animating toast size="large" text={tip} />, {
    //   animationType: 'none',
    //   maskClosable: false,
    // });

    // 方案二 root-siblings
    // Create a siblings element on screen.
    if (!sibling) {
      console.log('root-siblings new');
      sibling = new RootSiblings(
        (
          <View style={styles.sibling}>
            <ActivityIndicator animating toast size="large" text={tip} />
          </View>
        ),
      );
    } else {
      console.log('root-siblings update');
      sibling.update(
        <View style={styles.sibling}>
          <ActivityIndicator animating toast size="large" text={tip} />
        </View>,
      );
    }
  }

  /**
   * @description: loading销毁
   */
  static endLoading = () => {
    // 方案一
    // Pop.hide();
    // 方案二
    // Destroy it
    sibling.destroy();
  };
}

const styles = StyleSheet.create({
  sibling: {
    position: 'absolute', //需设,否则背景色完全不透明,完全看不到当前页面
    left: 0,
    right: 0,
    top: 0,
    bottom: 0,
    backgroundColor: 'rgba(0,0,0,0.5)',
    opacity: 1,
  },
});

/**
 * http://wiki.deepleaper.com/pages/viewpage.action?pageId=20513928
 * 描述:全局可调用的 ‘加载中’ 视图
 *
 * 待改进:修改背景色(难点),萌老师出图。
 * 优点: 调用方便,与页面解耦。
 * 作用:给用户等待中反馈,并可以防止用户多余连续操作。
 * 使用场景:用于 无上下拉刷新、带网络请求的界面 等。比如,一键登录页拉起等待、图片上传等待。
 */

//TODO:方案一 背景色为灰色 无法更改为透明。因为用了Modal,该组件不支持改颜色。待深入研究。
// 方案二,支持修改背景色

//TO OPT:  endLoading万一没被调用,app就彻底无法操作了,怎么办?
//TO ENSURE:超时5s 支持点击mask 隐藏loading
//TO ENSURE:超时15s 自动消失【通信(eg.网络请求的超时时间】

上一篇下一篇

猜你喜欢

热点阅读