HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

可以将通用的 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网红推荐有兴趣,欢迎关注公众号:奇拉比先生

收起阅读 »

uniapp webview 内嵌H5页面 切换到后台的时候 偶尔出现白屏

公司原本的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网红推荐有兴趣,欢迎关注公众号:奇拉比先生

收起阅读 »

海康实时视频预览、录像回放、倍数回放、抓图、声音、录像、语言对讲、鱼眼 V2

海康实时视频预览、录像回放、倍数回放、抓图、声音、录像、语言对讲、鱼眼 V2 :https://ext.dcloud.net.cn/plugin?id=7274

海康实时视频预览、录像回放、倍数回放、抓图、声音、录像、语言对讲、鱼眼 V2 :https://ext.dcloud.net.cn/plugin?id=7274

requestPayment:fail [payment微信:-1]General errors 关于微信APP支付这个报错

微信支付

1 需要申请一个自有证书,记好生成的md5签名,这个填写到微信开放平台,去掉“:”然后全部小写
2 打包的时候不要用自带的包名 ,自己起一个小写字母
3 服务端直接用uniapp官方提供的,这里只要没有报错,正常生成签名json,出现-1报错就肯定不是这里问题,这里出问题有其他报错。
4 打包自定义基座的时候注意需要改一下版本号,默认的100再打包是不会替换默认基座的,这里务必注意
5 如果修改了微信开放平台的参数,要等十分钟再测试,不是立马生效的。测试前重启app

继续阅读 »

1 需要申请一个自有证书,记好生成的md5签名,这个填写到微信开放平台,去掉“:”然后全部小写
2 打包的时候不要用自带的包名 ,自己起一个小写字母
3 服务端直接用uniapp官方提供的,这里只要没有报错,正常生成签名json,出现-1报错就肯定不是这里问题,这里出问题有其他报错。
4 打包自定义基座的时候注意需要改一下版本号,默认的100再打包是不会替换默认基座的,这里务必注意
5 如果修改了微信开放平台的参数,要等十分钟再测试,不是立马生效的。测试前重启app

收起阅读 »

添加到“用其他应用打开”中、app加入系统分享列表、获取分享的文件(ios、android)

添加到“用其他应用打开”中、app加入系统分享列表、获取分享的文件(ios、android):https://ext.dcloud.net.cn/plugin?id=6901

继续阅读 »

添加到“用其他应用打开”中、app加入系统分享列表、获取分享的文件(ios、android):https://ext.dcloud.net.cn/plugin?id=6901

收起阅读 »

uniapp中支持抽象节点

开发过程中发现对v-for里面需要传入组件,查了下小程序里slot并不支持,官方推荐的解决方案是抽象节点,因此在unicli 3+ 里快速实现了这一套能力。
目前仅处理了手q和微信,开发者根据自身项目情况去斟酌使用
还有些其他细节问题,后续会抽空不断完善这个插件
npm 地址

how to use

install

  • 仅支持uni-cli 3.0+
    $ npm i vite-plugin-uniapp-generics -D
  • vite.config.js 添加插件
    import uni from '@dcloudio/vite-plugin-uni';  
    import generic from 'vite-plugin-uniapp-generics';  
    export default defineConfig({  
    ...  
    plugins: [  
    uni(),  
    generic(),  
    ],  
    });

父组件(定义抽象节点)

说明

  • 在自定义的component下添加generic标识即可

    <自定义component名 generic />

    demo

    <!-- father-generic.vue -->  
    <template>  
    <view class="content">  
        <view>generic</view>  
        <view v-for="(val, index) in list" :key="index">  
            <beforeGeneric generic :index="index" :name="''+val" @tapInside="handleTap" />  
        </view>  
    
        <afterGeneric generic="true" :age="21" name="myname-after" />  
        <!-- 仅会验证generic参数,后面添加任意参数都不影响-->  
    </view>  
    </template>

组合组件(使用抽象节点)

说明

  • 在父组件中通过generic:传入对应的generic标识和需要传入的组件
  • 遵循小程序中的写法限制,仅允许传入自定义组件。
    <父组件名   
    generic:对应的generic组件名A="传入的子组件"   
    generic:对应的generic组件名B="传入的子组件"   
    ></父组件名>

demo

<!-- combine-generic.vue -->  
<template>  
    <view class="content">  
        <view>***** generic ***** </view>  
        <ceshiGenetic   
            generic:beforeGeneric="childComp1"   
            generic:afterGeneric="childComp2"  
        ></ceshiGenetic>  
        <view>***** end slot ***** </view>  
    </view>  
</template>  

<script>  
import childComp1 from '...';  
import childComp2 from '...';  

export default {  
  components: {  
    childComp1,  
    childComp2,  
  },  
}  
</script>

why to use

slot在小程序中的限制

  1. v-for中使用slot会怎样?

    • 仅会渲染出v-for中的首条内容,后面的子组件不会被渲染。
  2. slot并不支持v-for 需求:更强大的slot

    slot 本身应该是属于父组件的一部分,它能使用的数据是父组件数据而不是子组件数据。如果要定制子组件的“某些部分”的话,应该不是使用 slot,而是使用抽象节点

  3. slot不支持父组件传递数据

    • 这个目前uniapptaro都是静态编译的时候劫持数据,并在运行时结合vue3的响应式更新机制解决。

      taro3为什么可以结合v-forslot

    • 推断taro3中是结合wxs动态的生成wxml文件,因此对wxml文件来说,slot结构可以平铺输出,处理遍历slot导致的问题(未看源码验证)
    • 但这种设计可能会导致wxml需要频繁的重新生成,造成一定的性能问题和意料之外的bug

插件实现原理

原理

  1. 结合抽象节点的使用说明,抽象出适合vue的写法(参考上方使用说明)
  2. uniapp里的节点属性,除了白名单中的组件和白名单的props,其余都会被劫持到vue的运行时数据处理中,导致属性失效,因此需要在编译前通过白名单prop添加标识,文件输出阶段结合标识重组成微信小程序所需结构即可。

generic 入参限制

使用是相对遵循小程序原生写法,因此在组合组件的时候,generic入参仅支持传组件名,所以不能再组合组件的位置给generic组件入参。举个例子

  • slot 可以在组合组件/父组件定义位置入参

    // compA.vue 定义 slot,并且传入参数  
    <view>  
        <slot name="header" height="180" />  
    </view>  
    
    // 组合组件 中 可以给 slot 入参  
    <compA>  
        <template #header="{ height }">  
            <childComp age="10" :height="height" />  
        </template>  
    </compA>
  • generic 只能在 定义组件的位置入参

    // compB.vue 定义 generic,并且传入参数  
    <view>  
        <genericB :age="21" name="myname-after" />  
    </view>  
    
    // 组合组件 中, 不能给传入 generic 的组件入参  
    <compB   
        generic:genericB="childComp"   
    ></compB>

todo

  • 替换 u-i 为专用节点
  • 其他小程序中的验证
    • [x] 微信
    • [x] 手q
    • [ ] 快手
    • [ ] other...
  • sourcemap https://rollupjs.org/guide/en/#source-code-transformations
  • hbuilder 支持
继续阅读 »

开发过程中发现对v-for里面需要传入组件,查了下小程序里slot并不支持,官方推荐的解决方案是抽象节点,因此在unicli 3+ 里快速实现了这一套能力。
目前仅处理了手q和微信,开发者根据自身项目情况去斟酌使用
还有些其他细节问题,后续会抽空不断完善这个插件
npm 地址

how to use

install

  • 仅支持uni-cli 3.0+
    $ npm i vite-plugin-uniapp-generics -D
  • vite.config.js 添加插件
    import uni from '@dcloudio/vite-plugin-uni';  
    import generic from 'vite-plugin-uniapp-generics';  
    export default defineConfig({  
    ...  
    plugins: [  
    uni(),  
    generic(),  
    ],  
    });

父组件(定义抽象节点)

说明

  • 在自定义的component下添加generic标识即可

    <自定义component名 generic />

    demo

    <!-- father-generic.vue -->  
    <template>  
    <view class="content">  
        <view>generic</view>  
        <view v-for="(val, index) in list" :key="index">  
            <beforeGeneric generic :index="index" :name="''+val" @tapInside="handleTap" />  
        </view>  
    
        <afterGeneric generic="true" :age="21" name="myname-after" />  
        <!-- 仅会验证generic参数,后面添加任意参数都不影响-->  
    </view>  
    </template>

组合组件(使用抽象节点)

说明

  • 在父组件中通过generic:传入对应的generic标识和需要传入的组件
  • 遵循小程序中的写法限制,仅允许传入自定义组件。
    <父组件名   
    generic:对应的generic组件名A="传入的子组件"   
    generic:对应的generic组件名B="传入的子组件"   
    ></父组件名>

demo

<!-- combine-generic.vue -->  
<template>  
    <view class="content">  
        <view>***** generic ***** </view>  
        <ceshiGenetic   
            generic:beforeGeneric="childComp1"   
            generic:afterGeneric="childComp2"  
        ></ceshiGenetic>  
        <view>***** end slot ***** </view>  
    </view>  
</template>  

<script>  
import childComp1 from '...';  
import childComp2 from '...';  

export default {  
  components: {  
    childComp1,  
    childComp2,  
  },  
}  
</script>

why to use

slot在小程序中的限制

  1. v-for中使用slot会怎样?

    • 仅会渲染出v-for中的首条内容,后面的子组件不会被渲染。
  2. slot并不支持v-for 需求:更强大的slot

    slot 本身应该是属于父组件的一部分,它能使用的数据是父组件数据而不是子组件数据。如果要定制子组件的“某些部分”的话,应该不是使用 slot,而是使用抽象节点

  3. slot不支持父组件传递数据

    • 这个目前uniapptaro都是静态编译的时候劫持数据,并在运行时结合vue3的响应式更新机制解决。

      taro3为什么可以结合v-forslot

    • 推断taro3中是结合wxs动态的生成wxml文件,因此对wxml文件来说,slot结构可以平铺输出,处理遍历slot导致的问题(未看源码验证)
    • 但这种设计可能会导致wxml需要频繁的重新生成,造成一定的性能问题和意料之外的bug

插件实现原理

原理

  1. 结合抽象节点的使用说明,抽象出适合vue的写法(参考上方使用说明)
  2. uniapp里的节点属性,除了白名单中的组件和白名单的props,其余都会被劫持到vue的运行时数据处理中,导致属性失效,因此需要在编译前通过白名单prop添加标识,文件输出阶段结合标识重组成微信小程序所需结构即可。

generic 入参限制

使用是相对遵循小程序原生写法,因此在组合组件的时候,generic入参仅支持传组件名,所以不能再组合组件的位置给generic组件入参。举个例子

  • slot 可以在组合组件/父组件定义位置入参

    // compA.vue 定义 slot,并且传入参数  
    <view>  
        <slot name="header" height="180" />  
    </view>  
    
    // 组合组件 中 可以给 slot 入参  
    <compA>  
        <template #header="{ height }">  
            <childComp age="10" :height="height" />  
        </template>  
    </compA>
  • generic 只能在 定义组件的位置入参

    // compB.vue 定义 generic,并且传入参数  
    <view>  
        <genericB :age="21" name="myname-after" />  
    </view>  
    
    // 组合组件 中, 不能给传入 generic 的组件入参  
    <compB   
        generic:genericB="childComp"   
    ></compB>

todo

  • 替换 u-i 为专用节点
  • 其他小程序中的验证
    • [x] 微信
    • [x] 手q
    • [ ] 快手
    • [ ] other...
  • sourcemap https://rollupjs.org/guide/en/#source-code-transformations
  • hbuilder 支持
收起阅读 »