uniapp自定义页面跳转loading的实现代码

 更新时间:2023年06月01日 12:01:20   作者:清和哉  
有些页面加载起来比较慢,为了加强用户体验效果,所以一般都会做一个页面加载等待的提示,页面加载完成后消失,下面这篇文章主要给大家介绍了关于uniapp自定义页面跳转loading的实现代码,需要的朋友可以参考下

前言

在开发uniapp项目时,页面切换的过程中,经常需要添加loading效果以提高用户体验。uniapp自带的loading效果无法自定义,所以想着自己实现一个。

实现思路

  • 封装一个全局loading组件,放置插槽和loading效果,使用v-if或者v-show去进行切换。
  • 将切换的状态isLoading放置在app.vue中的globalData里面来进行状态控制
  • 使用uni.$onuni.$emit来完成切换即可

实现代码

globalData

app.vue

我们需要统一管理页面切换时的loading状态,以便在其他页面中使用。

<script>
export default {
   globalData: {
      loading: false
   }
}
</script>

pageLoading组件实现

src/components/pageLoading/index.vue

在created中监听 pageSwitch 事件, res就是你传递的参数,true就是开启loading效果

<template>
	<view class="container">
            <slot v-if="!loading"></slot>
            <view v-else class="center">
                <!-- loading组件可以自己实现, 不想自己写就找个网站cv一下 -->
                <!-- <loading></loading> -->
                加载中...
            </view>
	</view>
</template>

<script>
export default {
	name: 'pageLoading',
	data() {
            return {
                loading: false
            }
	},
	created() {
            this.loading = getApp().globalData.loading
            
            uni.$on('pageSwitch', res => {
                this.loading = res
                getApp().globalData.loading = res
            })
	}
}
</script>

<style lang="scss" scoped>
.center {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	height: 100%;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	background-color: rgba(0, 0, 0, 0.6);
}
</style>

使用

在跳转的时候开启loading效果,跳转到对应页面之后再去手动关闭即可,或者是在某个请求完成之后去关闭

<template>
   <page-loading>
      <button @click="jump">跳转</button>
   </page-loading>
</template>
<script>
// 嫌麻烦注册个全局组件
import pageLoading from '../../components/pageLoading/index.vue'
export default {
   components: { pageLoading },
   methods: {
      jump() {
         uni.$emit('pageSwitch', true)
         uni.switchTab({
            url: '/pages/my/my'
         })
      }
   }
}
</script>

使用扩展

如果嫌每次跳转都需要手动开启loading,那就封装一下uni的跳转函数或者拦截一下跳转,这种方式并不是很推荐,一般是请求完成了加载页面,建议封装在请求里面 —— 大概思路就是,每个页面最主要的数据回来了就可以关闭loading了,又或者是直接写到页面里面去等请求执行完了关闭,这个得看实际场景。

拦截跳转实现

const switchTabBarInterceptor = () => {
    uni.addInterceptor('switchTab', {
        success: function (res) {
           uni.$emit('pageSwitch', true)
        },
        complete() {
           uni.$emit('pageSwitch', false)
        }
    })
}
switchTabBarInterceptor()
// 丢main.js 里面就好了..

跳转封装大概实现

export class Jump {
     tabBarPage = []
    /**
     * Jump类构造函数
     * @param {Array} tabBar - 底部tab栏的页面列表
     */
    constructor(tabBar) {
        this.tabBarPage = tabBar
    }

    /**
     * 将传入的参数转化成URL参数字符串
     * @param {Object} params - 需要转化的参数对象
     * @returns {string} - 转化后的URL参数字符串
     */
    parseParams(params) {
        return Object.entries(params).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join('&')
    }

    /**
     * 跳转到某一个页面
     * @param {string} url - 需要跳转的页面路径
     * @param {Object} params - 需要传递的参数对象
     */
    push(url, params = {}) {
        const urlWithParams = Object.keys(params).length ? `${url}?${this.parseParams(params)}` : url
        const isTabBarPage = this.tabBarPage.some(page => page === url)

        if (isTabBarPage) {
            // 还是老样子,在跳转之前开启loading
            uni.$emit('pageSwitch', true)
            uni.switchTab({ url: urlWithParams })
        }
        else {
            uni.navigateTo({ url: urlWithParams })
        }
    }
}

挂载一手方便使用

/**
 * @typedef {Object} Vue
 * @property {Jump} $jump - 跳转类实例
 */
Vue.prototype.$jump = new Jump(['/pages/index/index', '/pages/my/my'])

请求关闭loading

在统一管理请求的时候就确定好哪些api是可以关闭loading的

// request.js
class Http {
    ...
    request(..., closeLoading = false) {
        // ...
        uni.request({
            complete() {
                if(closeLoading) uni.$emit('pageSwitch', false)
            }
        })
        // ...
    }
}

// api.js
const http = new Http()
const fetchOrderList = () => http.request(..., true)

总结

到此这篇关于uniapp自定义页面跳转loading的文章就介绍到这了,更多相关uniapp自定义页面跳转loading内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • uni-app自定义组件和通信的方式

    uni-app自定义组件和通信的方式

    组件是 vue 技术中非常重要的部分,组件使得与ui相关的轮子可以方便的制造和共享,进而使得vue使用者的开发效率大幅提升,组件可以使用全局注册和页面引入两种方式进行使用,对uni-app自定义组件和通信相关知识感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • return false;和e.preventDefault();的区别

    return false;和e.preventDefault();的区别

    Have you ever seen those two things (in the title) being used in jQuery? Here is a simple
    2010-07-07
  • javascript操作select参考代码

    javascript操作select参考代码

    用js控制select的方法,大家可以参考下
    2008-06-06
  • 比较搞笑的js陷阱题

    比较搞笑的js陷阱题

    今天看到一段代码,比较有意思,本周就再多加一问。
    2010-02-02
  • uniapp小程序之配置首页搜索框功能的实现

    uniapp小程序之配置首页搜索框功能的实现

    这篇文章主要介绍了uniapp小程序之配置首页搜索框,我们介绍一下本次开发使用的是uniapp,本次分享内容的搜索框为禁止输入搜索框,点击跳转专属搜索页面,需要的朋友可以参考下
    2022-09-09
  • 小程序安全指南之如何禁止外部直接跳转到小程序某页面

    小程序安全指南之如何禁止外部直接跳转到小程序某页面

    由于小程序跳转的对象比较多,各自的规则又不一样,因此小程序跳转外部链接是用户咨询较多的问题之一,下面这篇文章主要给大家介绍了关于小程序安全指南之如何禁止外部直接跳转到小程序某页面的相关资料,需要的朋友可以参考下
    2022-09-09
  • 详解ES6中的Map与Set集合

    详解ES6中的Map与Set集合

    这篇文章主要介绍了详解ES6中的Map与Set集合,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 关于js内存泄露的一个好例子

    关于js内存泄露的一个好例子

    这篇文章主要介绍了关于js内存泄露的一个好例子。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • canvas绘制的直线动画

    canvas绘制的直线动画

    本文主要分享了canvas绘制的直线动画的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 一次性让大家搞懂JavaScript数组方法reduce、every、some

    一次性让大家搞懂JavaScript数组方法reduce、every、some

    在JavaScript的数组工具库中,every()和some()是处理逻辑判断的黄金组合,下面这篇文章主要介绍了JavaScript数组方法reduce、every、some的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07

最新评论