221 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			221 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  | 	<u-overlay | |||
|  | 	    :show="!isConnected" | |||
|  | 		:zIndex="zIndex" | |||
|  | 	    @touchmove.stop.prevent="noop" | |||
|  | 		:customStyle="{ | |||
|  | 			backgroundColor: '#fff', | |||
|  | 			display: 'flex', | |||
|  | 			justifyContent: 'center', | |||
|  | 		}" | |||
|  | 	> | |||
|  | 		<view | |||
|  | 		    class="u-no-network" | |||
|  | 		> | |||
|  | 			<u-icon | |||
|  | 			    :name="image" | |||
|  | 			    size="150" | |||
|  | 			    imgMode="widthFit" | |||
|  | 			    class="u-no-network__error-icon" | |||
|  | 			></u-icon> | |||
|  | 			<text class="u-no-network__tips">{{tips}}</text> | |||
|  | 			<!-- 只有APP平台,才能跳转设置页,因为需要调用plus环境 --> | |||
|  | 			<!-- #ifdef APP-PLUS --> | |||
|  | 			<view class="u-no-network__app"> | |||
|  | 				<text class="u-no-network__app__setting">请检查网络,或前往</text> | |||
|  | 				<text | |||
|  | 				    class="u-no-network__app__to-setting" | |||
|  | 				    @tap="openSettings" | |||
|  | 				>设置</text> | |||
|  | 			</view> | |||
|  | 			<!-- #endif --> | |||
|  | 			<view class="u-no-network__retry"> | |||
|  | 				<u-button | |||
|  | 				    size="mini" | |||
|  | 				    text="重试" | |||
|  | 				    type="primary" | |||
|  | 					plain | |||
|  | 				    @click="retry" | |||
|  | 				></u-button> | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 	</u-overlay> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | 	import props from './props.js'; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * noNetwork 无网络提示 | |||
|  | 	 * @description 该组件无需任何配置,引入即可,内部自动处理所有功能和事件。 | |||
|  | 	 * @tutorial https://www.uviewui.com/components/noNetwork.html
 | |||
|  | 	 * @property {String}			tips 	没有网络时的提示语 (默认:'哎呀,网络信号丢失' ) | |||
|  | 	 * @property {String | Number}	zIndex	组件的z-index值  | |||
|  | 	 * @property {String}			image	无网络的图片提示,可用的src地址或base64图片  | |||
|  | 	 * @event {Function}			retry	用户点击页面的"重试"按钮时触发 | |||
|  | 	 * @example <u-no-network></u-no-network> | |||
|  | 	 */ | |||
|  | 	export default { | |||
|  | 		name: "u-no-network", | |||
|  | 		mixins: [uni.$u.mpMixin, uni.$u.mixin,props], | |||
|  | 		data() { | |||
|  | 			return { | |||
|  | 				isConnected: true, // 是否有网络连接
 | |||
|  | 				networkType: "none", // 网络类型
 | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		mounted() { | |||
|  | 			this.isIOS = (uni.getSystemInfoSync().platform === 'ios') | |||
|  | 			uni.onNetworkStatusChange((res) => { | |||
|  | 				this.isConnected = res.isConnected | |||
|  | 				this.networkType = res.networkType | |||
|  | 				this.emitEvent(this.networkType) | |||
|  | 			}) | |||
|  | 			uni.getNetworkType({ | |||
|  | 				success: (res) => { | |||
|  | 					this.networkType = res.networkType | |||
|  | 					this.emitEvent(this.networkType) | |||
|  | 					if (res.networkType == 'none') { | |||
|  | 						this.isConnected = false | |||
|  | 					} else { | |||
|  | 						this.isConnected = true | |||
|  | 					} | |||
|  | 				} | |||
|  | 			}) | |||
|  | 		}, | |||
|  | 		methods: { | |||
|  | 			retry() { | |||
|  | 				// 重新检查网络
 | |||
|  | 				uni.getNetworkType({ | |||
|  | 					success: (res) => { | |||
|  | 						this.networkType = res.networkType | |||
|  | 						this.emitEvent(this.networkType) | |||
|  | 						if (res.networkType == 'none') { | |||
|  | 							uni.$u.toast('无网络连接') | |||
|  | 							this.isConnected = false | |||
|  | 						} else { | |||
|  | 							uni.$u.toast('网络已连接') | |||
|  | 							this.isConnected = true | |||
|  | 						} | |||
|  | 					} | |||
|  | 				}) | |||
|  | 				this.$emit('retry') | |||
|  | 			}, | |||
|  | 			// 发出事件给父组件
 | |||
|  | 			emitEvent(networkType) { | |||
|  | 				this.$emit(networkType === 'none' ? 'disconnected' : 'connected') | |||
|  | 			}, | |||
|  | 			async openSettings() { | |||
|  | 				if (this.networkType == "none") { | |||
|  | 					this.openSystemSettings() | |||
|  | 					return | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			openAppSettings() { | |||
|  | 				this.gotoAppSetting() | |||
|  | 			}, | |||
|  | 			openSystemSettings() { | |||
|  | 				// 以下方法来自5+范畴,如需深究,请自行查阅相关文档
 | |||
|  | 				// https://ask.dcloud.net.cn/docs/
 | |||
|  | 				if (this.isIOS) { | |||
|  | 					this.gotoiOSSetting() | |||
|  | 				} else { | |||
|  | 					this.gotoAndroidSetting() | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			network() { | |||
|  | 				var result = null | |||
|  | 				var cellularData = plus.ios.newObject("CTCellularData") | |||
|  | 				var state = cellularData.plusGetAttribute("restrictedState") | |||
|  | 				if (state == 0) { | |||
|  | 					result = null | |||
|  | 				} else if (state == 2) { | |||
|  | 					result = 1 | |||
|  | 				} else if (state == 1) { | |||
|  | 					result = 2 | |||
|  | 				} | |||
|  | 				plus.ios.deleteObject(cellularData) | |||
|  | 				return result | |||
|  | 			}, | |||
|  | 			gotoAppSetting() { | |||
|  | 				if (this.isIOS) { | |||
|  | 					var UIApplication = plus.ios.import("UIApplication") | |||
|  | 					var application2 = UIApplication.sharedApplication() | |||
|  | 					var NSURL2 = plus.ios.import("NSURL") | |||
|  | 					var setting2 = NSURL2.URLWithString("app-settings:") | |||
|  | 					application2.openURL(setting2) | |||
|  | 					plus.ios.deleteObject(setting2) | |||
|  | 					plus.ios.deleteObject(NSURL2) | |||
|  | 					plus.ios.deleteObject(application2) | |||
|  | 				} else { | |||
|  | 					var Intent = plus.android.importClass("android.content.Intent") | |||
|  | 					var Settings = plus.android.importClass("android.provider.Settings") | |||
|  | 					var Uri = plus.android.importClass("android.net.Uri") | |||
|  | 					var mainActivity = plus.android.runtimeMainActivity() | |||
|  | 					var intent = new Intent() | |||
|  | 					intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) | |||
|  | 					var uri = Uri.fromParts("package", mainActivity.getPackageName(), null) | |||
|  | 					intent.setData(uri) | |||
|  | 					mainActivity.startActivity(intent) | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			gotoiOSSetting() { | |||
|  | 				var UIApplication = plus.ios.import("UIApplication") | |||
|  | 				var application2 = UIApplication.sharedApplication() | |||
|  | 				var NSURL2 = plus.ios.import("NSURL") | |||
|  | 				var setting2 = NSURL2.URLWithString("App-prefs:root=General") | |||
|  | 				application2.openURL(setting2) | |||
|  | 				plus.ios.deleteObject(setting2) | |||
|  | 				plus.ios.deleteObject(NSURL2) | |||
|  | 				plus.ios.deleteObject(application2) | |||
|  | 			}, | |||
|  | 			gotoAndroidSetting() { | |||
|  | 				var Intent = plus.android.importClass("android.content.Intent") | |||
|  | 				var Settings = plus.android.importClass("android.provider.Settings") | |||
|  | 				var mainActivity = plus.android.runtimeMainActivity() | |||
|  | 				var intent = new Intent(Settings.ACTION_SETTINGS) | |||
|  | 				mainActivity.startActivity(intent) | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss" scoped> | |||
|  | 	@import "../../libs/css/components.scss"; | |||
|  | 
 | |||
|  | 	.u-no-network { | |||
|  | 		@include flex(column); | |||
|  | 		justify-content: center; | |||
|  | 		align-items: center; | |||
|  | 		margin-top: -100px; | |||
|  | 
 | |||
|  | 		&__tips { | |||
|  | 			color: $u-tips-color; | |||
|  | 			font-size: 14px; | |||
|  | 			margin-top: 15px; | |||
|  | 		} | |||
|  | 
 | |||
|  | 		&__app { | |||
|  | 			@include flex(row); | |||
|  | 			margin-top: 6px; | |||
|  | 
 | |||
|  | 			&__setting { | |||
|  | 				color: $u-light-color; | |||
|  | 				font-size: 13px; | |||
|  | 			} | |||
|  | 
 | |||
|  | 			&__to-setting { | |||
|  | 				font-size: 13px; | |||
|  | 				color: $u-primary; | |||
|  | 				margin-left: 3px; | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 		&__retry { | |||
|  | 			@include flex(row); | |||
|  | 			justify-content: center; | |||
|  | 			margin-top: 15px; | |||
|  | 		} | |||
|  | 	} | |||
|  | </style> |