
APP备案公钥、证书MD5指纹/签名MD5值获取最简单方法
本文只详细讲解android app获取方法,三个平台获取方法(android、windows、macOS):
一. Android手机平台:前提,您的应用已安装到手机;然后,android应用市场搜索下载安装 APP备案助手,此app可直接获取所有已安装app的公钥、证书MD5指纹/签名MD5值,示例:获取 抖音app公钥、MD5等信息,
APP备案助手 获取结果,与下面两种方式获取结果一致;
二. Windows平台,下载jadx-gui反编译工具,github下载地址: https://github.com/skylot/jadx/releases
下载上图这个zip,然后解压后,打开 jadx-gui.exe,
点击 Open file/打开文件,打开apk安装包文件,
点击APK signature, Modulus/模数 为公钥,十进制显示的;MD5 Fingerprint/MD5签名,APP备案填写时需要去掉空格,填写32位长度的十六进制数据。
三. macOS平台,下载jadx-gui反编译工具,下载方法
终端执行 brew install jadx
执行完毕后,终端再输入命令 jadx-gui,即可打开jadx,
点击 Open file/打开文件,打开apk安装包文件,
点击APK signature, Modulus/模数 为公钥,十进制显示的;MD5 Fingerprint/MD5签名,APP备案填写时需要去掉空格,填写32位长度的十六进制数据。
本文只详细讲解android app获取方法,三个平台获取方法(android、windows、macOS):
一. Android手机平台:前提,您的应用已安装到手机;然后,android应用市场搜索下载安装 APP备案助手,此app可直接获取所有已安装app的公钥、证书MD5指纹/签名MD5值,示例:获取 抖音app公钥、MD5等信息,
APP备案助手 获取结果,与下面两种方式获取结果一致;
二. Windows平台,下载jadx-gui反编译工具,github下载地址: https://github.com/skylot/jadx/releases
下载上图这个zip,然后解压后,打开 jadx-gui.exe,
点击 Open file/打开文件,打开apk安装包文件,
点击APK signature, Modulus/模数 为公钥,十进制显示的;MD5 Fingerprint/MD5签名,APP备案填写时需要去掉空格,填写32位长度的十六进制数据。
三. macOS平台,下载jadx-gui反编译工具,下载方法
终端执行 brew install jadx
执行完毕后,终端再输入命令 jadx-gui,即可打开jadx,
点击 Open file/打开文件,打开apk安装包文件,
点击APK signature, Modulus/模数 为公钥,十进制显示的;MD5 Fingerprint/MD5签名,APP备案填写时需要去掉空格,填写32位长度的十六进制数据。
收起阅读 »
解决JSON.parse大数字转换精度丢失问题
因为js语言问题,数字大于16位后,会丢失16位以后的数字:比如声明 let n = 1234567890123456789;打印n之后会显示1234567890123456800;
同理JSON.parse将json字符串转为Object时,如果其中有大数字的值,也会发生精度丢失问题。
使用uni.request或uniCloud.httpclient.request 接收远程api返回数据时,如果返回数据里有大数字,并且直接设置了返回数据类型为json的话,则不能正常接收大数字。
此时就需要先接收为纯文本,也就是dataType = "text",再通过脚本匹配大数字后,给其加上字符串的引号,再进行JSON.parse的转换。这样就能正确接收大数字值了。
下面是转换函数实现:
// 解决大数字转换丢失问题
function jsonParse(text) {
text = text.replace(/([^"'\d])(\d{16,})/g, "$1\"$2\"")
return JSON.parse(text);
}
因为js语言问题,数字大于16位后,会丢失16位以后的数字:比如声明 let n = 1234567890123456789;打印n之后会显示1234567890123456800;
同理JSON.parse将json字符串转为Object时,如果其中有大数字的值,也会发生精度丢失问题。
使用uni.request或uniCloud.httpclient.request 接收远程api返回数据时,如果返回数据里有大数字,并且直接设置了返回数据类型为json的话,则不能正常接收大数字。
此时就需要先接收为纯文本,也就是dataType = "text",再通过脚本匹配大数字后,给其加上字符串的引号,再进行JSON.parse的转换。这样就能正确接收大数字值了。
下面是转换函数实现:
// 解决大数字转换丢失问题
function jsonParse(text) {
text = text.replace(/([^"'\d])(\d{16,})/g, "$1\"$2\"")
return JSON.parse(text);
}
收起阅读 »

Vue3高颜值组件库 Wot Design Uni 组件数量超过70了!
前言
九月份我们发布了 Wot Design Uni
的第一个版本,如今组件库的组件数量已超过60!
最近一个月我们做了什么
- WaterMark 水印
- Swiper 轮播
- Circle 环形进度条
- Segmented 分段控制器
- Tabbar 标签栏
- Navbar 导航条
接下来要做什么
- Sidebar 侧边栏
- Fab 悬浮按钮
- CountDown 倒计时
- NumberKeyboard 数字键盘
- PasswordInput 密码输入框
- Form 表单
- Table 表格
- Signature 签名
组件库介绍
非常感谢朋友们对我的支持和帮助,让组件库稳步的发展,关于组件库的特性和使用,可以参考本章节的内容。
<p align="center">
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>
<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a>
</p>
<p align="center">
<a href="https://wot-design-uni.cn/">文档网站 (官网)</a>
<a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p>
✨ 特性
- 支持 APP、H5、微信小程序 等平台.
- 70+ 个高质量组件,覆盖移动端主流场景.
- 使用 Typescript 构建,提供良好的组件类型系统.
- 采用 Vue3 最新特性,提升组件性能.
- 提供丰富的文档和组件示例.
- 支持主题定制,可以定制 scss 变量以及组件的样式自定义.
- 支持暗黑模式
预览
扫描二维码访问演示:
<p>
<img src="https://wot-design-uni.cn/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.cn/alipay.png" width="200" height="200" />
</p>
快速上手
详细说明见 快速上手。
链接
贡献指南
修改代码请阅读我们的 贡献指南。
使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR。
贡献者们
感谢以下所有给 Wot Design Uni 贡献过代码的 开发者。
<a href="https://github.com/Moonofweisheng/wot-design-uni/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Moonofweisheng/wot-design-uni" />
</a>
LICENSE
前言
九月份我们发布了 Wot Design Uni
的第一个版本,如今组件库的组件数量已超过60!
最近一个月我们做了什么
- WaterMark 水印
- Swiper 轮播
- Circle 环形进度条
- Segmented 分段控制器
- Tabbar 标签栏
- Navbar 导航条
接下来要做什么
- Sidebar 侧边栏
- Fab 悬浮按钮
- CountDown 倒计时
- NumberKeyboard 数字键盘
- PasswordInput 密码输入框
- Form 表单
- Table 表格
- Signature 签名
组件库介绍
非常感谢朋友们对我的支持和帮助,让组件库稳步的发展,关于组件库的特性和使用,可以参考本章节的内容。
<p align="center">
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/Moonofweisheng/wot-design-uni?logo=github&color=%234d80f0&link=https%3A%2F%2Fgithub.com%2FMoonofweisheng%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/v/wot-design-uni?logo=npm&color=%234d80f0&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img alt="npm" src="https://img.shields.io/npm/dw/wot-design-uni?logo=npm&link=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fwot-design-uni">
</a>
<a href="https://www.npmjs.com/package/wot-design-uni">
<img src="https://img.shields.io/npm/dt/wot-design-uni?style=flat-square">
</a>
<a href="https://github.com/Moonofweisheng/wot-design-uni">
<img alt="GitHub" src="https://img.shields.io/github/license/Moonofweisheng/wot-design-uni?logo=github">
</a>
<a href="https://app.netlify.com/sites/wot-design-uni/deploys" target="_blank" referrerpolicy="no-referrer">
<img src="https://api.netlify.com/api/v1/badges/0991d8a9-0fb0-483b-8961-5bde066bbd50/deploy-status" alt="deploy-status" />
</a>
</p>
<p align="center">
<a href="https://wot-design-uni.cn/">文档网站 (官网)</a>
<a href="https://wot-design-uni.netlify.app/">文档网站 (Netlify)</a>
</p>
✨ 特性
- 支持 APP、H5、微信小程序 等平台.
- 70+ 个高质量组件,覆盖移动端主流场景.
- 使用 Typescript 构建,提供良好的组件类型系统.
- 采用 Vue3 最新特性,提升组件性能.
- 提供丰富的文档和组件示例.
- 支持主题定制,可以定制 scss 变量以及组件的样式自定义.
- 支持暗黑模式
预览
扫描二维码访问演示:
<p>
<img src="https://wot-design-uni.cn/wx.jpg" width="200" height="200" style="margin-right:30px"/>
<img src="https://wot-design-uni.cn/alipay.png" width="200" height="200" />
</p>
快速上手
详细说明见 快速上手。
链接
贡献指南
修改代码请阅读我们的 贡献指南。
使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR。
贡献者们
感谢以下所有给 Wot Design Uni 贡献过代码的 开发者。
<a href="https://github.com/Moonofweisheng/wot-design-uni/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Moonofweisheng/wot-design-uni" />
</a>
LICENSE
收起阅读 »
uniapp 电子签名 包含 返回 撤回 颜色 线条等功能
请观看
使用教程
第一步 引入图标
在项目中的App.vue内添加下面代码
<style>
/*引入图标路径 */
@import 'uni_modules/TC-qianming/libs/css/iconfont.css';
</style>
第二步 引入组件即可
<template>
<view>
<TC-qianming></TC-qianming>
</view>
</template>
提需求 问题反馈 联系作者 V:ANKR6699
有什么不足之处所以留言提出,我将更新和更改
公众号也望大家关注一下

24小时在线接单(或全职)本人开发过多个uniapp项目(各种类型业务小程序和h5) 完美还原设计稿
- 精通react ,vue
- 熟悉各种类型业务
- 完美还原设计稿UI图
- 有大量时间
微信: h877488642
- 精通react ,vue
- 熟悉各种类型业务
- 完美还原设计稿UI图
- 有大量时间
微信: h877488642

违法与不良信息信息举报
为了进一步落实网信办各专项行动要求,营造良好网上舆论氛围,即日起开设「违法与不良信息信息举报」专项受理渠道。
- 「清朗·生活服务类平台信息内容整治」专项行动
- 「清朗·打击网络谣言和虚假信息」专项行动
- 「清朗·规范重点流量环节网络传播秩序」专项行动
另外如果您发现用户发布的内容、用户昵称等存在违法、违规或其它不良信息,也可通过下述方式向DCloud官方进行举报。
举报受理方式
举报邮箱:service@dcloud.io
为了进一步落实网信办各专项行动要求,营造良好网上舆论氛围,即日起开设「违法与不良信息信息举报」专项受理渠道。
- 「清朗·生活服务类平台信息内容整治」专项行动
- 「清朗·打击网络谣言和虚假信息」专项行动
- 「清朗·规范重点流量环节网络传播秩序」专项行动
另外如果您发现用户发布的内容、用户昵称等存在违法、违规或其它不良信息,也可通过下述方式向DCloud官方进行举报。
举报受理方式
举报邮箱:service@dcloud.io

Wot Design Uni 上新 Navbar 自定义导航栏组件 ,赶快进来看看效果吧!
Navbar 导航栏
为页面提供导航功能,常用于页面顶部。
地址
先看交互效果
:: tip 常见问题
右图标被小程序胶囊挡住?
在小程序平台开启自定义顶部导航时,右上角会固定显示胶囊,所以此时右侧插槽及选项是不建议使用。
如何设置为背景透明?
通过 custom-style
设置组件 background-color
为 transparent
。
<wd-navbar title="标题" custom-style="background-color: transparent !important;"></wd-navbar>
组件会被 video
覆盖?
video
为原生组件,层级较高,目前无法遮盖,需要具体平台具体分析。
::
基础用法
通过 title
属性设置导航栏标题。
<wd-navbar title="标题"></wd-navbar>
返回上级
在导航栏实现返回上级功能。
<wd-navbar title="标题" left-text="返回" left-arrow @click-left="handleClickLeft"></wd-navbar>
function handleClickLeft() {
uni.navigateBack()
}
右侧按钮
在导航栏右侧添加可点击的按钮。
<wd-toast></wd-toast>
<wd-navbar title="标题" left-text="返回" left-arrow right-text="按钮" @click-left="handleClickLeft" @click-right="handleClickRight"></wd-navbar>
import { useToast } from '@/uni_modules/wot-design-uni'
const { show: showToast } = useToast()
function handleClickRight() {
showToast('按钮')
}
使用插槽
可以通过 left
和 right
插槽自定义导航栏两侧的内容。
<wd-navbar title="标题" left-text="返回" left-arrow>
<template #right>
<wd-icon name="search" size="18" />
</template>
</wd-navbar>
固定在顶部
通过 fixed
可以设置导航条固定在页面顶部,通过设置 placeholder
可以在顶部生成占位空间,通过设置 safeAreaInsetTop
可以开启顶部安全区的适配。
<wd-navbar fixed placeholder title="Navbar 导航条" left-arrow safeAreaInsetTop></wd-navbar>
禁用按钮
通过 left-disabled
或 right-disabled
属性来禁用两侧的按钮。按钮被禁用时透明度降低,且无法点击。
<wd-navbar title="标题" left-text="返回" right-text="按钮" left-arrow left-disabled right-disabled></wd-navbar>
胶囊样式
通过 capsule
插槽和 navbar-capsule
组件定制返回胶囊。
<wd-navbar title="标题" left-text="返回" right-text="设置" left-arrow>
<template #capsule>
<wd-navbar-capsule @back="handleBack" @back-home="handleBackHome" />
</template>
</wd-navbar>
function handleBack() {
uni.navigateBack({})
}
function handleBackHome() {
uni.reLaunch({ url: '/pages/index/Index' })
}
带搜索栏
通过 title
插槽,自定义标题。
<wd-navbar left-text="返回" right-text="设置" left-arrow>
<template #title>
<view class="search-box">
<wd-search v-model="keyword" hide-cancel placeholder-left></wd-search>
</view>
</template>
</wd-navbar>
.search-box {
display: flex;
height: 100%;
align-items: center;
--wot-search-padding: 0;
--wot-search-side-padding: 0;
}
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 | 最低版本 |
---|---|---|---|---|---|
title | 卡片标题 | string | - | '' | 0.1.33 |
leftText | 左侧文案 | string | - | '' | 0.1.33 |
rightText | 右侧文案 | string | - | '' | 0.1.33 |
leftArrow | 显示左侧箭头 | boolean | true, false | false | 0.1.33 |
bordered | 显示下边框 | boolean | true, false | true | 0.1.33 |
fixed | 固定到顶部 | boolean | true, false | false | 0.1.33 |
placeholder | 固定在顶部时,在标签位置生成一个等高的占位元素 | boolean | true, false | false | 0.1.33 |
zIndex | 导航栏 z-index | number | - | 1 | 0.1.33 |
safeAreaInsetTop | 开启顶部安全区适配 | boolean | true, false | false | 0.1.33 |
leftDisabled | 禁用左侧按钮,禁用时透明度降低,且无法点击 | boolean | true, false | false | 0.1.33 |
rightDisabled | 禁用右侧按钮,禁用时透明度降低,且无法点击 | boolean | true, false | false | 0.1.33 |
Events
事件名称 | 说明 | 参数 | 最低版本 |
---|---|---|---|
click-left | 点击左侧按钮时触发 | - | 0.1.33 |
click-right | 点击右侧按钮时触发 | - | 0.1.33 |
Capsule Events
事件名称 | 说明 | 参数 | 最低版本 |
---|---|---|---|
back | 点击返回按钮时触发 | - | 0.1.33 |
back-home | 点击返回首页按钮时触发 | - | 0.1.33 |
Slot
名称 | 说明 | 最低版本 |
---|---|---|
capsule | 自定义胶囊(当存在胶囊时,left不生效) | 0.1.33 |
left | 左侧内容 | 0.1.33 |
title | 标题内容 | 0.1.33 |
right | 右侧内容 | 0.1.33 |
外部样式类
类名 | 说明 | 最低版本 |
---|---|---|
custom-class | 根节点样式类 | 0.1.33 |
custom-style | 根节点样式 | 0.1.33 |
地址
Navbar 导航栏
为页面提供导航功能,常用于页面顶部。
地址
先看交互效果
:: tip 常见问题
右图标被小程序胶囊挡住?
在小程序平台开启自定义顶部导航时,右上角会固定显示胶囊,所以此时右侧插槽及选项是不建议使用。
如何设置为背景透明?
通过 custom-style
设置组件 background-color
为 transparent
。
<wd-navbar title="标题" custom-style="background-color: transparent !important;"></wd-navbar>
组件会被 video
覆盖?
video
为原生组件,层级较高,目前无法遮盖,需要具体平台具体分析。
::
基础用法
通过 title
属性设置导航栏标题。
<wd-navbar title="标题"></wd-navbar>
返回上级
在导航栏实现返回上级功能。
<wd-navbar title="标题" left-text="返回" left-arrow @click-left="handleClickLeft"></wd-navbar>
function handleClickLeft() {
uni.navigateBack()
}
右侧按钮
在导航栏右侧添加可点击的按钮。
<wd-toast></wd-toast>
<wd-navbar title="标题" left-text="返回" left-arrow right-text="按钮" @click-left="handleClickLeft" @click-right="handleClickRight"></wd-navbar>
import { useToast } from '@/uni_modules/wot-design-uni'
const { show: showToast } = useToast()
function handleClickRight() {
showToast('按钮')
}
使用插槽
可以通过 left
和 right
插槽自定义导航栏两侧的内容。
<wd-navbar title="标题" left-text="返回" left-arrow>
<template #right>
<wd-icon name="search" size="18" />
</template>
</wd-navbar>
固定在顶部
通过 fixed
可以设置导航条固定在页面顶部,通过设置 placeholder
可以在顶部生成占位空间,通过设置 safeAreaInsetTop
可以开启顶部安全区的适配。
<wd-navbar fixed placeholder title="Navbar 导航条" left-arrow safeAreaInsetTop></wd-navbar>
禁用按钮
通过 left-disabled
或 right-disabled
属性来禁用两侧的按钮。按钮被禁用时透明度降低,且无法点击。
<wd-navbar title="标题" left-text="返回" right-text="按钮" left-arrow left-disabled right-disabled></wd-navbar>
胶囊样式
通过 capsule
插槽和 navbar-capsule
组件定制返回胶囊。
<wd-navbar title="标题" left-text="返回" right-text="设置" left-arrow>
<template #capsule>
<wd-navbar-capsule @back="handleBack" @back-home="handleBackHome" />
</template>
</wd-navbar>
function handleBack() {
uni.navigateBack({})
}
function handleBackHome() {
uni.reLaunch({ url: '/pages/index/Index' })
}
带搜索栏
通过 title
插槽,自定义标题。
<wd-navbar left-text="返回" right-text="设置" left-arrow>
<template #title>
<view class="search-box">
<wd-search v-model="keyword" hide-cancel placeholder-left></wd-search>
</view>
</template>
</wd-navbar>
.search-box {
display: flex;
height: 100%;
align-items: center;
--wot-search-padding: 0;
--wot-search-side-padding: 0;
}
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 | 最低版本 |
---|---|---|---|---|---|
title | 卡片标题 | string | - | '' | 0.1.33 |
leftText | 左侧文案 | string | - | '' | 0.1.33 |
rightText | 右侧文案 | string | - | '' | 0.1.33 |
leftArrow | 显示左侧箭头 | boolean | true, false | false | 0.1.33 |
bordered | 显示下边框 | boolean | true, false | true | 0.1.33 |
fixed | 固定到顶部 | boolean | true, false | false | 0.1.33 |
placeholder | 固定在顶部时,在标签位置生成一个等高的占位元素 | boolean | true, false | false | 0.1.33 |
zIndex | 导航栏 z-index | number | - | 1 | 0.1.33 |
safeAreaInsetTop | 开启顶部安全区适配 | boolean | true, false | false | 0.1.33 |
leftDisabled | 禁用左侧按钮,禁用时透明度降低,且无法点击 | boolean | true, false | false | 0.1.33 |
rightDisabled | 禁用右侧按钮,禁用时透明度降低,且无法点击 | boolean | true, false | false | 0.1.33 |
Events
事件名称 | 说明 | 参数 | 最低版本 |
---|---|---|---|
click-left | 点击左侧按钮时触发 | - | 0.1.33 |
click-right | 点击右侧按钮时触发 | - | 0.1.33 |
Capsule Events
事件名称 | 说明 | 参数 | 最低版本 |
---|---|---|---|
back | 点击返回按钮时触发 | - | 0.1.33 |
back-home | 点击返回首页按钮时触发 | - | 0.1.33 |
Slot
名称 | 说明 | 最低版本 |
---|---|---|
capsule | 自定义胶囊(当存在胶囊时,left不生效) | 0.1.33 |
left | 左侧内容 | 0.1.33 |
title | 标题内容 | 0.1.33 |
right | 右侧内容 | 0.1.33 |
外部样式类
类名 | 说明 | 最低版本 |
---|---|---|
custom-class | 根节点样式类 | 0.1.33 |
custom-style | 根节点样式 | 0.1.33 |
地址
收起阅读 »
关于在uniapp中使用v-html渲染html字符串时,html字符串内容过多且html内容渲染出来后超出可视区域的解决方案
问题:使用v-html渲染html字符串时,html字符串内容过多且html内容渲染出来后超出可视区域
- 在H5和app中解决方案
在h5中可使用canvas是绘制生成图片实现,app是通过缩放实现,为了适配不同机型需要动态计算一个缩放比,且缩放原点为style="transform-origin: top left;- 下载 npm install html2canvas
- 在渲染html的页面引入html2canvas
import html2canvas from 'html2canvas'
- 在template中编写
<!-- #ifdef APP-PLUS -->
<view v-if="!ratioX" id="contentToConvert" v-html="html" style="position: absolute; top: -10000rpx; left: -10000rpx;"></view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view v-if="!pdfImage" id="contentToConvert" v-html="html" style="position: absolute; top: -10000rpx; left: -10000rpx;"></view>
<!-- #endif -->
<scroll-view scroll-y="true" scroll-with-animation="true" style="width: 100%; height: 100%; margin-top: 10rpx;">
<!-- #ifdef APP-PLUS -->
<view v-html="html" style="transform-origin: top left;" :style="{ 'transform': `scale(${ratioX})` }"></view>
<!-- #endif -->
<!-- #ifdef H5 -->
<img style="width: 100%; height: auto;" v-if="pdfImage" :src="pdfImage" alt="Rendered PDF"></img>
<!-- #endif -->
</scroll-view>
- 在data() {},中定义
data() {
return {
html: null,
pdfImage: null,
ratioX: null,
};
},
- 重点:通过接口获得html字符串并且生成图片
async onLoad(option) { await this.getPrictOrder() await this.$nextTick() setTimeout(async () => { // #ifdef H5 await this.convertToPDF() // #endif // #ifdef APP-PLUS await this.toGetContentToConvert() // #endif }, 0) } methods: { //计算ratioX,缩放比 toGetContentToConvert() { let winInfo = uni.getSystemInfoSync(); const query = uni.createSelectorQuery().in(this); query.select('#contentToConvert').boundingClientRect(data => { if (data.width === 0) { this.toGetContentToConvert() return } this.ratioX = winInfo.windowWidth / data.width }).exec(); }, convertToPDF() { return new Promise((resolve) => { setTimeout(() => { // #capture 就是我们要获取截图对应的 DOM 元素选择器 html2canvas(document.getElementById('contentToConvert'), { useCORS: true, // 【重要】开启跨域配置 allowTaint: true, // 允许跨域图片 }).then((canvas) => { this.pdfImage = canvas.toDataURL('image/jpeg'); }); uni.hideLoading() }, 300); // 这里加上 300ms 的延迟是为了让 DOM 元素完全渲染完成后再进行图片的生成 }); }, }
问题:使用v-html渲染html字符串时,html字符串内容过多且html内容渲染出来后超出可视区域
- 在H5和app中解决方案
在h5中可使用canvas是绘制生成图片实现,app是通过缩放实现,为了适配不同机型需要动态计算一个缩放比,且缩放原点为style="transform-origin: top left;- 下载 npm install html2canvas
- 在渲染html的页面引入html2canvas
import html2canvas from 'html2canvas'
- 在template中编写
<!-- #ifdef APP-PLUS -->
<view v-if="!ratioX" id="contentToConvert" v-html="html" style="position: absolute; top: -10000rpx; left: -10000rpx;"></view>
<!-- #endif -->
<!-- #ifdef H5 -->
<view v-if="!pdfImage" id="contentToConvert" v-html="html" style="position: absolute; top: -10000rpx; left: -10000rpx;"></view>
<!-- #endif -->
<scroll-view scroll-y="true" scroll-with-animation="true" style="width: 100%; height: 100%; margin-top: 10rpx;">
<!-- #ifdef APP-PLUS -->
<view v-html="html" style="transform-origin: top left;" :style="{ 'transform': `scale(${ratioX})` }"></view>
<!-- #endif -->
<!-- #ifdef H5 -->
<img style="width: 100%; height: auto;" v-if="pdfImage" :src="pdfImage" alt="Rendered PDF"></img>
<!-- #endif -->
</scroll-view>
- 在data() {},中定义
data() {
return {
html: null,
pdfImage: null,
ratioX: null,
};
},
- 重点:通过接口获得html字符串并且生成图片
async onLoad(option) { await this.getPrictOrder() await this.$nextTick() setTimeout(async () => { // #ifdef H5 await this.convertToPDF() // #endif // #ifdef APP-PLUS await this.toGetContentToConvert() // #endif }, 0) } methods: { //计算ratioX,缩放比 toGetContentToConvert() { let winInfo = uni.getSystemInfoSync(); const query = uni.createSelectorQuery().in(this); query.select('#contentToConvert').boundingClientRect(data => { if (data.width === 0) { this.toGetContentToConvert() return } this.ratioX = winInfo.windowWidth / data.width }).exec(); }, convertToPDF() { return new Promise((resolve) => { setTimeout(() => { // #capture 就是我们要获取截图对应的 DOM 元素选择器 html2canvas(document.getElementById('contentToConvert'), { useCORS: true, // 【重要】开启跨域配置 allowTaint: true, // 允许跨域图片 }).then((canvas) => { this.pdfImage = canvas.toDataURL('image/jpeg'); }); uni.hideLoading() }, 300); // 这里加上 300ms 的延迟是为了让 DOM 元素完全渲染完成后再进行图片的生成 }); }, }

uni-app实现弹出框组件禁止滚动穿透
在uni-app开发中,经常会使用弹出框、遮罩层以及日期选择器等组件,但在这些组件中可能会出现滚动穿透的问题。滚动穿透是指当组件内的内容滚动到底部时,继续滑动会导致底层页面的滚动,这可能会影响用户体验。为了解决这个问题,我们可以采用以下方法。
滚动穿透是什么?
滚动穿透问题通常在使用弹出层、遮罩层或日期选择器等组件时出现。用户在组件内滚动内容时,当内容滚动到底部后,继续滑动可能导致底层页面也滚动,这不符合用户的期望。以下是两种解决方法。
解决方案
1. 禁止蒙版的滚动穿透
如果你想要禁止蒙版下的页面滚动,可以使用以下方法:
<!-- page-meta 只能是页面内的第一个节点 -->
<page-meta :page-style="`overflow:${show10 ? 'hidden' : 'visible'};`"></page-meta>
<wd-popup v-model="show10" lock-scroll position="bottom" :safe-area-inset-bottom="true" custom-style="height: 200px;" @close="handleClose10"></wd-popup>
在上述代码中,我们使用了 page-meta 组件来动态修改页面的 overflow
属性,通过绑定 show10
变量的值来控制页面的滚动。当 show10
为 true
时,底层页面的滚动被禁止,从而解决了滚动穿透问题。
2. 禁止Popup内容区域的滚动穿透
注意:在h5平台可以通过动态修改
body
标签的样式,设置overflow:hidden
即可解决滚动穿透,无循进行本章节的配置
a) 使用 page-meta 组件动态修改 page-meta
的 overflow
属性
<!-- page-meta 只能是页面内的第一个节点 -->
<page-meta :page-style="`overflow:${show10 ? 'hidden' : 'visible'};`"></page-meta>
<wd-popup v-model="show10" lock-scroll position="bottom" :safe-area-inset-bottom="true" custom-style="height: 200px;" @close="handleClose10"></wd-popup>
这个方法与上述禁止蒙版滚动穿透的方法类似,但它专门用于禁止Popup内容区域的滚动穿透。
b) 将页面包裹在 <scroll-view> 标签中,并设置高度为100vh
<scroll-view style="height: 100vh;">
<!-- 页面内容 -->
</scroll-view>
通过将页面内容包裹在 <scroll-view>
标签中,并设置高度为100vh(即视口的高度),可以有效地防止Popup内容区域的滚动穿透。这种方法不需要额外的组件配置,非常简单。
关于 page-meta
page-meta 是一个用于指定页面属性和监听页面事件的组件,它可以部分替代 pages.json
的功能。它的引入使得在vue文件中配置页面属性成为可能,从而实现更灵活的页面管理。
尽管 page-meta
具有一定的替代作用,但在性能方面不如 pages.json
的配置。在新页面加载时,使用 pages.json
的方式更为高效。
综上所述,通过合理使用上述方法,你可以轻松解决uni-app中的滚动穿透问题,提升用户体验
完整实现
在uni-app开发中,经常会使用弹出框、遮罩层以及日期选择器等组件,但在这些组件中可能会出现滚动穿透的问题。滚动穿透是指当组件内的内容滚动到底部时,继续滑动会导致底层页面的滚动,这可能会影响用户体验。为了解决这个问题,我们可以采用以下方法。
滚动穿透是什么?
滚动穿透问题通常在使用弹出层、遮罩层或日期选择器等组件时出现。用户在组件内滚动内容时,当内容滚动到底部后,继续滑动可能导致底层页面也滚动,这不符合用户的期望。以下是两种解决方法。
解决方案
1. 禁止蒙版的滚动穿透
如果你想要禁止蒙版下的页面滚动,可以使用以下方法:
<!-- page-meta 只能是页面内的第一个节点 -->
<page-meta :page-style="`overflow:${show10 ? 'hidden' : 'visible'};`"></page-meta>
<wd-popup v-model="show10" lock-scroll position="bottom" :safe-area-inset-bottom="true" custom-style="height: 200px;" @close="handleClose10"></wd-popup>
在上述代码中,我们使用了 page-meta 组件来动态修改页面的 overflow
属性,通过绑定 show10
变量的值来控制页面的滚动。当 show10
为 true
时,底层页面的滚动被禁止,从而解决了滚动穿透问题。
2. 禁止Popup内容区域的滚动穿透
注意:在h5平台可以通过动态修改
body
标签的样式,设置overflow:hidden
即可解决滚动穿透,无循进行本章节的配置
a) 使用 page-meta 组件动态修改 page-meta
的 overflow
属性
<!-- page-meta 只能是页面内的第一个节点 -->
<page-meta :page-style="`overflow:${show10 ? 'hidden' : 'visible'};`"></page-meta>
<wd-popup v-model="show10" lock-scroll position="bottom" :safe-area-inset-bottom="true" custom-style="height: 200px;" @close="handleClose10"></wd-popup>
这个方法与上述禁止蒙版滚动穿透的方法类似,但它专门用于禁止Popup内容区域的滚动穿透。
b) 将页面包裹在 <scroll-view> 标签中,并设置高度为100vh
<scroll-view style="height: 100vh;">
<!-- 页面内容 -->
</scroll-view>
通过将页面内容包裹在 <scroll-view>
标签中,并设置高度为100vh(即视口的高度),可以有效地防止Popup内容区域的滚动穿透。这种方法不需要额外的组件配置,非常简单。
关于 page-meta
page-meta 是一个用于指定页面属性和监听页面事件的组件,它可以部分替代 pages.json
的功能。它的引入使得在vue文件中配置页面属性成为可能,从而实现更灵活的页面管理。
尽管 page-meta
具有一定的替代作用,但在性能方面不如 pages.json
的配置。在新页面加载时,使用 pages.json
的方式更为高效。
综上所述,通过合理使用上述方法,你可以轻松解决uni-app中的滚动穿透问题,提升用户体验
完整实现
可以参考 wot-design-uni
组件库的 popup
组件的实现。
Github
文档网站
插件市场
QQ群