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