zoukankan      html  css  js  c++  java
  • 运用wxs制作微信小程序左滑功能和跳转,性能更优越

    锲子

    微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在js中实现,但在拖动方面,性能并不是那么的流畅。如今,官方新扩展了一套脚本语言wxs,在IOS设备上运行,性能会比JS快2~20倍,至于安卓上运行效率无差异。

    构思

    结合wxs,做左滑功能主要分为三个步骤:拖动开始=>拖动中=>拖动结束

    让我们看看,这三个步骤需要做好哪些工作?

    拖动开始

    1. 获取触发事件点的坐标数据
    2. 将坐标数据存到组件中,“拖动中”和“拖动结束”这两步骤要用上

    拖动中

    1. 拿到拖动开始时存储的坐标数据
    2. 获取每一个拖动点的坐标数据,计算出与拖动开始的坐标数据的横坐标之差
    3. 根据计算出的横坐标之差加上当前左滑的距离,设置该组件的样式

    拖动结束

    1.  拿到拖动开始时存储的坐标数据
    2. 获取离开时触发点的坐标数据,计算出与拖动开始的坐标数据的横坐标之差
    3. 根据计算出的结果,判断拖动是向左还是向右?最好设置好该组件的样式

    代码片段

    index.wxs

    // 拖动开始时的事件
    function lwstart(event,ins){
      console.log("拖动开始");
    
      // 获取事件触发点的坐标数据
      var touch = event.touches[0] || event.changedTouches[0]
      //存储坐标数据,后期使用
      var moveE = ins.getState();
      moveE.startX = touch.pageX;
      moveE.startY = touch.pageY;
    
      //默认左滑当前的距离,也要存储起来
      if (!moveE.rX) {
        moveE.rX = 0;
      }
      
    }
    
    // 拖动中时的事件
    function lwmove(event, ins) {
      //获取到该组件的id
      var id = event.currentTarget.dataset.id;
      //组件实例
      var node = ins.selectComponent(id);
      if(node){
    
        // 获取拖动点的坐标数据
        var touch = event.touches[0] || event.changedTouches[0]
        //拿出拖动开始时存储的数据
        var moveE = ins.getState();
    
        //计算拖动点与拖动开始时的触发点之间的横坐标之差
        var gap = touch.pageX - moveE.startX;
    
        //获取左滑的距离(拖动中不存储这个数据,而是拖动结束来存储这个数据)
        var left = moveE.rX;
    
        //为向左滑动做处理,开始设置左滑的距离
        if (gap < 0) {
          // 设置组件向左滑的距离
          node.setStyle({
            "transform": "translateX(" + (gap + left) + "px)"
          })
        }
    
        console.log("拖动中", (gap + left));
      }
    }
    
    // 拖动结束时的事件
    function lwend(event, ins) {
      console.log("拖动结束");
    
      //获取到该组件的id
      var id = event.currentTarget.dataset.id;
      //组件实例
      var node = ins.selectComponent(id);
      if(node){
    
        // 获取离开点的坐标数据
        var touch = event.touches[0] || event.changedTouches[0]
        //拿出拖动开始时存储的数据
        var moveE = ins.getState();
        var x = touch.pageX;
    
        //计算拖动点与拖动开始时的触发点之间的横坐标之差
        var gap = x - moveE.startX;
    
        //重新设置左滑的距离(最大是左滑区域的宽度:80,最小是0)
        //根据算出来的数据判断是右滑还是左滑?
        console.log(gap, "gggg");
        if (Math.floor(gap) == 0||Math.floor(gap)==-1) {
          console.log("调用导航方法");
          //跟点击事件差不多了
          // 调用js里的方法跳转就行
          ins.callMethod('navfn', {
            id: id
          })
        }  
        else if (gap < 0) {
          // 左滑
          // 设置左滑最大距离
          node.setStyle({
            "transform": "translateX(-80px)"
          })
    
          // 存储左滑距离
          moveE.rX = -80;
        } else if (gap > 0) {
          //右滑
          //设置左滑最小距离
          node.setStyle({
            "transform": "translateX(0px)"
          })
          // 存储左滑距离
          moveE.rX = 0;
        }
      }
    
    }
    
    
    
    module.exports={
      lwstart:lwstart,
      lwmove:lwmove,
      lwend:lwend
    }

    index.wxml

    <!-- 导入wxs -->
    <wxs module="test" src="./index.wxs"></wxs>
    <!-- 作者有点懒,样式全是内联样式 -->
    <!-- 我设置了两种组件的具体宽度(屏幕宽度和左滑宽度) -->
    <!-- 不允许横向滚动 -->
    <scroll-view style="{{ww}}px;">
    
      <view wx:for="{{2}}" style="margin:10px 0;display:flex;align-items:center;{{ww+80}}px;transition:transform .3s;" bindtouchstart="{{test.lwstart}}" bindtouchmove="{{test.lwmove}}" bindtouchend="{{test.lwend}}" id="move{{index}}" data-id="#move{{index}}">
        <!-- 内容区域 -->
        <view class="con" style="{{ww}}px;height:80px;background-color:blue;">
              
        </view>
        
        <!-- 左滑区域 -->
        <view class="left" style="80px;height:60px;background-color:red;">
    
        </view>
      </view>
    </scroll-view>

    index..js

    let that;
    
    Page({
      data: {
        ww:400
      },
      onLoad: function () {
        that=this;
        wx.getSystemInfo({
          success: function(res) {
            that.setData({
              ww:res.windowWidth
            })
          },
        })
      },
      navfn(e){
        console.log(e,"跳转");
        wx.navigateTo({
          url: '../nav/nav?id='+e.id,
        })
      }
    })

    预览效果

     

     代码片段链接:https://developers.weixin.qq.com/s/r89ejJmP7ncM

  • 相关阅读:
    [ZJOI2007]仓库建设(斜率dp优化)
    [HNOI2008]玩具装箱toy(斜率优化dp)
    2019牛客暑期多校训练营(第十场)F-Popping Balloons
    2019牛客暑期多校训练营(第十场)B-Coffee Chicken
    子集的生成—二进制枚举
    2019牛客暑期多校训练营(第九场)D-Knapsack Cryptosystem(思维+子集和)
    2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
    字符串的最小表示法
    2019牛客暑期多校训练营(第八场)
    [HDU4734] 不要62(数位dp入门)
  • 原文地址:https://www.cnblogs.com/murenziwei/p/11819282.html
Copyright © 2011-2022 走看看