HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

iOS8 hash路由模式下页面循环reload解决方案

路由 iOS8

问题描述

h5页面在设置路由模式为hash时,iOS8设备打开页面会反复刷新。

详情请参考:issue - H5 hash路由模式下,iOS8页面加载无限reload

问题定位

  1. 在uniapp h5相关源码中搜索reload方法的调用,打log,确认到具体代码
  2. 查看源码发现是用了vue-router来稍加改造
  3. 提出问题:为什么别的机器不会反复刷新
  4. 了解popstate事件触发的逻辑:某些版本的浏览器内核会在页面加载完成后触发一次popstate事件,参考MDN文档
  5. 确认是页面加载完成后自动触发popstate,导致uniapp误处理触发页面reload

hack解决

解决思路:hack reload方法,识别该次异常的reload(load,popstate,reload短时间内连续触发),忽略该次reload。

相关代码:直接写入html文件即可,目前项目内就是这样解决

<script>  
  // @NOTE 处理uniapp路由bug,load,popstate,reload短时间内依次触发时,忽略这次reload  
  var reloadHackRecord = {};  
  window.addEventListener('load', function(e) {  
    reloadHackRecord.load = new Date().getTime();  
  });  
  var onPopState = function() {  
    reloadHackRecord.popstate = new Date().getTime();  
    window.removeEventListener('popstate', onPopState);  
  }  
  window.addEventListener('popstate', onPopState);  
  var oldReload = window.location.reload;  
  window.location.reload = function() {  
    var load = reloadHackRecord.load;  
    var popstate = reloadHackRecord.popstate;  
    var reload = new Date().getTime();  
    var margin = 100; // 经验值  
    if (load && popstate && reload && reload > popstate && popstate > load && reload - popstate < margin && popstate - load < margin) {  
      window.location.reload = oldReload;  
      // @TODO 可以上报看看有多少量  
      return;  
    }  
  }  
</script>

更多信息

今天升级到最新版本,新建模板项目来验证,依然存在问题

路由模式使用history没有该问题

继续阅读 »

问题描述

h5页面在设置路由模式为hash时,iOS8设备打开页面会反复刷新。

详情请参考:issue - H5 hash路由模式下,iOS8页面加载无限reload

问题定位

  1. 在uniapp h5相关源码中搜索reload方法的调用,打log,确认到具体代码
  2. 查看源码发现是用了vue-router来稍加改造
  3. 提出问题:为什么别的机器不会反复刷新
  4. 了解popstate事件触发的逻辑:某些版本的浏览器内核会在页面加载完成后触发一次popstate事件,参考MDN文档
  5. 确认是页面加载完成后自动触发popstate,导致uniapp误处理触发页面reload

hack解决

解决思路:hack reload方法,识别该次异常的reload(load,popstate,reload短时间内连续触发),忽略该次reload。

相关代码:直接写入html文件即可,目前项目内就是这样解决

<script>  
  // @NOTE 处理uniapp路由bug,load,popstate,reload短时间内依次触发时,忽略这次reload  
  var reloadHackRecord = {};  
  window.addEventListener('load', function(e) {  
    reloadHackRecord.load = new Date().getTime();  
  });  
  var onPopState = function() {  
    reloadHackRecord.popstate = new Date().getTime();  
    window.removeEventListener('popstate', onPopState);  
  }  
  window.addEventListener('popstate', onPopState);  
  var oldReload = window.location.reload;  
  window.location.reload = function() {  
    var load = reloadHackRecord.load;  
    var popstate = reloadHackRecord.popstate;  
    var reload = new Date().getTime();  
    var margin = 100; // 经验值  
    if (load && popstate && reload && reload > popstate && popstate > load && reload - popstate < margin && popstate - load < margin) {  
      window.location.reload = oldReload;  
      // @TODO 可以上报看看有多少量  
      return;  
    }  
  }  
</script>

更多信息

今天升级到最新版本,新建模板项目来验证,依然存在问题

路由模式使用history没有该问题

收起阅读 »

开发了一款windows平台上传发布ipa的软件,感兴趣的可以试下,永久免费

windows ipa iOS

开发了一款windows平台上传发布ios app的软件,感兴趣的可以试下,永久免费。

软件名:WinIPAU
下载地址:http://ipau.tansanpi.cn

需要安装.net 6

苹果的接口访问比较慢,可能会出现失败的情况,可以多试几次,或者挂vpn

继续阅读 »

开发了一款windows平台上传发布ios app的软件,感兴趣的可以试下,永久免费。

软件名:WinIPAU
下载地址:http://ipau.tansanpi.cn

需要安装.net 6

苹果的接口访问比较慢,可能会出现失败的情况,可以多试几次,或者挂vpn

收起阅读 »

vue3 setup页面传参

vue3

官方的文档确实写得不清楚,以前我们都用onLoad来接收参数。而使用 vue3 的script setup时怎么接收?也没有看到有说明(不明白文档为什么不多给一些示例)。下面的示例在H5上是没有问题的,不知道其它平台如何。

A页面

uni.navigateTo({  
  url: '../test?id=1'  
})

test页面

const props = defineProps()  
console.log(props) // {id: "1"}
继续阅读 »

官方的文档确实写得不清楚,以前我们都用onLoad来接收参数。而使用 vue3 的script setup时怎么接收?也没有看到有说明(不明白文档为什么不多给一些示例)。下面的示例在H5上是没有问题的,不知道其它平台如何。

A页面

uni.navigateTo({  
  url: '../test?id=1'  
})

test页面

const props = defineProps()  
console.log(props) // {id: "1"}
收起阅读 »

mitt 的 uni_modules 完美迁移版本

vue3

tob-mitt

vue3 中,mitt 是一个推荐的 eventBus 库。这是一个 uni_modules 的完美迁移版本。

插件市场

https://ext.dcloud.net.cn/plugin?id=7323

原仓库

mitt

Usage

import mitt from "@/uni_modules/tob-mitt/index.js"  

// 注册两个指定类型的事件函数  
mitt.on('foo', () => console.log('我是foo1'))  
mitt.on('foo', () => console.log('我是foo2'))  

// 触发该类型的事件函数  
mitt.emit('foo') // 将打印 我是foo1,我是foo2  

// 注册一个带形参的事件函数  
mitt.on('bar', (msg) => console.log(msg))  

// 触发事件函数的同时设置实参  
mitt.emit('bar', '你好') // 将打印 你好  

mitt.off('bar') // 卸载所有 bar 事件函数  

const bar = () => console.log('我好')  
mitt.on('bar', bar)  
mitt.off('bar', bar) // 单独卸载该事件函数  

mitt.emit('bar') // 因为被卸载了,所以什么都不会触发  

// 注册所有类型的事件函数  
mitt.on('*', () => {  
    console.log("不论什么时候都会触发")  
})  

mitt.emit('*') // 打印 不论什么时候都会触发  

mitt.emit('foo') // 打印 我是foo1,我是foo2 不论什么时候都会触发  

mitt.all // 保存事件函数的 map

组织

欢迎关注 帝莎编程
官网
Gitee
Github
网易云课堂

License

Made with markthree

Published under MIT License.

继续阅读 »

tob-mitt

vue3 中,mitt 是一个推荐的 eventBus 库。这是一个 uni_modules 的完美迁移版本。

插件市场

https://ext.dcloud.net.cn/plugin?id=7323

原仓库

mitt

Usage

import mitt from "@/uni_modules/tob-mitt/index.js"  

// 注册两个指定类型的事件函数  
mitt.on('foo', () => console.log('我是foo1'))  
mitt.on('foo', () => console.log('我是foo2'))  

// 触发该类型的事件函数  
mitt.emit('foo') // 将打印 我是foo1,我是foo2  

// 注册一个带形参的事件函数  
mitt.on('bar', (msg) => console.log(msg))  

// 触发事件函数的同时设置实参  
mitt.emit('bar', '你好') // 将打印 你好  

mitt.off('bar') // 卸载所有 bar 事件函数  

const bar = () => console.log('我好')  
mitt.on('bar', bar)  
mitt.off('bar', bar) // 单独卸载该事件函数  

mitt.emit('bar') // 因为被卸载了,所以什么都不会触发  

// 注册所有类型的事件函数  
mitt.on('*', () => {  
    console.log("不论什么时候都会触发")  
})  

mitt.emit('*') // 打印 不论什么时候都会触发  

mitt.emit('foo') // 打印 我是foo1,我是foo2 不论什么时候都会触发  

mitt.all // 保存事件函数的 map

组织

欢迎关注 帝莎编程
官网
Gitee
Github
网易云课堂

License

Made with markthree

Published under MIT License.

收起阅读 »

iOS APP

uni_app iOS

我是采用Vue编写,使用工具HbuilderX,XCode等。

答疑邮箱944522141@qq.com

我是采用Vue编写,使用工具HbuilderX,XCode等。

答疑邮箱944522141@qq.com

可以将通用的 uniapp-api 转换为 composition-api 的工具

vue3

tob-hook-wrap

可以将通用的 uniapp-api 转换为 composition-api 的工具

动机

在开发过程中,uniapp-api 的回调形式在 vue3 可以用更加简洁的方式来表达,同时赋予更灵活的操作。

只要需要 success, fail, completeuniapp-api 就可以转换为更简单的 composition-api

  • success 的结果会被设置到 result.value
  • fail 的结果会被设置到 error.value
  • 函数的执行加载状态将被设置到 loading.vue

例如 uni.request

// 原生  
uni.request({  
    url: '...',  
    data: {  
        name: '张三',  
        age: 18  
    },  
    success(data) {  
        console.log(data) // 数据  
    },  
    fail(error) {  
        console.log(error) // 错误  
    },  
    complete() {  
        console.log(false) // loading 结束  
    }  
})  

// 现在  
const { result, error, loading } = useRequest({  
    url: '...',  
    data: {  
        name: '张三',  
        age: 18  
    }  
})

例子

1. useRequest

// composables/request.js  
import { $U } from "@/uni_modules/tob-use-wrap/index.js"  

export const useRequest = $U(uni.request)
<!-- 页面中 -->  
<template>  
    <view>  
       <view>数据结果: {{result}}</view>  
       <view>加载状态: {{loading}}</view>  
       <view>错误信息: {{error}}</view>  
    </view>  
</template>  

<script>  
import { useRequest } from "@/composables/request.js"  
export default {  
    setup() {  
        const { result, loading, error } = useRequest({  
            url: '...',  
            data: {  
                age: 18,  
                name: '张三'  
            }  
        })  

        return {  
            result, // 数据结果  
            error, // 错误信息  
            loading // 加载状态  
        }  
    }  
}  
</script>

<br />

2. useUploadFile

// composables/uploadFile.js  
import { watch } from "vue"  
import { $U } from "@/uni_modules/tob-use-wrap/index.js"  

export const useUploadFile = $U(uni.uploadFile)
<!-- 页面中 -->  
<template>  
    <view>  
       <view>上传结果: {{result}}</view>  
       <view>加载状态: {{loading}}</view>  
       <view>错误信息: {{error}}</view>  
    </view>  
</template>  

<script>  
import { useUploadFile } from "@/composables/uploadFile.js"  
export default {  
    setup() {  
        const { result, loading, error } = useUploadFile({  
            url: '...',  
            filePath: '...'  
        })  

        return {  
            result, // 上传结果  
            error, // 错误信息  
            loading // 加载状态  
        }  
    }  
}  
</script>

插件市场

https://ext.dcloud.net.cn/plugin?id=7318
传送门

继续阅读 »

tob-hook-wrap

可以将通用的 uniapp-api 转换为 composition-api 的工具

动机

在开发过程中,uniapp-api 的回调形式在 vue3 可以用更加简洁的方式来表达,同时赋予更灵活的操作。

只要需要 success, fail, completeuniapp-api 就可以转换为更简单的 composition-api

  • success 的结果会被设置到 result.value
  • fail 的结果会被设置到 error.value
  • 函数的执行加载状态将被设置到 loading.vue

例如 uni.request

// 原生  
uni.request({  
    url: '...',  
    data: {  
        name: '张三',  
        age: 18  
    },  
    success(data) {  
        console.log(data) // 数据  
    },  
    fail(error) {  
        console.log(error) // 错误  
    },  
    complete() {  
        console.log(false) // loading 结束  
    }  
})  

// 现在  
const { result, error, loading } = useRequest({  
    url: '...',  
    data: {  
        name: '张三',  
        age: 18  
    }  
})

例子

1. useRequest

// composables/request.js  
import { $U } from "@/uni_modules/tob-use-wrap/index.js"  

export const useRequest = $U(uni.request)
<!-- 页面中 -->  
<template>  
    <view>  
       <view>数据结果: {{result}}</view>  
       <view>加载状态: {{loading}}</view>  
       <view>错误信息: {{error}}</view>  
    </view>  
</template>  

<script>  
import { useRequest } from "@/composables/request.js"  
export default {  
    setup() {  
        const { result, loading, error } = useRequest({  
            url: '...',  
            data: {  
                age: 18,  
                name: '张三'  
            }  
        })  

        return {  
            result, // 数据结果  
            error, // 错误信息  
            loading // 加载状态  
        }  
    }  
}  
</script>

<br />

2. useUploadFile

// composables/uploadFile.js  
import { watch } from "vue"  
import { $U } from "@/uni_modules/tob-use-wrap/index.js"  

export const useUploadFile = $U(uni.uploadFile)
<!-- 页面中 -->  
<template>  
    <view>  
       <view>上传结果: {{result}}</view>  
       <view>加载状态: {{loading}}</view>  
       <view>错误信息: {{error}}</view>  
    </view>  
</template>  

<script>  
import { useUploadFile } from "@/composables/uploadFile.js"  
export default {  
    setup() {  
        const { result, loading, error } = useUploadFile({  
            url: '...',  
            filePath: '...'  
        })  

        return {  
            result, // 上传结果  
            error, // 错误信息  
            loading // 加载状态  
        }  
    }  
}  
</script>

插件市场

https://ext.dcloud.net.cn/plugin?id=7318
传送门

收起阅读 »

webview 加载网络地址,侧滑返回,有需要的,联系

附件为视频演示

QQ:543610866

附件为视频演示

QQ:543610866

承接各种外包 前端 后端 uniapp java php vue

外包 外包接单

承接各种前后端外包 h5 小程序 app pc 后端 php java 8年的开发经验 丰富的优秀案例 欢迎各位老板前来咨询 wx:y1255364070

承接各种前后端外包 h5 小程序 app pc 后端 php java 8年的开发经验 丰富的优秀案例 欢迎各位老板前来咨询 wx:y1255364070

lime-painter ios 兼容问题

兼容性

lime-painter: https://gitee.com/liangei/lime-painter
lime-painter 版本1.6.2 海报画版ios不完整问题,ios不完整,安卓显示正常,l-painter只需要加上宽高,保证宽高与海报宽高一致即可。
如:海报为width: '750rpx';height: '1114rpx';
<l-painter custom-style="position: fixed;z-index: -1;top: -200vh;left: -200vw;" :board="posterData" isRenderImage @success="posterSuccess" />
改为:
<l-painter custom-style="position: fixed;z-index: -1;top: -200vh;left: -200vw;width: 750rpx;height: 1114rpx;" :board="posterData" isRenderImage @success="posterSuccess" />

继续阅读 »

lime-painter: https://gitee.com/liangei/lime-painter
lime-painter 版本1.6.2 海报画版ios不完整问题,ios不完整,安卓显示正常,l-painter只需要加上宽高,保证宽高与海报宽高一致即可。
如:海报为width: '750rpx';height: '1114rpx';
<l-painter custom-style="position: fixed;z-index: -1;top: -200vh;left: -200vw;" :board="posterData" isRenderImage @success="posterSuccess" />
改为:
<l-painter custom-style="position: fixed;z-index: -1;top: -200vh;left: -200vw;width: 750rpx;height: 1114rpx;" :board="posterData" isRenderImage @success="posterSuccess" />

收起阅读 »

定制一款微信和支付宝同时上线的小程序,带后台管理

外包

主要功能:管理设备,定位打卡,扫码支付,预存金额,会员管理,优惠卷等,有意者请发邮件至bh0431@vip.qq.com,并留下联系电话

主要功能:管理设备,定位打卡,扫码支付,预存金额,会员管理,优惠卷等,有意者请发邮件至bh0431@vip.qq.com,并留下联系电话

webviewReady[3][2] not match __ERROR

公司原本的h5项目想要通过uniapp套个盒子上架应用市场。
开发过程中,在ios上偶尔会出现,将应用切换到后台之后,过一段时间重新回到应用,出现白屏的情况。其实就想达到一个效果,白屏时可以自动重启|重新加载一次页面。

控制台异常:webviewReady[3][2] not match __ERROR
原因应该是内存不足导致的。

查了好久,终于找到大神的解决办法,亲测有效
hbuilder版本低于3.0.0,用此方法
hbuilder版本高于3.0.0,用此方法

假如能帮到你~且对ins/twitter/wb网红推荐有兴趣,欢迎关注公众号:奇拉比先生

继续阅读 »

公司原本的h5项目想要通过uniapp套个盒子上架应用市场。
开发过程中,在ios上偶尔会出现,将应用切换到后台之后,过一段时间重新回到应用,出现白屏的情况。其实就想达到一个效果,白屏时可以自动重启|重新加载一次页面。

控制台异常:webviewReady[3][2] not match __ERROR
原因应该是内存不足导致的。

查了好久,终于找到大神的解决办法,亲测有效
hbuilder版本低于3.0.0,用此方法
hbuilder版本高于3.0.0,用此方法

假如能帮到你~且对ins/twitter/wb网红推荐有兴趣,欢迎关注公众号:奇拉比先生

收起阅读 »