问题:scene 太长(参数少但长),生成不了小程序码
原因:
- 使用getUnlimitedQRCode获取无限制的小程序码时,可接受页面参数scene的长度不能超过32位字符
使用 JSBI 插件
- 安装:npm install jsbi –save
- 用法:JSBI.BigInt()
解决方案
- 1.先把scene的每个参数用JSBI.BigInt()包裹住,防止在转格式的时候丢失精度
- 2.然后调用.toString(36)转为36进制
- 因为scene为32位的十进制,所以先转为36进制的.如果不满足可以考虑其他进制
- 3.然后使用encodeURIComponent(),生成二维码
- 4.按照分隔符解码和解构赋值得到参数:
- [a,b,c,d] = decodeURIComponent(params.scene).split(‘;’),
- 此时拿到的参数是36进制的还要再转回十进制
- 5.转为十进制即可
相关文档
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() 方法。