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>
 |