HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

uniapp+ts+vue3+eslint 事件类型提示

vue3 eslint 小程序 uniapp

项目装了eslint,使用的过程中,发现标签的回调事件需要传入类型,用web端的HTMLInputEvent又没有detail.value的属性(这是个input的标签)。

于是乎,我便找到了“miniprogram-api-typings”这么一个包,在安装使用后便可有提示,并且不会报错。因为在社区搜的时候也没搜到(可能是我关键词有误),所以便分享出来,或许有人需要。

使用方法如下(二选一,或者pnpm亦可):
一、安装包
npm i -D miniprogram-api-typings
yarn add -D miniprogram-api-typings

二、在ts配置中指定(github中有给出其他方法,有兴趣的可以自行尝试)
找到tsconfig.json,在compilerOptions→types中,加入"miniprogram-api-typings",以下代码提供参考,不必完全相同:

{  
    "extends": "@vue/tsconfig/tsconfig.json",  
    "compilerOptions": {  
        "sourceMap": true,  
        "baseUrl": ".",  
        "paths": {  
            "@/*": ["./src/*"],  
            "@u/*": ["./src/utils/*"]  
        },  
        "lib": ["esnext", "dom"],  
        "types": ["@dcloudio/types", "miniprogram-api-typings"]  
    },  
    "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]  
}

三、在代码中使用(关键)、
直接如下图,指定类型为"WechatMiniprogram.CustomEvent"即可。
在给事件指定类型时,需要先用"WechatMiniprogram",那么后续的CustomEvent是如何知道的呢?

我们找到node_modules的源码位置,可以看到以下文件,lib.wx.xxx.d.ts便是对应的类型提示,如事件的类型就在lib.wx.event.d.ts中可以查看。

由于BaseEvent中,并没有detail的属性,因此我们选择使用CustomEvent即可

*如果你想指定两个类型,可以采用下图的方式:

以上是便是解决事件没有类型提示的一种方法。因为我的ts才刚起步,如果有什么不足之处,还请多多海涵。

继续阅读 »

项目装了eslint,使用的过程中,发现标签的回调事件需要传入类型,用web端的HTMLInputEvent又没有detail.value的属性(这是个input的标签)。

于是乎,我便找到了“miniprogram-api-typings”这么一个包,在安装使用后便可有提示,并且不会报错。因为在社区搜的时候也没搜到(可能是我关键词有误),所以便分享出来,或许有人需要。

使用方法如下(二选一,或者pnpm亦可):
一、安装包
npm i -D miniprogram-api-typings
yarn add -D miniprogram-api-typings

二、在ts配置中指定(github中有给出其他方法,有兴趣的可以自行尝试)
找到tsconfig.json,在compilerOptions→types中,加入"miniprogram-api-typings",以下代码提供参考,不必完全相同:

{  
    "extends": "@vue/tsconfig/tsconfig.json",  
    "compilerOptions": {  
        "sourceMap": true,  
        "baseUrl": ".",  
        "paths": {  
            "@/*": ["./src/*"],  
            "@u/*": ["./src/utils/*"]  
        },  
        "lib": ["esnext", "dom"],  
        "types": ["@dcloudio/types", "miniprogram-api-typings"]  
    },  
    "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]  
}

三、在代码中使用(关键)、
直接如下图,指定类型为"WechatMiniprogram.CustomEvent"即可。
在给事件指定类型时,需要先用"WechatMiniprogram",那么后续的CustomEvent是如何知道的呢?

我们找到node_modules的源码位置,可以看到以下文件,lib.wx.xxx.d.ts便是对应的类型提示,如事件的类型就在lib.wx.event.d.ts中可以查看。

由于BaseEvent中,并没有detail的属性,因此我们选择使用CustomEvent即可

*如果你想指定两个类型,可以采用下图的方式:

以上是便是解决事件没有类型提示的一种方法。因为我的ts才刚起步,如果有什么不足之处,还请多多海涵。

收起阅读 »

【HBuilderX插件】给文件添加头部注释并在保存时更新时间、最后编辑者字段,还支持插入函数注释

HBuilderX技巧 分享插件

插件下载

插件入口:https://ext.dcloud.net.cn/plugin?name=rovinglight-rv-annotation

说明

这是一款供 HBuilderX 使用的注释插件。

  1. 【功能】支持在文件头部插入并更新作者、创建时间、最后更新者、最后更新时间等字段。
  2. 【功能】支持给函数添加 JSDoc 注释,且能自动识别参数。
  3. 【特点】兼容其他插件插入的或是之前自行添加的头部注释,仍可在保存时更新最后编辑者以及最后更新时间;
  4. 【特点】插入函数注释时能够智能识别参数类型,支持识别 typescript 类型、支持默认值推测类型。

插件现在还是 Baby 阶段,若有问题,还希望评论时能附上出错的代码啦~

文件头部注释

函数注释 & 参数自动识别

继续阅读 »

插件下载

插件入口:https://ext.dcloud.net.cn/plugin?name=rovinglight-rv-annotation

说明

这是一款供 HBuilderX 使用的注释插件。

  1. 【功能】支持在文件头部插入并更新作者、创建时间、最后更新者、最后更新时间等字段。
  2. 【功能】支持给函数添加 JSDoc 注释,且能自动识别参数。
  3. 【特点】兼容其他插件插入的或是之前自行添加的头部注释,仍可在保存时更新最后编辑者以及最后更新时间;
  4. 【特点】插入函数注释时能够智能识别参数类型,支持识别 typescript 类型、支持默认值推测类型。

插件现在还是 Baby 阶段,若有问题,还希望评论时能附上出错的代码啦~

文件头部注释

函数注释 & 参数自动识别

收起阅读 »

JS面试题解析:超大整数相加

面试题:两个超出整数范围的字符串整数相加返回一个正确的字符串相加结果

/**  
 * 面试题:两个超出整数范围的字符串整数相加  
 * 返回一个正确的字符串相加结果  
 *  
 * 填充下面的代码  
 */  
function add(a, b) {  
    /*  
    对齐字符串整数:  
    - 获取两个字符串长度较大的一个字符串的长度  
    - 将两个字符串的位数进行前置补0操作,保障两个字符串位数一致  
     */  
    let max = a.length > b.length ? a.length : b.length  
    a = a.padStart(max, '0')  
    b = b.padStart(max, '0')  

    /*  
    累计相加:  
    - 从个位数第一位相加,结果只能是0~19的数值  
    - 如果小于10进位carry为0;如果大于10进位carry为1  
    - result结果字符串,拼接每次相加的结果个位数  
     */  
    let carry = 0;  
    let result = ""  
    for(let i = max-1; i >= 0; i--){  
        let sum = Number(a[i]) + Number(b[i]) + carry  
        carry = Math.floor(sum / 10)  
        result = (sum % 10) + result  
    }  
    /*  
    判断第一位数值相加结果:  
    - 如果循环结束第一位相加结果超过10,结果前面直接拼接1  
     */  
    if(carry){  
        result = carry + result  
    }  
    return result  
}  

// console.log(add('10000000000000000000000000000000000', '123456'))  
console.log(add("19", '92'))
继续阅读 »

面试题:两个超出整数范围的字符串整数相加返回一个正确的字符串相加结果

/**  
 * 面试题:两个超出整数范围的字符串整数相加  
 * 返回一个正确的字符串相加结果  
 *  
 * 填充下面的代码  
 */  
function add(a, b) {  
    /*  
    对齐字符串整数:  
    - 获取两个字符串长度较大的一个字符串的长度  
    - 将两个字符串的位数进行前置补0操作,保障两个字符串位数一致  
     */  
    let max = a.length > b.length ? a.length : b.length  
    a = a.padStart(max, '0')  
    b = b.padStart(max, '0')  

    /*  
    累计相加:  
    - 从个位数第一位相加,结果只能是0~19的数值  
    - 如果小于10进位carry为0;如果大于10进位carry为1  
    - result结果字符串,拼接每次相加的结果个位数  
     */  
    let carry = 0;  
    let result = ""  
    for(let i = max-1; i >= 0; i--){  
        let sum = Number(a[i]) + Number(b[i]) + carry  
        carry = Math.floor(sum / 10)  
        result = (sum % 10) + result  
    }  
    /*  
    判断第一位数值相加结果:  
    - 如果循环结束第一位相加结果超过10,结果前面直接拼接1  
     */  
    if(carry){  
        result = carry + result  
    }  
    return result  
}  

// console.log(add('10000000000000000000000000000000000', '123456'))  
console.log(add("19", '92'))
收起阅读 »

华为审核隐私sdk问题

应用审核意见: 经检测发现,您的应用中集成了com.heytap.msp(OPPO;OPush)等SDK,但未在应用内的隐私政策/在AppGallery Connect上提交的隐私政策内容中进行明示,不符合华为应用市场审核标准。 修改建议:请确保应用内包含的所有SDK均已在应用内的隐私政策/在AppGallery Connect上提交的隐私政策内逐一罗列明示,并说明SDK收集使用的个人信息以及使用目的。请排查应用内包含的所有SDK,并在隐私政策内进行规范化的说明,以保证隐私检测准确性。 请参考《审核指南》第7.2相关审核要求:https://developer.huawei.com/consumer/cn/doc/50104 APP常见个人信息保护问题FAQ请参考: https://developer.huawei.com/consumer/cn/doc/distribution/app/FAQ-faq#h2-1628486431553-2 测试环境: wifi联网,EMUI11.0.0(P40) 中文环境。


云端打包、unipush没有东西、HBuilderX3.8.4

太难了,华为审核又久,被退回三次了

继续阅读 »

应用审核意见: 经检测发现,您的应用中集成了com.heytap.msp(OPPO;OPush)等SDK,但未在应用内的隐私政策/在AppGallery Connect上提交的隐私政策内容中进行明示,不符合华为应用市场审核标准。 修改建议:请确保应用内包含的所有SDK均已在应用内的隐私政策/在AppGallery Connect上提交的隐私政策内逐一罗列明示,并说明SDK收集使用的个人信息以及使用目的。请排查应用内包含的所有SDK,并在隐私政策内进行规范化的说明,以保证隐私检测准确性。 请参考《审核指南》第7.2相关审核要求:https://developer.huawei.com/consumer/cn/doc/50104 APP常见个人信息保护问题FAQ请参考: https://developer.huawei.com/consumer/cn/doc/distribution/app/FAQ-faq#h2-1628486431553-2 测试环境: wifi联网,EMUI11.0.0(P40) 中文环境。


云端打包、unipush没有东西、HBuilderX3.8.4

太难了,华为审核又久,被退回三次了

收起阅读 »

iOS16.5版本 mui picker 当前选中的选项 被遮盖问题

已解决
解决前:

解决方案
覆盖样式

.mui-ios-16 .mui-picker-inner {  
    -webkit-mask-box-image: none !important;  
}

解决后:

(真坑)……

继续阅读 »

已解决
解决前:

解决方案
覆盖样式

.mui-ios-16 .mui-picker-inner {  
    -webkit-mask-box-image: none !important;  
}

解决后:

(真坑)……

收起阅读 »

个人工作室接单 拥有6年开发经验 熟练使用nuve开发App 技术栈有:PHP/Java/Go/Vue/React/Uniapp 全栈开发

外包接单 外包

个人工作室接单开发,6年工作经验 经验丰富 App Web 小程序 公众号 Pc 全栈开发
Uniapp 开发经验充足,app开发全部使用nuve开发,使用熟练
联系微信: p-aq-rr
来时备注:uniapp

个人工作室接单开发,6年工作经验 经验丰富 App Web 小程序 公众号 Pc 全栈开发
Uniapp 开发经验充足,app开发全部使用nuve开发,使用熟练
联系微信: p-aq-rr
来时备注:uniapp

ios16.4系统 mui picker解决遮挡

ios16.4系统 mui picker解决遮挡

ios16.4系统 mui picker解决遮挡

el-dropdown disabled无效 element-ui(2.15.2)

disabled

el-dropdown 设置 disabled无效
解决办法:升element-ui版本

2.15.6
Dropdown
增加 disabled 属性

el-dropdown 设置 disabled无效
解决办法:升element-ui版本

2.15.6
Dropdown
增加 disabled 属性

uniapp 主题切换,换肤功能实现

皮肤 换肤 主题

主题切换在开发过程中真的用得太少太少,但偶尔会遇到那种想搞点花样的甲方,你还得硬着头皮去做。
现目前我看了很多换肤的实现都有点难维护与扩展,于是自己研究改进了一个,须要的拿走

如果页面比较多,实现起来还是比较难搞的!!!

实现的原理 : sass + vuex

博文地址:https://www.cnblogs.com/top8/p/17465477.html

微信扫码看效果:

周天计划

效果图展示:

白天模式

夜间模式

继续阅读 »

主题切换在开发过程中真的用得太少太少,但偶尔会遇到那种想搞点花样的甲方,你还得硬着头皮去做。
现目前我看了很多换肤的实现都有点难维护与扩展,于是自己研究改进了一个,须要的拿走

如果页面比较多,实现起来还是比较难搞的!!!

实现的原理 : sass + vuex

博文地址:https://www.cnblogs.com/top8/p/17465477.html

微信扫码看效果:

周天计划

效果图展示:

白天模式

夜间模式

收起阅读 »

【分享】renderjs知识分享

DCLOUD社区关于renderjs的资料相当少。这里分享一些实测,同时也方便自己日后查看。

实测后发现,renderjs其实还是蛮简单的,难怪官方给的资料那么少。

<template>  
    <view class="content">  
        <view class="target"  
            :prop="theReactivityStateWhatRenderjsWantToListen"  
            :change:prop="renderjsModuleName.methodName"  
            @click="normalMethod"  
            @click="renderjsModuleName.renderjsMethod">  
            {{otherReactivityState}}  
            <!--  :prop  将逻辑层的某个响应式状态绑定到:prop中,这样就可以在renderjs层监听该响应式状态了-->  
            <!--  :change:prop  指明当renderjs层监听到:prop绑定的逻辑层响应式状态变更时,调用renderjs层的renderjsModuleName.methodName方法来处理它-->  
            <!--第一个click,绑定逻辑层的normalMethod方法;第二个click,绑定renderjs层的renderjsMethod方法。当.target组件被click时,调用其绑定的normalMethod方法或renderjsMethod方法来处理它-->  
            <!--注意:两个click不能同时写,而只能二选一,否则会报错!-->  
            <!--在同一个click中可以同时绑定多个normalMethod,但不能同时绑定多个renderjsMethod,更不能同时混合绑定normalMethod和renderjsMethod-->  
            <!--例如@click="normalMethod1(), normalMethod2()" 是合法的;但@click="renderjsMethod1(), renderjsMethod2()"是不合法的,此时仅renderjsMethod2()有效-->  
        </view>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            theReactivityStateWhatRenderjsWantToListen: ...,  
            otherReactivityState: ...  
        },  
        medthod: {  
            normalMethod(event) {  
                ...  
            }  
        }  
    }  
</script>  

<script module="renderjsModuleName" lang=renderjs>  
    export default {  
        mounted() {  
            //renderjs模块可以使用vue的除beforeDestroy、destroyed、beforeUnmount、unmounted之外的生命周期钩子。  
        },  
        methods: {  
            methodName(newValue, oldValue, ownerInstance, instance) {  

                //当逻辑层的theReactivityStateWhatRenderjsWantToListen被更新时,也即<template>中被 :prop绑定的逻辑层响应数据被更新时,  
                //此方法,也即<template>中被“:change:prop”绑定的renderjs层的方法,将被调用。  

                //注意参数的顺序  
                   1. newValue:更新后的theReactivityStateWhatRenderjsWantToListen的值  
                   2. oldValue:更新前的theReactivityStateWhatRenderjsWantToListen的值  
                   3. ownerInstance:Instance的owner,触发本方法的组件所在的组件的 ComponentDescriptor 实例  
                   4. Instance:触发本方法的组件的 ComponentDescriptor 实例  
                   5. 如果没猜错,ownerInstance和Instance应该分别是模板中”.content“组件和”.target"组件的ComponentDescriptor实例  
            },  
            renderjsMethod(event, ownerInstance) {  
                ....  
                //renderjs层可以通过ownerInstance.callMethod方法调用逻辑层的方法,并在调用时向被调用的方法传入参数(parameter)  
                ownerInstance.callMethod('normalMethod', parameter)  
            }  
        }  
    }  
</script>

在上述模板中,

  1. ”:prop“用于绑定逻辑层中的希望被renderjs模块侦听的响应式数据,例如上例中的theReactivityStateWhatRenderjsWantToListen。
  2. ”:change:prop“用于指定当 ”:prop“绑定的响应式数据更新时renderjs模块需要调用的方法,例如上例中的renderjsModuleName.methodName方法。
  3. 通过更新逻辑层的theReactivityStateWhatRenderjsWantToListen,就可以自动调用renderjs层的renderjsModuleName.methodName,这是逻辑层(<script>中的代码,单独占用一个线程)调用视图层(或称renderjs层。<template>模板和renderjs代码,它们共用另一个线程)的机制。
  4. renderjs层可以通过ownerInstance.callMethod方法调用逻辑层的方法,并在调用时向被调用的方法传入参数(parameter),这是视图层(或称渲染层、renderjs层。<template>模板和renderjs代码,它们共用一个线程)调用逻辑层(<script>中的代码,单独占用另一个线程)的机制。
  5. 在@click这样的事件中,特别是在touchmove这样的频繁视图(跟手操作)事件中,可采用绑定“renderjs模块名.renderjs方法名”的方法,使renderjs层的事件处理方法响应事件,从而减少视图层和逻辑层间的相互通讯,提高性能。

一个很重要的问题:得到ComponentDescriptor后,可以做什么?
下面这个页面告诉你一切:WXS响应事件
ComponentDescriptor本是微信特有的;但renderjs也实现了这个接口,所以该接口renderjs也能用。

继续阅读 »

DCLOUD社区关于renderjs的资料相当少。这里分享一些实测,同时也方便自己日后查看。

实测后发现,renderjs其实还是蛮简单的,难怪官方给的资料那么少。

<template>  
    <view class="content">  
        <view class="target"  
            :prop="theReactivityStateWhatRenderjsWantToListen"  
            :change:prop="renderjsModuleName.methodName"  
            @click="normalMethod"  
            @click="renderjsModuleName.renderjsMethod">  
            {{otherReactivityState}}  
            <!--  :prop  将逻辑层的某个响应式状态绑定到:prop中,这样就可以在renderjs层监听该响应式状态了-->  
            <!--  :change:prop  指明当renderjs层监听到:prop绑定的逻辑层响应式状态变更时,调用renderjs层的renderjsModuleName.methodName方法来处理它-->  
            <!--第一个click,绑定逻辑层的normalMethod方法;第二个click,绑定renderjs层的renderjsMethod方法。当.target组件被click时,调用其绑定的normalMethod方法或renderjsMethod方法来处理它-->  
            <!--注意:两个click不能同时写,而只能二选一,否则会报错!-->  
            <!--在同一个click中可以同时绑定多个normalMethod,但不能同时绑定多个renderjsMethod,更不能同时混合绑定normalMethod和renderjsMethod-->  
            <!--例如@click="normalMethod1(), normalMethod2()" 是合法的;但@click="renderjsMethod1(), renderjsMethod2()"是不合法的,此时仅renderjsMethod2()有效-->  
        </view>  
    </view>  
</template>  

<script>  
    export default {  
        data() {  
            theReactivityStateWhatRenderjsWantToListen: ...,  
            otherReactivityState: ...  
        },  
        medthod: {  
            normalMethod(event) {  
                ...  
            }  
        }  
    }  
</script>  

<script module="renderjsModuleName" lang=renderjs>  
    export default {  
        mounted() {  
            //renderjs模块可以使用vue的除beforeDestroy、destroyed、beforeUnmount、unmounted之外的生命周期钩子。  
        },  
        methods: {  
            methodName(newValue, oldValue, ownerInstance, instance) {  

                //当逻辑层的theReactivityStateWhatRenderjsWantToListen被更新时,也即<template>中被 :prop绑定的逻辑层响应数据被更新时,  
                //此方法,也即<template>中被“:change:prop”绑定的renderjs层的方法,将被调用。  

                //注意参数的顺序  
                   1. newValue:更新后的theReactivityStateWhatRenderjsWantToListen的值  
                   2. oldValue:更新前的theReactivityStateWhatRenderjsWantToListen的值  
                   3. ownerInstance:Instance的owner,触发本方法的组件所在的组件的 ComponentDescriptor 实例  
                   4. Instance:触发本方法的组件的 ComponentDescriptor 实例  
                   5. 如果没猜错,ownerInstance和Instance应该分别是模板中”.content“组件和”.target"组件的ComponentDescriptor实例  
            },  
            renderjsMethod(event, ownerInstance) {  
                ....  
                //renderjs层可以通过ownerInstance.callMethod方法调用逻辑层的方法,并在调用时向被调用的方法传入参数(parameter)  
                ownerInstance.callMethod('normalMethod', parameter)  
            }  
        }  
    }  
</script>

在上述模板中,

  1. ”:prop“用于绑定逻辑层中的希望被renderjs模块侦听的响应式数据,例如上例中的theReactivityStateWhatRenderjsWantToListen。
  2. ”:change:prop“用于指定当 ”:prop“绑定的响应式数据更新时renderjs模块需要调用的方法,例如上例中的renderjsModuleName.methodName方法。
  3. 通过更新逻辑层的theReactivityStateWhatRenderjsWantToListen,就可以自动调用renderjs层的renderjsModuleName.methodName,这是逻辑层(<script>中的代码,单独占用一个线程)调用视图层(或称renderjs层。<template>模板和renderjs代码,它们共用另一个线程)的机制。
  4. renderjs层可以通过ownerInstance.callMethod方法调用逻辑层的方法,并在调用时向被调用的方法传入参数(parameter),这是视图层(或称渲染层、renderjs层。<template>模板和renderjs代码,它们共用一个线程)调用逻辑层(<script>中的代码,单独占用另一个线程)的机制。
  5. 在@click这样的事件中,特别是在touchmove这样的频繁视图(跟手操作)事件中,可采用绑定“renderjs模块名.renderjs方法名”的方法,使renderjs层的事件处理方法响应事件,从而减少视图层和逻辑层间的相互通讯,提高性能。

一个很重要的问题:得到ComponentDescriptor后,可以做什么?
下面这个页面告诉你一切:WXS响应事件
ComponentDescriptor本是微信特有的;但renderjs也实现了这个接口,所以该接口renderjs也能用。

收起阅读 »

webview解决隐藏title后状态栏遮挡和点击返回键回退页面的问题

Webview
// #ifdef APP-PLUS  
setWebView();  
// #endif  

let wv;  
function setWebView() {  
    const instance = getCurrentInstance().proxy.$scope;  
    const currentWebview = instance.$getAppWebview(); //获取当前web-view  
    setTimeout(function () {  
        wv = currentWebview.children()[0];  
        setWebViewHeight();  
        setWebViewBack();  
    }, 500);  
}  

function setWebViewHeight() {  
    const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;  
    const screenHeight = uni.getSystemInfoSync().screenHeight;  
    wv.setStyle({  
        top: statusBarHeight,  
        height: screenHeight - statusBarHeight  
    });  
}  

let canBack = false; // 判断是否还能继续回退  
// 设置webview的返回逻辑  
function setWebViewBack() {  
    wv.addEventListener('progressChanged', function (e) {  
        wv.canBack(function (e) {  
            canBack = e.canBack;  
        });  
    });  
}  

onBackPress((e) => {  
    // #ifdef APP-PLUS  
    if (canBack) {  
        wv.back(); // 返回上一页  
    } else {  
        plus.runtime.quit(); // 直接退出应用  
    }  
    return true;  
    // #endif  
});
继续阅读 »
// #ifdef APP-PLUS  
setWebView();  
// #endif  

let wv;  
function setWebView() {  
    const instance = getCurrentInstance().proxy.$scope;  
    const currentWebview = instance.$getAppWebview(); //获取当前web-view  
    setTimeout(function () {  
        wv = currentWebview.children()[0];  
        setWebViewHeight();  
        setWebViewBack();  
    }, 500);  
}  

function setWebViewHeight() {  
    const statusBarHeight = uni.getSystemInfoSync().statusBarHeight;  
    const screenHeight = uni.getSystemInfoSync().screenHeight;  
    wv.setStyle({  
        top: statusBarHeight,  
        height: screenHeight - statusBarHeight  
    });  
}  

let canBack = false; // 判断是否还能继续回退  
// 设置webview的返回逻辑  
function setWebViewBack() {  
    wv.addEventListener('progressChanged', function (e) {  
        wv.canBack(function (e) {  
            canBack = e.canBack;  
        });  
    });  
}  

onBackPress((e) => {  
    // #ifdef APP-PLUS  
    if (canBack) {  
        wv.back(); // 返回上一页  
    } else {  
        plus.runtime.quit(); // 直接退出应用  
    }  
    return true;  
    // #endif  
});
收起阅读 »