微信小程序开发过程中常遇到的坑

294 阅读4分钟

小程序开发的经验比较少,记录一下自己遇到过的问题和学习笔记

1,从A页面跳转B页面后,如何刷新B页面

问题描述: 有的场景从A页面跳转B页面时,需要在B页面实时获取A页面的详情内容,这个时候就需要在跳转成功后触发一次刷新,如何实现捏?

当然啦,实现方法也要根据实际场景去选择,以下是我个人的解决方案

  • a方案

使用onshow()方法 在B页面的.js文件中添加onShow()方法

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    this.refresh() //对应的刷新方法
  },

优点: onshow()是在每次页面呈现时都会被调用的一个生命周期,所以从A页面跳转B页面时,会再次触发onshow()方法,跳转后刷新B页面,实现方式简单。

缺点: 但这个方案只要页面呈现就会触发onshow(),有些场景可能不适用,比如B页面是一个文章内容,当我文章看到一半,把小程序切到后台看了一下别的APP,再次切回来,就会触发onshow()方法,文章重新刷新,我看的位置也被更新了,这样体验感会不好,同时每次页面展示都会调用接口造成浪费的资源

  • b方案

使用全局变量做标记

在app.js文件中添加添加全局变量-是否跳转到B页面标识

    /**
    * 添加全局变量-是否跳转到B页面标识-navigateToBPage
    */
    App({
      navigateToBPage:false,
    })

在A.js文件中添加跳转事件,并变更navigateToBPage为true

   /**
   * 跳转到B页面方法
   */
  navigateToBPage: function (e) {
    let app = getApp();
    app.globalData.navigateToBPage = true;  //变更navigateToBPage为true
    wx.navigateTo({
      url: "/pages/BPage/BPage"
    })
  },

在B.js文件中获取全局变量navigateToBPage,并还原navigateToBPage为false

   /**
   * 跳转到B页面方法
   */
  navigateToBPage: function (e) {
    let app = getApp();
    app.globalData.navigateToBPage = true;  //变更navigateToBPage为true
    wx.navigateTo({
      url: "/pages/BPage/BPage"
    })
  },

优点: 在跳转时

缺点:

  • c方案:跳转成功后,拿到要跳转的B页面page,触发更新方法,
   /**
   * 跳转到B页面方法
   */
  navigateToBPage: function (e) {
   let url ="pages/BPage/BPage"
    wx.switchTab({
      url:"/pages/BPage/BPage",
      success: function (e) {
        var page = getCurrentPages().pop();
        if (page == undefined || page == null || page.route!=url) return;
        page.jumpRefresh();  //B页面中的更新方法
      }
    })
  },

2,切换底部tabbar不触发onload()

问题描述: 由于onload()生命周期只在组件初次加载时才会被调用,所以如果在不是第一次进入页面时,切换底部tabbar就不会触发onload(),这时我们可以使用onTabItemTap() 函数手动触发onload()

使用方法:在对应的.js文件中添加以下代码

Page({
  onTabItemTap(item) {
     this.onLoad();
  }
})

3,wx小程序switchTab跳转不可以带参数(从A跳转到B)

1698976300946.png 解决方法:

  • 方法一:利用全局变量

    通过设置app.js中的globalData中的值来解决switchTab带参数跳转的问题

    具体实现方法:

    1,设置全局变量

    /**
    * 添加全局变量-跳转时需要的参数
    */
    App({
    //跳转时需要的参数
      billData:{
          id:'',
          cycle:''
      },
    })
    

    2,在A tab页面跳转方法中更新全局变量

    /**
    * 跳转函数
    */
      navigateToBPage: function (e) {
        let app = getApp();
        let url =  "pages/BPage/BPage";
        app.globalData.billData = {
          id:this.data.id,
          cycle:this.data.cycle
        }, 
        //wx.switchTab: url 不支持 queryString,利用全局数据
        wx.switchTab({
          url:"/pages/BPage/BPage",
          success: function (e) {
            var page = getCurrentPages().pop();
            if (page == undefined || page == null  || page.route!=url) return;
            page.onLoad();
          }
        })
    },
    

    3,在B tab页面中获取全局变量,并还原

    /**
    * 在初始化函数中获取全局变量,并还原
    */
    initData() {
       let app = getApp();
       var billData = app.globalData.billData; //获取全局变量
       this.setData({
         billData,
       })
       //还原全局数据
       app.globalData.billData = {
          id:'',
         cycle:''
       }
    }
    
    
  • 方法二:利用storage来缓存数据,跳转到tab页之后再获取storage,并清除数据,类似方法一

    wx.setStorageSync('xxx',xxxxxx)

4,小程序引用van-dropdown-menu,滚动会手势穿透

问题描述: 在微信小程序中使用Vant组件库提供的DropdownMenu下拉菜单组件时,当内容超过一定高度时,下拉框内容会出现滚动条,当下拉框滚动到底部时,仍划动下拉区域,顶部会出现间隙,继续划动会导致底层页面也随之滚动,这就是滚动手势穿透。

解决方案: DropdownMenu下拉菜单组件内部结合了Popup弹出层组件。 目前,Popup组件可以通过lock-scroll属性处理部分滚动穿透问题。 但由于小程序自身原因,弹窗内容区域仍会出现滚动穿透。 不过,Vant组件为开发者提供了一个推荐方案以完整解决滚动穿透:page-meta

当小程序基础库最低版本在 2.9.0 以上时,即可使用 page-meta 组件动态修改页面样式

首先在对应的.wxml文件中加入以下代码

<!-- page-meta 只能是页面内的第一个节点 -->
<page-meta page-style="{{ showDropdownMenu ? 'overflow: hidden;' : '' }}" />
<!-- 下拉框 -->
<van-dropdown-menu active-color="#1989fa" style="width: 65%;">
  <van-dropdown-item value="{{ hotelId }}" options="{{ hotelList }}"  bind:open="openDropdown" bind:close="closeDropdown"/>
</van-dropdown-menu>

在对应的.js文件中加入以下代码


openDropdown() {   this.setData({showDropdownMenu: true })},

closeDropdown() {  this.setData({showDropdownMenu: false }) },

当下拉菜单显示时,将page-style属性值设置为overflow: hidden,隐藏时置空,这样就很好的解决了滚动手势穿透的问题。

5,在.wxml文件中模块引用js方法

问题描述: 在微信小程中如何在.wxml中直接引用js方法返回字段

举个栗子: 千分位金额数据 (8,887.21)


<view>{{BillModule.formatMoney(data.price)}}</view>

<!-- 格式化金额 -->
<wxs module="BillModule">
function formatMoney (value) {
  return value.toLocaleString('en-US');
}
module.exports = {
  formatMoney: formatMoney
}
</wxs>