问题:scene 太长(参数少但长),生成不了小程序码
原因:
- 使用getUnlimitedQRCode获取无限制的小程序码时,可接受页面参数scene的长度不能超过32位字符
使用 JSBI 插件
- 安装:
1
npm install jsbi --save
- 用法:JSBI.BigInt()
解决方案
- 先把scene的『每个参数用JSBI.BigInt()』包裹住,防止在转格式的时候丢失精度
- 然后调用『.toString(36)』转为36进制
- 因为scene为32位的十进制,所以先转为36进制的,如果不满足可以考虑其他进制
- 然后使用『encodeURIComponent()』,生成二维码
- 按照分隔符解码和解构赋值得到参数(此时拿到的参数是36进制):
1
[a,b,c,d] = decodeURIComponent(params.scene).split(';')
- 转为十进制即可
相关文档
BigInt
了解BigInt
- JS 中的 NUmber 类型只能安全地表示-(2^53-1)和(2^53-1)之间的整数
- 任何超过这个范围的整数值都会丢失精度(四舍五入)
- 而使用『BigInt就不会丢失精度』,可以运算大整数
定义一个BigInt
- 在一个整数后面加n,例如: 10n
- 调用函数BigInt()并传递一个整数值或字符串值,例如: BigInt(10)
BigInt特点
- 不能用于 Math 对象中的方法
- 不能与任何 Number 实例混合运算,两者必须转换成同一种类型。但是需要注意,『BigInt 在转换成 Number 时可能会丢失精度』
- 当使用 BigInt 时,带小数的运算会被向下取整
- BigInt 和 Number 不是严格相等,但是宽松相等
1
2
3
4
5
6
7
8
9
10
11
12
13
140n === 0 // false
0n == 0 // true
2n > 2 // false
2n > 1 // true
const mixed = [4n, 6, -12n, 10, 4, 0, 0n];
mixed.sort(); // [-12n, 0, 0n, 10, 4n, 4, 6]
// 被 Object 包装的 BigInt, 使用 object 的比较规则进行比较,只用同一个对象比较时才相等
0n === Object(0n); // false
Object(0n) === Object(0n); // false
const o = Object(0n);
o === o // true
BigInt的方法
- Bigint.asIntN()
- 将 BigInt 值转换为一个 -2^(width-1) 与 2^(width-1) - 1 之间的有符号整数。
- BigInt.asUintN()
- 将一个 BigInt 值转换为 0 与 2^(width) - 1 之间的无符号整数。
- BigInt.prototype.toLocaleString()
- 返回此数字的 language-sensitive 形式的字符串。覆盖 Object.prototype.toLocaleString() 方法。
- BigInt.prototype.toString()
- 返回以指定基数 (base) 表示指定数字的字符串。覆盖 Object.prototype.toString() 方法。
- BigInt.prototype.valueOf()
- 返回指定对象的基元值。覆盖 Object.prototype.valueOf() 方法。