锲子

微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在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="width:{{ww}}px;"> <view wx:for="{{2}}" style="margin:10px 0;display:flex;align-items:center;width:{{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="width:{{ww}}px;height:80px;background-color:blue;"> </view> <!-- 左滑区域 -->
<view class="left" style="width: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

运用wxs制作微信小程序左滑功能和跳转,性能更优越的更多相关文章

  1. 微信小程序左滑删除功能

    效果图如下: wxml代码: <view class="container"> <view class="touch-item {{item.isTou ...

  2. 微信小程序左滑删除

    <view class="touch-item {{item.isTouchMove ? 'touch-move-active' : ''}}" data-index=&qu ...

  3. 微信小程序左滑删除未操作有复位效果

    1.wxml <!--pages/test/test.wxml--> <view class="page"> <movable-area class= ...

  4. 微信小程序左滑显示按钮demo

    wxml结构(删除部分代码): <view class="chapter-item" wx:for="{{klgData}}" data-index=&q ...

  5. 微信小程序在线制作 自己制作微信小程序

    小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...

  6. 微信小程序调用蓝牙功能控制车位锁

    第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...

  7. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  8. 微信小程序实战 购物车功能

    代码地址如下:http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...

  9. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

随机推荐

  1. 纯 CSS 实现幻灯片播放

    介绍:   今日看到一道面试题,关于 使用纯CSS,不利用js, 写一个简单的幻灯效果页面.于是做了一个小demo,建议使用chrome,IE11查看~~ 主要思想: 利用 CSS3的 伪类选择器 : ...

  2. MongoDB 学习笔记之 mongo-connector安装

    mongo-connector安装: https://github.com/mongodb-labs/mongo-connector 1. yum -y install openssl* 2.编译安装 ...

  3. Android系统介绍与框架

    一.Andriod是什么? Android系统是Google开发的一款开源移动OS,Android中文名被国内用户俗称“安卓”.Android操作系统基于Linux内核设计,使用了Google公司自己 ...

  4. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)

    本文原创首发于公众号:Java技术干货 1.概述 本文将Nacos作为配置中心,实现配置外部化,动态更新.这样做的优点:不需要重启应用,便可以动态更新应用里的配置信息.在如今流行的微服务应用下,将应用 ...

  5. idea快捷键(mac下)

    ctrl+/ 代码提示 command+o 搜索要进入的类并进入 command+shift+enter 另起一行 command+shift+u 在变成全大写与变成全小写之间切换 shift+鼠标滑 ...

  6. 注册中心nacos完整部署及与eureka区别

    1. 场景描述 nacos最近用的比较多,介绍下nacos及部署吧,刚看了下以前写过类似的,不过没写如何部署及与eureka区别,只展示了效果,补补吧. 2.解决方案 2.1 nacos与eureka ...

  7. Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  8. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行

    本文将对如何在Java程序中操作Word表格作进一步介绍.操作要点包括 如何在Word中创建嵌套表格. 对已有表格添加行或者列 复制已有表格中的指定行或者列 对跨页的表格可设置是否禁止跨页断行 创建表 ...

  9. USART_FLAG_TXE和USART_FLAG_TC

    在串口数据发送操作中,代码一般是这样写的: void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data) { while(USART_GetFlag ...

  10. 线程封闭之栈封闭和ThreadLocal

    线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...