供应商小程序记录


最近公司有个组需要做一个小程序,要实现的一些效果和功能,本质上不难,这里做一个记录以备忘。

一、下拉刷新上拉加载

实现下拉刷新和上拉加载的效果,虽然微信提供了wx.startPullDownRefresh方法,但是那是从页面最顶部实现的下拉刷新,不符合这里面的需求,所以这里实现了一个下拉刷新,上拉加载更多使用的是监听:bindscrolltolower。 如果需求可以妥协,还是建议使用微信自带的onPullDownRefresh()【监听用户下拉刷新事件】和onReachBottom()【监听用户上拉触底事件】。

1.png2.png

wxml片段,主要是这个布局的实现和下拉刷新的wxml代码和注释

<template>
  <view class="homePage">
  <!-- 页面最上面的退出栏,不用时隐藏 -->
    <view class="logoutView ">
      <view class="helpText">欢迎</view>
      <view>欢迎使用xxx小程序</view>
      <view class="logout" @tap="logout">退出</view>
    </view>
    <!-- 页面上面的的3个tab -->
    <view class="homeHeader">
      <view class=" " catchtap="switchSwiper('current',0)">tab1</view>
      <view class=" " catchtap="switchSwiper('current',1)">tab2</view>
      <view class=" " catchtap="switchSwiper('current',2)">tab3</view>
      <!-- 可以展开最上面的退出栏-->
      <view class="arrowView" catchtap="toggleHeaderText">
        <image src="" class="arrowIcon"></image>
      </view>
    </view>
    <!-- loading组件 -->
    <topLoading></topLoading>
    <!-- 3个tab页面分别使用小程序的swiper组件,3个tab -->
    <swiper class="swiperClass" current="" bindchange="swiperChange('current')">
      <swiper-item>
          <!-- tab1滚动层 -->
        <scroll-view class="scroll" scroll-y="" bindscroll="scroll" bindscrolltolower="grabListBtm">
          <view style="transform:translate(0, px); transition:transform s;" @touchstart="touchStart" @touchmove="touchMove" @touchend="toucheEnd">
            <repeat for="" key="index" index="index" item="item">
            <!-- tab1页面数据 -->
            </repeat>
            <!-- 页面底部loading加载 -->
            <block wx:if="">
              <view class="btmLoading">
                <bottomLoading></bottomLoading>
              </view>
            </block>
            <!-- 页面底部没有更多数据 -->
            <block wx:else>
              <view class="noMoreData">没有更多数据</view>
            </block>
          </view>
        </scroll-view>
      </swiper-item>
      <swiper-item>
          <!-- tab2滚动层 -->
        <scroll-view class="scroll" scroll-y="" bindscroll="scroll" bindscrolltolower="deliveryListBtm" scroll-top="deliveryScrollTop">
          <view style="transform:translate(0, px); transition:transform s;" @touchstart="touchStart" @touchmove="touchMove" @touchend="toucheEnd">
            <repeat for="" key="index" index="index" item="item">
            <!-- tab2页面数据 -->
            </repeat>
            <!-- 页面底部loading加载 -->
            <block wx:if="">
              <view class="btmLoading">
                <bottomLoading></bottomLoading>
              </view>
            </block>
            <!-- 页面底部没有更多数据 -->
            <block wx:else>
              <view class="noMoreData">没有更多数据</view>
            </block>
          </view>
        </scroll-view>
      </swiper-item>
      <swiper-item>
          <!-- tab3滚动层,滚动的监听函数和滚动到底部的监听函数 -->
        <scroll-view class="scroll" scroll-y="" bindscroll="scroll" bindscrolltolower="myOrderListBtm">
            <view style="transform:translate(0, px); transition:transform s;" @touchstart="touchStart" @touchmove="touchMove" @touchend="toucheEnd">
                <!-- tab3上面搜索栏目 -->
                <view class="orderHeader">
                  <input placeholder="请输入xxx搜索" class="searchInput" placeholder-class="placeholder" bindinput="myOrderIdInput" bindconfirm="searchMyOrderListById"/>
                  <view @tap="showFilter"><image class="filterImg" mode="aspectFit" src=""></image></view>
                </view>
                <repeat for="" key="index" index="index" item="item">
                <!-- tab3页面数据 -->
                </repeat>
                <!-- 页面底部loading加载 -->
                <block wx:if="">
                  <view class="btmLoading">
                    <bottomLoading></bottomLoading>
                  </view>
                </block>
                <!-- 页面底部没有更多数据 -->
                <block wx:else>
                  <view class="noMoreData">没有更多数据</view>
                </block>
              </view>
        </scroll-view>
        <!-- 遮罩层 -->
        <view class="mask" wx:if="" @tap="hideFilter"></view>
        <!-- 侧边弹出搜索栏 -->
        <view class="filterBox " style="height:">
          <view class="filterContent">
          <!-- 侧边栏的搜索内容 -->
          </view>
          <!-- 侧边栏底部的重置确定按钮 -->
          <view class="btnBox">
            <view @tap="resetFilter">重置</view>
            <view @tap="confirmFilter">确定</view>
          </view>
        </view>
      </swiper-item>
    </swiper>
  </view>
</template>

javascript片段,主要是下拉刷新的方法代码

<script>
    methods = {
        // 滑动开始
        touchStart(event) {
            // y方向上允许滚动,使用的是wx的scroll-y属性
            this.scrollY = true;
            // y方向的滑动起点
            this.startY = event.touches[0].pageY;
            // x方向的滑动起点
            this.startX = event.touches[0].pageX;
            // 重置关闭时间
            this.CloseTime = 0;
        },
        // 滑动过程
        touchMove(event) {
            // scrollTop是scroll-view滚动的距离,判断是不是向下滚动
            if (this.scrollTop > 5 && this.deltaY <= 0) {
              this.scrollY = true;
              return;
            }
            let moveX = event.touches[0].pageX;
            let moveY = event.touches[0].pageY;
            // x 与 y 方向的距离,判断是不是上下滚动,而不是左右滚动
            if (Math.abs(moveX - this.startX) / Math.abs(moveY - this.startY) > 0.5 || Math.abs(moveX - this.startX) > 50) return;
            // deltaY:y方向滑动距离
            this.deltaY = (moveY - this.startY)/3*2;
            this.scrollY = this.deltaY <= 0;
            // 滑动距离超过50就展示顶部loading
            if(this.deltaY >= 50) {
              this.$invoke('topLoading', 'show', {
                position: 'bottom'
              })
            }
        },
        // 滑动结束
        toucheEnd() {
            this.scrollY = true;
            // 如果滑动距离大于30就去请求数据,关闭loading
            if (this.deltaY > 30) {
              this.CloseTime = 1;
              this.deltaY = 0;
              this.$invoke('topLoading', 'close');
              // 请求列表中的数据
            } else {
              this.$invoke('topLoading', 'close');
              this.deltaY = 0;
            }
        },
        scroll(e) {
            this.scrollTop = e.detail.scrollTop;
        }
    }
</script>

wxss片段,主要的css和注释

<style lang="less">
    /*整个页面的样式,flex布局*/
    .homePage{
        display: flex;
        flex-direction: column;
        align-items: stretch;
        justify-content: space-between;
        overflow: hidden;
        position: relative;
        background-color:#eeeeee;
        width:100%;
        height: 100%;
    }
    /*swiper的样式*/
    .swiperClass{
        height: 100%;
        width:100%;
        flex:1;
        overflow:hidden;
    }
    /*滚动的样式*/
    .scroll {
          height:100%;
          width:100%;
    }
    /*小红点提醒*/
    .notice::after{
        content: '·';
        display: inline-block;
        position: absolute;
        top: 0;
        font-size: 80rpx;
        color:@myRed;
    }
</style>

二、实现侧边栏弹出

4.png3.png

wxml片段

<template>
  <view class="homePage">
    <!-- 3个tab页面分别使用小程序的swiper组件,3个tab -->
    <swiper class="swiperClass" current="" bindchange="swiperChange('current')">
      <swiper-item>
          <!-- tab3滚动层,滚动的监听函数和滚动到底部的监听函数 -->
        <scroll-view class="scroll" scroll-y="" bindscroll="scroll" bindscrolltolower="myOrderListBtm">
        </scroll-view>
        <!-- 遮罩层 -->
        <view class="mask" wx:if="" @tap="hideFilter"></view>
        <!-- 侧边弹出搜索栏 -->
        <view class="filterBox " style="height:">
          <view class="filterContent">
          <!-- 侧边栏的搜索内容 -->
          </view>
          <!-- 侧边栏底部的重置确定按钮 -->
          <view class="btnBox">
            <view @tap="resetFilter">重置</view>
            <view @tap="confirmFilter">确定</view>
          </view>
        </view>
      </swiper-item>
    </swiper>
  </view>
</template>

javascript片段

<script>
    /*因为ios和android高度计算不同,android的100%就是整个高度,*/
    setFilterHeight()       {
      let s = wx.getSystemInfoSync();
      if(wx.myUtil.stricmp(s.system.split(' ')[0],'ios')){
        this.filterHeight = Math.ceil(s.windowHeight*750/s.screenWidth - 90) + 'rpx';
      } else {
        this.filterHeight = '100%';
      }
    }
</script>

wxss片段

<style>
    /*侧边栏*/
    .filterBox {
        transition: all .5s ease;
        transform: translate3d(100%, 0, 0);
        position: absolute;
        width: 75%;
        right: 0;
        top: 0;
        bottom: 0;
        z-index: 3;
        background-color: #FFFFFF;
      }
      /*弹出动画*/
    .filterAnimation {
        transform: none;
    }
    /*遮罩层*/
    .mask {
        position: absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        width: 100%;
        background: rgba(0, 0, 0, .5);
        z-index: 2;
    }
</style>

三、实现下图的对号选择效果

实现不难,这里主要是记录一下 5.png

wxml片段

<view class="handler " @tap="selectHandler" data-idx="">
    <view></view>
    <view></view>
</view>

wxss片段,伪元素

<style>
.selected {
    position: relative;
    border-bottom:1rpx solid @selected;
    border-top:1rpx solid @selected;
    color: @myBlue;
    background-color: #E4F1F8;
}
.selected::before,.selected::after{
    position:absolute;
    background-color:@myBlue;
    content:""
}
.selected::before{
    width:20rpx;
    height:4rpx;
    transform: rotate(35deg);
    right:90rpx;
    top:51rpx;
}
.selected::after{
    width:4rpx;
    height:34rpx;
    transform: rotate(40deg);
    right:80rpx;
    top:30rpx;
}
</style>