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