Skip to content
  • P
    Projects
  • G
    Groups
  • S
    Snippets
  • Help

肖康 / H5_2.0

  • This project
    • Loading...
  • Sign in
Go to a project
  • Project
  • Repository
  • Issues 0
  • Merge Requests 0
  • Pipelines
  • Wiki
  • Snippets
  • Settings
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Files
  • Commits
  • Branches
  • Tags
  • Contributors
  • Graph
  • Compare
  • Charts
Find file
Normal viewHistoryPermalink
Switch branch/tag
  • H5_2.0
  • node_modules
  • uni-simple-router
  • appRouter
  • init.js
init.js 3.88 KB
肖康's avatar
first init
ddbafbda
 
肖康 committed 2 years ago
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
import {
    proxyLaunchHook, beforeBackHooks, beforeTabHooks, backApiCallHook,
} from './hooks';
import { Global, uniAppHook } from '../helpers/config';
import { assertCanBack } from './util';
import { warn } from '../helpers/warn';

/**
 * 重写掉uni-app的 uni.getLocation 和 uni.chooseLocation APi
 * @param {Object} Router  当前路由对象
 */
export const rewriteUniFun = function (Router) {
    const oldSwitchTab = uni.switchTab; // 缓存 跳转到 tabBar 页面
    uni.switchTab = function ({ url, ...args }, normal = false) {
        if (normal === true || uniAppHook.pageReady === false) { // 调用原始的uni-app  api
            oldSwitchTab({
                url,
                ...args,
            });
        } else {
            if (uniAppHook.pageReady) { // 只有在路由守卫等  处理完所有操作后才能触发
                const { path } = Router.$Route; // 获取当前路径
                if (path == url) { // 路径相同不执行
                    return warn(`当前跳转路径:${url}  已在本页面无须跳转`);
                }
                beforeTabHooks.call(Router, url.substring(1)); // 不要 /
            } else {
                warn('路由守卫正在忙碌中 不允许执行 ‘uni.switchTab’');
            }
        }
    };
};

/**
 * 对当前app做一个动画页面 用来过渡首次next 等待时间过长的尴尬
 * @param {Object} Router 当前路由对象
 */
export const registerLoddingPage = function (Router) {
    const { loddingPageHook, loddingPageStyle } = Router.CONFIG.APP;	// 获取app所有配置
    const view = new plus.nativeObj.View('router-loadding', {
        top: '0px',
        left: '0px',
        height: '100%',
        width: '100%',
        ...loddingPageStyle.call(Router),
    });
    loddingPageHook.call(Router, view);	// 触发等待页面生命周期
};
/**
 * 移除当前 页面上 非router 声明的 onBackPress 事件
 * @param {Object} page 当前 vue 组件对象
 * @param {Object} options	当前page对象的 $options
 * 修复 https://github.com/SilurianYang/uni-simple-router/issues/106
 */
export const removeBackPressEvent = function (page, options) {
    const isBack = assertCanBack(page);
    if (isBack) {	// 可返回
        options.onBackPress = [options.onBackPress[0]];		// 路由混入的都干掉
    }
};
/**
 * 判断当前页面是否需要拦截返回
 *
 * @param {Object} page 当前 vue 组件对象
 * @param {Object} options 当前 vue 组件对象下的$options对象
 * @param {Array} args  当前页面是点击头部返回还是底部返回
 * 修复 https://github.com/SilurianYang/uni-simple-router/issues/66
 *
 * this 为当前 Router 对象
 */
export const pageIsHeadBack = function (page, options, args) {
    if (args[0].from == 'navigateBack') {		// 调用api返回
        if (Global.LockStatus) { // 正在跳转的时候 返回按键按的太快啦
            warn('当前页面正在处于跳转状态,请稍后再进行跳转....');
            return true;
        }
        Global.LockStatus = true; // 设置为锁住状态
        backApiCallHook.call(this, options, args);
        return true;
    }
    const isBack = assertCanBack(page);
    if (isBack) {	// 可返回
        if (Global.LockStatus) { // 正在跳转的时候 返回按键按的太快啦
            warn('当前页面正在处于跳转状态,请稍后再进行跳转....');
            return true;
        }
        Global.LockStatus = true; // 设置为锁住状态
        beforeBackHooks.call(this, options, args);
        return true;
    }
    return false;
};

/**
 * 开始初始化app端路由配置
 *
 * @param {Object} Router
 *
 * this 为当前 page 对象
 */
export const appInit = function (Router) {
    proxyLaunchHook.call(this);
    const { holdTabbar } = Router.CONFIG.APP;
    if (holdTabbar) { // 开启tab拦截时
        rewriteUniFun(Router);
    }
    registerLoddingPage(Router);
};