美文网首页让前端飞值得记录的Web前端之路
值得记录的 (七)- 微信小程序 globalData / r

值得记录的 (七)- 微信小程序 globalData / r

作者: passMaker | 来源:发表于2018-11-25 12:40 被阅读10次

    继续总结在小程序项目开发之中认为值得去记录的要点。本篇包括 globalDatawx.reLaunchbindscrolltolower

    globalData

    还是之前的小程序项目,需求是另一个二维码入口进入小程序时,页面内容的一些小的细节和正常入口渲染不同。可以采用的方法是在全局 app.jsglobalData 全局数据里面添加一个布尔类型进行判断。

    app.js

    globalData: {
      userInfo: null,
      ...,  
      isTravel: false,  // 判断是否是旅游商城入口
    },
    

    例如这个入口有一个登陆页,在这个登录页进行登陆成功时,说明是另外的入口进入小程序,修改 globalData 全局数据的 isTravel 值为 true

    渲染

    在其他 wxml 页面进行 wx:if 条件渲染时,不能直接在双括号插值表达式里面添加 app.globalData.isTravel 来进行判断。

    应该先在相应页面对应的 JS 中将 app.globalData.isTravel 的值取到,然后再转存到自己页面 JSdata 中。通过双括号插值表达式里面添加 isTravel 来判断渲染方式。

    相应页面

    // 相应页面.js
    var isTravel = app.globalData.isTravel
    
    data: {
      isTravel: isTravel,   // 键值相同可缩略
    }
    

    wx.reLaunch

    之前通过组件的方式在 tabbar 页面加载了首页、购物车、我的三个组件。在首页进入到商品详情页的时候,发现点击商品详情页的购物车按钮,跳转到的是正常入口小程序的 tabbar 页。

    由于需求是在另外一个入口进入小程序的情况下,不能让用户有任何的情况回到正常入口的页面,所以需要修复这个跳转 bug。除了要给这个详情页的购物车按钮添加条件渲染(通过 isTravel 判断)之外,还需要修改他的跳转方式。

    使用 wx.reLaunch 跳转到组件页(显示购物车组件),而不是跳转到正常入口的购物车页。wx.reLaunch 方法会在跳转页面之后,同时关闭所有其他页面。在方法的 url 之中传递一个参数 id ,并同时在组件页的 onLoad 生命周期中使用 option 取到这个参数。

    详情页按钮事件

    // 详情页 购物车按钮
      navTo_Travel() {
        wx.reLaunch({
          url: '/pages/travel_shop/travel?id=1'
        })
      },
    

    自定义 tabbar 组件页

    onLoad 中使用 option.id 取到参数,并在取到的时,将 currentTab 置为 1

    // 自定义 tabbar 组件页 JS
    onLoad: function (option) {
      let that = this
      // 如果是旅游商城详情页跳转过来的进入组件购物车页
      if(option.id == 1) {
        that.setData({
          currentTab: 1,
        })
      }
    }
    

    bindscrolltolower

    由于之前使用了 component 组件,在自定义组件之中,由于无法使用微信小程序原生自带的生命周期,因此无法在自定义组件之中,使用原生的 onReachBottom 来处理上拉触底事件。这里就可以使用 scroll-view 标签所带的 bindscrolltolower 方法来实现相同的触底刷新,但需要定义事件。

    详细属性参考 scroll-view 官方文档

    scroll-view 标签

    在模板标签中通过内联 style 结合组件 JS 动态获取到 scroll-view 的真实高度,并且通过 bindscrolltolower 定义一个 scrollBottom 事件

    <scroll-view class="content" scroll-y style='height:{{main_height}}px' bindscrolltolower='scrollBottom'>
      ...
      待渲染内容... {{item.xxx}}
      ...
    </scroll-view>
    

    组件 JS

    在相应组件 JS 的生命周期中先写入类似原生 onLoad 的方法,让页面加载时就执行,这里是因为必须要给 scroll-view 一个高度。到后面使用 bindscrolltolower 的时候才能够通过这个高度来触发事件。

    这是一个很关键的地方,除此之外在全局的 app.wxsspage 或最外层容器的 class .containerheight 也应该设置为 100% 。如果不设置好这些,会导致在使用 bindscrolltolower 时虽然页面触底但无法触发事件。

      lifetimes: {
        // 组件生命周期函数,可以为函数,或一个在methods段中定义的方法名
        attached: function () {
          //显示设置
          var res = wx.getSystemInfoSync();
          var patt1 = new RegExp("iOS");
          var result = patt1.test(res.system);
          let tmp = 0;
          let h = res.windowHeight - res.windowWidth / 750 * 116 - tmp;
          this.setData({
            main_height: h,  // 传给 scroll-view 模板的高度
          });
        },
    

    scrollBottom

    然后在 scrollBottom 中写和 onReachBottom 一样的请求即可。

    scrollBottom () {
      // 写相应的分页加载请求即可
    }
    



    通过这种方式,可以实现自定义 component 组件的上拉触底刷新。

    相关文章

      网友评论

        本文标题:值得记录的 (七)- 微信小程序 globalData / r

        本文链接:https://www.haomeiwen.com/subject/gysjqqtx.html