uni-app编译H5端、PC端、微信小程序、全局组件配置(不需要在components中定义)

uni-app编译H5端、PC端、微信小程序、全局组件配置(不需要在components中定义)

也不需要在页面中 像这样写一遍 对于H5可能没感觉 但小程序尤为繁琐

<loading ref="loading"/>

应用场景:全局自定义Loading加载状态、全局弹框等等

该方法不适合加载很复杂的逻辑以及组件详情,否则会造成页面卡顿以及小程序包体积增长;

H5\PC端

原理是通过找到HTML根标签body添加某个组件然后就不用在components中定义组件了

代码

//定义loading组件
<template>
	<view class="loading" v-show="loading" @touchmove.stop="false">
		<image class="img" src="../static/pageIcon/loading.gif" mode="widthFix"></image>
	</view>
</template>

<script>
	export default {
		name:"loading",
		data() {
			return {
				
			};
		},
		computed:{
			loading:function(){
                //记得在vuex中定义loadingFlag
				return this.$store.state.loadingFlag;
			}
		}
	}
</script>

<style lang="less" scoped>
.loading{
	position: fixed;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
    z-index: 10000;
	.img{
        width: 70px;
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%,-50%);
		
	}
}
</style>

接下来项目目录创建一个loading.js文件

//导入组件
import Loading from "../components/loading.vue"
//定义模型
const loadingModal={
	install:function(Vue){
		const Msg = Vue.extend(Loading)
		const msg = new Msg()
		document.body.innerHTML += "<div id='loading'><div id='loading'></div></div>" 
		msg.$mount("#loading")
	}
}
//导出模型
export default loadingModal

最后一步我们在main.js中导入该js文件

//根据自己的文件位置导入
import loadingModal from "./utils/loading.js";
//挂载
Vue.use(loadingModal);


//全局使用mixin挂载两个方法用来控制loading的显示和隐藏
Vue.mixin({
    methods: {
		showLoading(){
			store.commit('set_LoadingFlag', true);
		},
		hideLoading(){
			store.commit('set_LoadingFlag', false);
		},
    }
});

使用

//显示
this.showLoading();
//隐藏
this.hideLoading();

微信小程序

小程序的因为根标签只有page标签页面更换page中的内容就会全部被换掉了
所以通过操作DOM元素插入组件这种方法无法实现,小程序可以通过webpack来实现原理是uni-app编译的时候通过微信小程序打开直接编译到每个页面

打开项目根目录输入cmd回车

 打开小黑板输入

npm install webpack@4.44.1

我这里使用的是4.44.1版本大家根据自己版本安装 如果已经安装可以忽略这一步

组件代码

//loading组件
<template>
	<view class="loading" v-show="loading" @touchmove.stop="false">
		<image class="img" src="../static/pageIcon/loading.gif" mode="widthFix"></image>
	</view>
</template>

<script>
	export default {
		name:"loading",
		data() {
			return {
				
			};
		},
		computed:{
			loading:function(){
                //别忘记在vuex中定义loadingFlag
				return this.$store.state.loadingFlag;
			}
		}
	}
</script>

<style lang="less" scoped>
.loading{
	position: fixed;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	z-index: 10000;
	.img{
        width: 140rpx;
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%,-50%);
	}
}
</style>

在项目根目录创建vue.config.js

vue.config.js代码

const fs = require('fs')
const path = require('path')
const webpack = require('webpack')

module.exports = {
	chainWebpack: config => {
		config.module.rule('vue').use('vue-loader').loader('vue-loader').tap(options => {
			const compile = options.compiler.compile
			options.compiler.compile = (template, ...args) => {
                //注意这里使用正则匹配到项目pages文件夹下所有页添加该组件
                //如果大家有分包的情况下 而分包也需要加载该组件 记得修改正则
				if (args[0].resourcePath.match(/^(pages|epermarketSub)/)) {
					template = template.replace(/[\s\S]+?<[\d\D]+?>/, _ => `${_}
						<loading ref="loading"/>
					`)
				}
				return compile(template, ...args)
			}
			return options
		})
	}
}

修改完之后 也可以在main.js中使用mixin混入两个全局方法用来控制loading的显示和隐藏


//全局使用mixin挂载两个方法用来控制loading的显示和隐藏
Vue.mixin({
    methods: {
		showLoading(){
			store.commit('set_LoadingFlag', true);
		},
		hideLoading(){
			store.commit('set_LoadingFlag', false);
		},
    }
});

使用

//显示
this.showLoading();
//隐藏
this.hideLoading();

作者是小菜逼,对您有帮助麻烦点个关注,有什么不懂的欢迎私信!杠精勿扰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值