HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

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  
});
收起阅读 »

前端兼职群,一起来做兼职

外包接单

感兴趣想做兼职的可以加微信群,大家有活可以帮忙做!建立一个uniapp兼职的社区

感兴趣想做兼职的可以加微信群,大家有活可以帮忙做!建立一个uniapp兼职的社区

uniapp 开发微信小程序 使用 workers

需要在pages.json里面添加"workers": "workers",
manifest.json里面添加 "workers": "workers",

      var worker = wx.createWorker('workers/wk-1.js')  
      worker.onMessage((res) => {  
        console.log("主线程接收到的",res)  
      })  
      worker.postMessage({  
        msg: 'hello from main'  
      }) 
      worker.onMessage(function (res) {  
              console.log("worker 接收到 ",res)  
              worker.postMessage({  
                msg: '返回 hello worker'  
              })  
      })
继续阅读 »

需要在pages.json里面添加"workers": "workers",
manifest.json里面添加 "workers": "workers",

      var worker = wx.createWorker('workers/wk-1.js')  
      worker.onMessage((res) => {  
        console.log("主线程接收到的",res)  
      })  
      worker.postMessage({  
        msg: 'hello from main'  
      }) 
      worker.onMessage(function (res) {  
              console.log("worker 接收到 ",res)  
              worker.postMessage({  
                msg: '返回 hello worker'  
              })  
      })
收起阅读 »