热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小程序里实现左滑动操作

1、wxml文件

1、wxml 文件

<view class="oper-list">
<view class="search-input">
<input placeholder="请输入账号" type="text" confirm-type="search" bindinput="saveKeyword" bindconfirm="queryAdminList" />
<text class="iconfont icon-chaxun1 icon-query">text>
view>
<view class="admin-add" bindtap="toAddAdmin">
<image src="../../../image/add-admin.png" />
view>
view>
<view wx:for="{{role_list}}" wx:for-item="role" wx:key="number" wx:if="{{role.number.length>0}}">
<view class="role-item-name">
{{role.name}}
view>
<view wx:if="{{role.number==item.role}}" class="touch-item {{item.isTouchMove ? 'touch-move-active' : ''}}" data-index="{{item.id}}" wx:for="{{show_admin_list}}" wx:key="id">
<view class="content">
<view style="{{item.txtStyle}}" class='item' data-index='{{item.id}}' bindtouchstart="touchstart" bindtouchmove="touchmove" bindtouchend="touchE">
<view class="admin-info">
<view class="head-pic" bindtap="toAdminInfo" data-admin-no="{{item.clerk_no}}">
<image src="{{item.head_pic?item.head_pic:default_head_pic}}" />
view>
<view class="role-info" bindtap="toAdminInfo" data-admin-no="{{item.clerk_no}}">
<view class="admin-info-name">
{{item.clerk_name}} {{item.clerk_no}}
view>
<view class="role-info-name">
{{item.role_name}}
view>
view>
<view class="role-oper" wx:if="{{item.openid.length>0}}" bindtap="toAdminInfo" data-admin-no="{{item.clerk_no}}">
<view class="admin-phoneno">
{{item.phone_no}}
view>
<view class="role-oper-btn">
已绑定
view>
view>
<view class="role-oper" wx:else bindtap="bindAdmin" data-admin-no="{{item.clerk_no}}" data-admin-pwd="{{item.clerk_pwd}}">
<view class="share-pic">
<image src="../../../image/share.png">image>
<view class="share-txt">
分享
view>
view>
view>
view>
view>
view>
<view class="del">
<view data-admin-no="{{item.clerk_no}}" data-openid="{{item.openid}}" data-id="{{item.id}}" catchtap="operAdmin" data-oper-type="unbind" data-index="{{item.id}}" class="untying">解绑view>
<view class='delete' data-admin-no="{{item.clerk_no}}" data-id="{{item.id}}" data-oper-type="delete" catchtap="operAdmin" data-index="{{item.id}}">删除view>
view>
view>
view>
<view class="admin-count">
{{show_admin_list.length}}个账号
view>

2、wxss 文件

.touch-item {
display: flex;
justify-content: space-between;
width: 100%;
overflow: hidden;
background: rgba(255, 255, 255, 1);
opacity: 1;
}
.content {
width: 100%;
margin-right: 0;
-webkit-transition: all 0.4s;
transition: all 0.4s;
-webkit-transform: translateX(120px);
transform: translateX(120px);
margin-left: -120px;
}
.del {
width: 120px;
display: flex;
align-items: center;
justify-content: space-between;
color: #fff;
-webkit-transition: all 0.4s;
transition: all 0.4s;
font-size: 35rpx;
-webkit-transform: translateX(180px);
transform: translateX(180px);
}
.del .delete {
background: red;
display: flex;
align-items: center;
justify-content: center;
width: 50%;
height: 100%;
}
.del .untying {
background: orange;
display: flex;
align-items: center;
justify-content: center;
width: 50%;
height: 100%;
}
.touch-move-active .content, .touch-move-active .del {
-webkit-transform: translateX(0);
transform: translateX(0);
}
page {
background: #fff;
}
.oper-list {
width: 100%;
display: flex;
display: -webkit-flex;
margin-top: 10px;
margin-bottom: 10px;
/* position: fixed;
top: 10px;
left: 2%; */
}
.search-input {
width: 84%;
height: 40px;
line-height: 40px;
margin-left: 2%;
}
.search-input input {
height: 30px;
line-height: 30px;
padding: 5px;
border: 1rpx solid #eee;
vertical-align: middle;
border-radius: 30px;
background: #f5f5f5;
}
.admin-add {
height: 40px;
line-height: 40px;
text-align: center;
width: 14%;
}
.admin-add image {
width: 30px;
height: 30px;
padding: 5px;
}
.admin-list {
width: 100%;
margin-top: 10px;
}
.admin-info {
display: -webkit-flex;
height: 60px;
border-bottom: 1px solid #eee;
font-size: 14px;
}
/**
内容超出显示 ...
*/
.admin-info-name {
height: 25px;
line-height: 25px;
color: #7a7d88;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.role-info-name {
height: 25px;
line-height: 25px;
color: #7a7d88;
}
.admin-phoneno {
height: 25px;
line-height: 25px;
}
.role-oper-btn {
height: 25px;
line-height: 25px;
}
.head-pic {
width: 80px;
padding: 5px 0px 5px 10px;
}
.head-pic image {
width: 50px;
height: 50px;
border-radius: 10px;
}
.role-info {
flex: 1;
padding: 5px 0px;
}
.role-oper {
padding: 5px 10px 5px 0;
width: 30%;
text-align: right;
color: #7a7d88;
}
.share-pic {
height: 60px;
}
.share-pic image {
height: 20px;
width: 20px;
margin-right: 5px;
}
.share-txt {
height: 25px;
line-height: 25px;
}
.role-item-name {
background: #e4f2fb;
padding: 5px 10px;
color: #969ba6;
}
.admin-count {
background: #e4f2fb;
padding: 10px 0px;
color: #969ba6;
text-align: center;
}
.icon-query {
position: relative;
left: 90%;
bottom: 40px;
font-size: 26px;
color: #aaa;
}

3、js文件

const app = getApp();
const http = require('../../../utils/http.js');
const api = require('../../../config.js');
const utils = require('../../../utils/util.js');
Page({
/**
* 页面的初始数据
*/
data: {
startX: 0, //开始坐标
startY: 0,
page: 1,
admin_list: [],
show_admin_list: [],
default_head_pic: '../../../image/default-head-pic.png',
keyword: '',
role_list: [],
},
touchE: function(e) {
// console.log(e);
var that = this
if (e.changedTouches.length == 1) {
//手指移动结束后触摸点位置的X坐标
var endX = e.changedTouches[0].clientX;
//触摸开始与结束,手指移动的距离
var disX = that.data.startX - endX;
var delBtnWidth = that.data.delBtnWidth;
//如果距离小于删除按钮的1/2,不显示删除按钮
var txtStyle = disX > delBtnWidth / 2 ? "left:-" + delBtnWidth + "rpx" : "left:0rpx";
//获取手指触摸的是哪一项
var index = e.currentTarget.dataset.index;
var list = that.data.show_admin_list;
list[index].txtStyle = txtStyle;
//更新列表的状态
that.setData({
show_admin_list: list
});
}
},
//手指触摸动作开始 记录起点X坐标
touchstart: function(e) {
//开始触摸时 重置所有删除
this.data.show_admin_list.forEach(function(v, i) {
if (v.isTouchMove) //只操作为true的
v.isTouchMove = false;
})
this.setData({
startX: e.changedTouches[0].clientX,
startY: e.changedTouches[0].clientY,
show_admin_list: this.data.show_admin_list
})
},
//滑动事件处理
touchmove: function(e) {
var that = this,
index = e.currentTarget.dataset.index, //当前索引
startX = that.data.startX, //开始X坐标
startY = that.data.startY, //开始Y坐标
touchMoveX = e.changedTouches[0].clientX, //滑动变化坐标
touchMoveY = e.changedTouches[0].clientY, //滑动变化坐标
//获取滑动角度
angle = that.angle({
X: startX,
Y: startY
}, {
X: touchMoveX,
Y: touchMoveY
});
that.data.show_admin_list.forEach(function(v, i) {
v.isTouchMove = false
//滑动超过30度角 return
if (Math.abs(angle) > 30) return;
if (i == index) {
if (touchMoveX > startX) //右滑
v.isTouchMove = false
else //左滑
v.isTouchMove = true
}
})
//更新数据
that.setData({
show_admin_list: that.data.show_admin_list
})
},
/**
* 计算滑动角度
* @param {Object} start 起点坐标
* @param {Object} end 终点坐标
*/
angle: function(start, end) {
var _X = end.X - start.X,
_Y = end.Y - start.Y
//返回角度 /Math.atan()返回数字的反正切值
return 360 * Math.atan(_Y / _X) / (2 * Math.PI);
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
this.getRoleList();
},
/**
* 获取角色列表
*/
getRoleList: function() {
let _this = this;
let postData = {
'shopid': app.globalData.shopid,
};
_this.setData({
role_list: []
});
wx.showLoading({
title: '角色列表获取中...',
mask: true
})
http.httpGet(api.GetRoleList, postData, (res) => {
console.log(res);
wx.hideLoading();
_this.getAdminList();
if (!res) {
return;
}
if (res.success) {
let _result = res.result;
if (_result.success) {
this.setData({
role_list: _result.data
});
} else {
utils.showToastMessage(_result);
}
} else {
utils.showToastMessage(res);
}
});
},
toAddAdmin: function(e) {
wx.redirectTo({
url: '../../../pages/Admin/AddAdmin/AddAdmin',
})
},
saveKeyword: function(e) {
this.setData({
keyword: e.detail.value
});
},
bindAdmin: function(e) {
console.log(e);
wx.navigateTo({
url: '../../../pages/Admin/AdminQrcode/AdminQrcode?admin_no=' + e.currentTarget.dataset.adminNo + '
&admin_pwd=' + e.currentTarget.dataset.adminPwd,
})
},
queryAdminList: function() {
var adminList = this.data.admin_list;
let keyword = this.data.keyword.replace(/ /g, '');
if (keyword) {
var showAdminList = [];
for (let i = 0; i
< adminList.length; i++) {
if (adminList[i].clerk_no.indexOf(keyword)
> -1 || adminList[i].clerk_name.indexOf(keyword) > -1) {
showAdminList.push(adminList[i]);
}
}
for (let i = 0; i
< showAdminList.length; i++) {
showAdminList[i].id
= i;
}
this.setData({
show_admin_list: showAdminList
});
} else {
for (let i
= 0; i adminList[i].id = i;
}
this.setData({
show_admin_list: adminList
});
}
},
toAdminInfo: function(e) {
console.log(e);
wx.removeStorageSync('edit-admin-info');
let adminNo
= e.currentTarget.dataset.adminNo;
if (adminNo) {
for (let i
= 0; i if (this.data.admin_list[i].clerk_no == adminNo) {
wx.setStorageSync('edit-admin-info', this.data.admin_list[i])
wx.navigateTo({
url: '../../../pages/Admin/AdminInfo/AdminInfo?admin_no
=' + adminNo,
})
}
}
} else {
wx.showToast({
title: '账号编号为空',
icon: 'none '
})
}
},
getAdminList: function() {
let _this
= this;
let postData = {
'openid': app.globalData.openid,
'shopid': app.globalData.shopid,
};
wx.showLoading({
title: '账号获取中...',
mask: true
})
_this.setData({
admin_list: [],
show_admin_list: []
});
http.httpPost(api.GetAdminList, postData, (res)
=> {
console.log(res);
wx.hideLoading();
if (!res) {
return;
}
if (res.success) {
let _result = res.result;
if (_result.success) {
let _branchList = [];
_result.data.forEach(e => {
if (!(e.openid && e.openid == app.globalData.openid)) {
_branchList.push(e);
}
});
for (let i = 0; i
< _branchList.length; i++) {
_branchList[i].id
= i;
}
_this.setData({
admin_list: _branchList,
show_admin_list: _branchList
});
} else {
utils.showToastMessage(_result);
}
} else {
utils.showToastMessage(res);
}
});
},
operAdmin: function(e) {
let _this
= this;
console.log(e);
let operType
= e.currentTarget.dataset.operType;
let adminNo = e.currentTarget.dataset.adminNo;
let openid = e.currentTarget.dataset.openid;
if (operType == "unbind" && !openid) {
wx.showToast({
title: '该账号未绑定,操作无效',
icon: 'none'
})
return;
}
if (openid
== app.globalData.openid) {
wx.showToast({
title: '不能操作自己绑定的账号',
icon: 'none'
})
return;
}
wx.showModal({
title: '提示',
content: '确定对该账户进行' + (operType
== "delete" ? "删除" : "解绑") + "操作吗?",
confirmText: (operType
== "delete" ? "删除" : "解绑"),
confirmColor: (operType
== "delete" ? "red" : "orange"),
success: res
=> {
_this.toOperAdmin(operType, adminNo);
}
})
},
toOperAdmin: function(oper_type, admin_no) {
let _this = this;
let postData = {
'shopid': app.globalData.shopid,
'openid': app.globalData.openid,
'oper_type': oper_type,
'admin_no': admin_no
};
_this.setData({
role_list: []
});
wx.showLoading({
title: oper_type == "delete" ? '删除中...' : '解绑中...',
mask: true
})
http.httpPost(api.OperAdmin, postData, (res) => {
console.log(res);
wx.hideLoading();
if (!res) {
return;
}
if (res.success) {
_this.onLoad();
let _result = res.result;
if (_result.success) {
wx.showToast({
title: oper_type == "delete" ? '删除成功' : '解绑成功',
})
} else {
utils.showToastMessage(_result);
}
} else {
utils.showToastMessage(res);
}
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function() {
let editOper = wx.getStorageSync('edit-admin-info');
let editOper2 = wx.getStorageSync('edit-admin-info-2');
if (editOper || editOper2) {
this.getAdminList();
wx.removeStorageSync('edit-admin-info');
wx.removeStorageSync('edit-admin-info-2')
}
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function() {
}
})

4、效果图

 



推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Excel数据处理中的七个查询匹配函数详解
    本文介绍了Excel数据处理中的七个查询匹配函数,以vlookup函数为例进行了详细讲解。通过示例和语法解释,说明了vlookup函数的用法和参数的含义,帮助读者更好地理解和运用查询匹配函数进行数据处理。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
Gbom2402851125
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有