当前位置:   article > 正文

uniapp使用uView2.0框架遇到的问题_uniapp json-bigint

uniapp json-bigint

1、后端传16位数以上时出现精度缺失的情况

1)、使用 json-bigint,失败

2)、使用 config 里的 getTask,失败

3)、修改 dataType,成功

原因:

  • 通过ajax请求回来的数据在response和preview两种状态显示的是不同的。
  • response中的看到的数据格式其实是字符串(ajax请求回来的数据本质上是字符串格式),preview其实是用了JSON.Parse(字符串) 给我们做美化(格式化),这个转换过程中,一般不会出问题,但是,如涉及大数(一个很大的整数,超过了javascript最大的处理能力),就会产生转换精度丢失。
  • JavaScript 能够准确表示的整数范围在-2^532^53之间(不含两个端点),超过这个范围,无法精确表示这个值,这使得 JavaScript 不适合进行科学和金融方面的精确计算。 

 60f09502683540d2acf973c510808486.png

解决方法:

由于uView使用的是http请求插件是 luch-request(luch-request),去看了源码,发现:

81b3db70bc4c47cfa161922bd8379774.png

1、因此需要将 dataType 修改为 string,首先去 uview-ui --> libs --> luch-request --> adapters --> index.js下注释掉下图这行,如果不注释掉,即使在 request.js 中将 dataType 修改为 string,还是会进入这行,还是会进行 parse 转换。

e6761c0abf854aba8ae6b8f3acc8045c.png

 2、然后在 requent.js下:

 ee687bdfe74f4233b594c7f532473621.png

 3、在响应拦截里对响应回来的数据进行处理f66facf435874ed18e01839282aef090.png

成功转换: 

 beb2c00db86d4668ae3dc27cd59270e2.png

request.js全部代码:

  1. // 此vm参数为页面的实例,可以通过它引用vuex中的变量
  2. module.exports = (vm) => {
  3. // 初始化请求配置
  4. uni.$u.http.setConfig((config) => {
  5. /* config 为默认全局配置*/
  6. config.baseURL = 'xxxxxx'; /* 根域名 */
  7. config.dataType = 'string';
  8. return config
  9. })
  10. // 请求拦截
  11. uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
  12. // 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
  13. config.data = config.data || {}
  14. // 根据custom参数中配置的是否需要token,添加对应的请求头
  15. if(config?.custom?.auth) {
  16. // 可以在此通过vm引用vuex中的变量,具体值在vm.$store.state中
  17. const token = uni.getStorageSync('token');
  18. config.header.Authorization = token
  19. }
  20. return config
  21. }, config => { // 可使用async await 做异步操作
  22. return Promise.reject(config)
  23. })
  24. // 响应拦截
  25. uni.$u.http.interceptors.response.use((response) => {
  26. /* 对响应成功做点什么 可使用async await 做异步操作*/
  27. let data = response.data // 注意这个原来是 const ,因为后面要修改,所以改成 let
  28. var json = data.replace(/:s*([0-9]{15,})s*(,?)/g, ': "$1" $2')
  29. // 1.根据后端返回的数据调用一次或者两次replace替换
  30. var json1 = json.replace(/:s*([0-9]{15,})s*(,?)/g, ': "$1" $2')
  31. // 2.手动转换回json数据即可
  32. var trueData = JSON.parse(json1);
  33. // console.log('有问题的数据',response.data) //有问题的数据,长字段被四舍五入的数据
  34. console.log('正确的数据',trueData.data) //实际上正确的数据
  35. data = trueData
  36. // 自定义参数
  37. const custom = response.config?.custom
  38. if (data.code !== 200) {
  39. if (data.code == 401) { // token 失效
  40. uni.reLaunch({
  41. url: "/pages/login/login"
  42. })
  43. }
  44. // 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
  45. if (custom.toast !== false) {
  46. uni.$u.toast(data.msg)
  47. }
  48. // 如果需要catch返回,则进行reject
  49. if (custom?.catch) {
  50. return Promise.reject(data)
  51. } else {
  52. // 否则返回一个pending中的promise,请求不会进入catch中
  53. return new Promise(() => {})
  54. }
  55. }
  56. return data.data === undefined ? {} : data.data
  57. }, (response) => {
  58. // 对响应错误做点什么 (statusCode !== 200)
  59. return Promise.reject(response)
  60. })
  61. }

2、tabbar中间项凸出

 

1)在components文件夹下新建tabbar文件,如下图:

2)tabbar.vue代码:

  1. <template>
  2. <u-tabbar :value="val" @change="name => change(name)" zIndex="999">
  3. <u-tabbar-item :text="item.text" v-for="(item,index) in tabbarList">
  4. <image class="slot-icon" slot="active-icon" :class="index == 2 ? 'center-icon' : ''"
  5. :src="item.selectIcon"></image>
  6. <image class="slot-icon" slot="inactive-icon" :class="index == 2 ? 'center-icon' : ''"
  7. :src="item.icon"></image>
  8. </u-tabbar-item>
  9. </u-tabbar>
  10. </template>
  11. <script>
  12. export default {
  13. props: {
  14. value: {
  15. type: Number,
  16. default: 0
  17. }
  18. },
  19. data() {
  20. return {
  21. val: this.value,
  22. tabbarList: [{
  23. path: '/pages/index/index',
  24. icon: '/static/tabbar/index.png',
  25. selectIcon: '/static/tabbar/indexSel.png',
  26. text: '首页',
  27. },
  28. {
  29. path: '/pages/product/product',
  30. icon: '/static/tabbar/proxy.png',
  31. selectIcon: '/static/tabbar/proxySel.png',
  32. text: '产品',
  33. },
  34. {
  35. path: '/pages/video/video',
  36. icon: '/static/tabbar/my.png',
  37. selectIcon: '/static/tabbar/mySel.png',
  38. text: '视频',
  39. },
  40. {
  41. path: '/pages/news/news',
  42. icon: '/static/tabbar/my.png',
  43. selectIcon: '/static/tabbar/mySel.png',
  44. text: '新闻',
  45. },
  46. {
  47. path: '/pages/about/about',
  48. icon: '/static/tabbar/my.png',
  49. selectIcon: '/static/tabbar/mySel.png',
  50. text: '关于',
  51. }
  52. ]
  53. };
  54. },
  55. mounted() {
  56. // 隐藏原生tabbar
  57. uni.hideTabBar();
  58. },
  59. methods: {
  60. change(e) {
  61. this.$emit('change', this.val)
  62. // 跳转页面
  63. uni.switchTab({
  64. url: this.tabbarList[e].path
  65. });
  66. },
  67. }
  68. };
  69. </script>
  70. <style scoped lang="scss">
  71. .slot-icon {
  72. width: 40rpx;
  73. height: 40rpx;
  74. }
  75. .center-icon {
  76. width: 80rpx;
  77. height: 80rpx;
  78. }
  79. </style>

 3)在每个tabbar页面上使用,value值:tabbar是第几项就改成几

4)pages.json也要加上tabbar(原来怎么写就怎么写)

  1. "tabBar": {
  2. "color": "#999999",
  3. "selectedColor": "#1A1A1A",
  4. "borderStyle": "black",
  5. "backgroundColor": "#ffffff",
  6. "list": [{
  7. "pagePath": "pages/index/index",
  8. "iconPath": "static/tabbar/index.png",
  9. "selectedIconPath": "static/tabbar/indexSel.png",
  10. "text": "首页"
  11. }, {
  12. "pagePath": "pages/product/product",
  13. "iconPath": "static/tabbar/proxy.png",
  14. "selectedIconPath": "static/tabbar/proxySel.png",
  15. "text": "产品"
  16. }, {
  17. "pagePath": "pages/video/video",
  18. "iconPath": "static/tabbar/my.png",
  19. "selectedIconPath": "static/tabbar/mySel.png",
  20. "text": "视频"
  21. }, {
  22. "pagePath": "pages/news/news",
  23. "iconPath": "static/tabbar/my.png",
  24. "selectedIconPath": "static/tabbar/mySel.png",
  25. "text": "新闻"
  26. }, {
  27. "pagePath": "pages/about/about",
  28. "iconPath": "static/tabbar/my.png",
  29. "selectedIconPath": "static/tabbar/mySel.png",
  30. "text": "关于"
  31. }]
  32. },

5)找到uView里的u-tabbar,将居中对齐改成底部对齐

3、 uView折叠面板collapse在支付宝小程序上标题显示不出来

遇到问题:

在使用 uView 的 u-collapse 时,微信小程序可以正常显示,但支付宝小程序不可以

uView文档:Collapse 折叠面板 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

代码:

  1. <u-collapse>
  2. <u-collapse-item title="标题" name="标题1">
  3. <text>内容11111111</text>
  4. </u-collapse-item>
  5. </u-collapse>

微信小程序显示(正常):

 

支付宝小程序显示(标题没有了):

 

解决方案:

使用 slot 方式:

  1. <u-collapse>
  2. <u-collapse-item title="标题" name="标题1">
  3. <!-- 重点在下面这行!! -->
  4. <text slot="title">标题</text>
  5. <!-- 标题右侧的图标 -->
  6. <view slot="right-icon">
  7. <u-icon name="arrow-right"></u-icon>
  8. </view>
  9. <text>内容11111111</text>
  10. </u-collapse-item>
  11. </u-collapse>

原因:源码上有条件编译,用于区分微信小程序和其它平台的写法,微信小程序不支持slot写法

参考:pages/componentsB/collapse/collapse.nvue · umicro/uView2.0 - Gitee.com

注意:因为微信小程序不支持slot写法, 所以微信小程序还是要使用 title="标题" 这种方式

4、输入框u-input中placeholder样式修改

注意点1:要增加:placeholderStyle="{}",否则样式无效,

注意点2:placeholderClass的默认值是input-placeholder

注意点3:因为必须是.input-placeholder,为防止影响到其他输入框,增加父级class:input_box,或者其他能够不影响另外输入框的方式也可以

  1. <view class="input_box">
  2. <u-input v-model="phone_num" placeholder="请输入" :placeholderStyle="{}"></u-input>
  3. </view>
  1. ::v-deep .input_box .input-placeholder {
  2. color: red;
  3. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/622768
推荐阅读
相关标签
  

闽ICP备14008679号