vue滚动+滑动删除标记(移动端)仿qq/微信
安装组件
main.js引入
1.页面代码
<template>
<div class="share">
<headall :appMenuName="$t('pay_attention_to_people')" :iconRight="iconRight" :backUrl="backUrl" @backOperate="backOperate"></headall>
<scroll class="scroll" :data='listData' v-if='listData'>
<div class="in-ul">
<div class="item" v-for='(item,index) in listData' :key="index">
<v-touch v-on:swipeleft="swiperleft(index)" v-on:swiperight="swiperright(index)" class="wrapper">
<div class="itemSwipe" :class="{swipeleft:itemTitleLeft&&(nowControlIndex==index&&(nowControlIndex>-1)),swipeleftNo:!itemTitleLeft}">
<div class="content">
<span class="userNameAccount">{{ item.userName }}({{item.account}})</span>
<span class="deptName">{{ item.deptName||''}}</span>
</div>
<div class="btnL del" @click="delUser(item)">删除</div>
<div class="btnL markEle">标记</div>
<div class="btnL move">移动</div>
</div>
</v-touch>
</div>
</div>
</scroll>
<router-view @getRefresh="getRefresh"></router-view>
</div>
</template> <script>
import Vue from 'vue'
import headall from 'base/head/headAll'
import {
mixins
} from 'assets/js/mixins'
import scroll from 'base/scroll/scroll'
import i18n from 'assets/js/vi18n/i18n.js'
export default {
mixins: [mixins],
i18n,
data() {
return {
searchVal:'',
listData: [],
selectItemData: null,
nowControlIndex:-1,
itemTitleLeft:false,
backUrl:'/me/person',
iconRight:'icon-tianjia',
}
},
components: {
headall,
scroll,
},
methods: {
getRefresh(){
this.getSelectedUser();
},
backOperate(){
this.$router.push({
path: `/me/person/attention/add`
});
//清除滑动效果
this.itemTitleLeft = false;
this.nowControlIndex = -1;
},
swiperleft(index) {
//左滑
console.log('left');
this.nowControlIndex = index;
this.itemTitleLeft = true;
},
swiperright(index) {
//右滑
console.log('right');
this.itemTitleLeft = false;
this.nowControlIndex = -1;
},
getSelectedUser() {
/*获取邮件接收人以前的设置*/
let vm = this;
let getUserUrl = '/user/focusUsers';
this.ajaxSend(getUserUrl, {}).then(function (data) {
if (data.code === '00000000') {
vm.listData = data.payload.results.users;
}
});
},
delUser(item) {
/*列表中删除关注人*/
let vm = this;
let result = [];
let arr = vm.listData;
for (let i = 0; i < arr.length; i++) {
if (arr[i] != item) {
result.push(arr[i]);
}
}
vm.listData = result;
vm.saveSelectedUser();
//清除滑动效果
vm.itemTitleLeft = false;
vm.nowControlIndex = -1;
},
saveSelectedUser() {
//保存设置
let vm = this;
let arr = vm.listData;
let checkedId = [];
for (let i = 0; i < arr.length; i++) {
checkedId.push(arr[i].id);
}
let getUserUrl = '/user/saveFocusUser';
let params = {
focusUserIds: checkedId
};
this.ajaxSend(getUserUrl, params).then(function (data) {
if (data.code === '00000000') {
}
});
},
},
created() {
this.getSelectedUser();
},
}
</script> <style scoped lang="stylus">
@import '~assets/stylus/veriable.styl'
@import "~assets/stylus/mixin.styl"
.share{
position absolute
top 0
bottom 0
left 0
right 0
z-index 15
background #f3f3f3
.scroll{
position absolute
overflow hidden
width 100%
top 3.2rem
bottom 0
background #fff
.in-ul{
width 100%
.item{
width 146%
overflow hidden
.itemSwipe{
display flex
flex 1
font-size .875rem
height 3rem
line-height 3rem
background #fff
border-bottom 1px solid #dedfe0
div{
background #fff
}
.content{
width 100%
display flex
flex-direction column
margin .25rem .25rem .25rem .5rem
line-height 1.5rem
font-size $font-size12
.userNameAccount{
font-size $font-size13
}
.deptName{
font-size $font-size12
color #999
} }
.btnL{
padding 1rem 0;
line-height 1rem
width 15%
text-align center
color #fff
}
.del{
background #ff3b30
}
.markEle{
background #ff9c00
}
.move{
background #c7c7cc
}
}
.swipeleft{
transform:translateX(-31%);
-webkit-transform:translateX(-31%);
-webkit-transition:all 0.3s;transition:all 0.3s;
}
.swipeleftNo{
-webkit-transition:all 0.3s;transition:all 0.3s;
}
}
}
}
} </style>
组件headAll
<template>
<div class="header">
<span class="iconfont" :class="iconLeft" @click="back"></span>
<span class="name" slot="appMenuName">{{appMenuName}}</span>
<span class="iconfont" :class="iconRight" @click="search"></span>
</div>
</template>
<script>
export default {
props:{
appMenuName:{
type:String,
default:'',
},
backUrl:{
type:String,
default:'',
},
iconLeft:{
type:String,
default:'icon-fanhui1',
},
iconRight:{
type:String,
default:'icon-soushuo',
},
typeVal:{
type:Number,
default: 0,
},
},
methods: {
back(){
this.$router.push({
path: `${this.backUrl}`
});
},
search(){
this.$emit('backOperate',this.typeVal);
}
}
}
</script> <style scoped lang='stylus'>
@import '~assets/stylus/veriable.styl'
@import '~assets/stylus/mixin.styl'
.header{
headStyle()
justify-content space-between
.name{
font-size $font-size15
}
.iconfont{
padding 0.625rem
width 3rem
color #bfbfbf
font-size .875rem
font-weight normal
}
} </style>
组件scroll
<template>
<div ref="wrapper">
<slot></slot>
</div>
</template> <script>
import BScroll from 'better-scroll' export default {
props:{
/* probeType的作用。
1 滚动的时候会派发scroll事件,会截流,就是不会实时的派发。
2 滚动的时候会实时派发scroll事件,不会被截流。
3 在重击的情况下仍然能实时派发scroll的事件。
*/
probeType:{
type:Number,
default:3
},
click:{
// 占击滚动的列表是否派发click事件。
type:Boolean,
default:true
},
scrollX:{
// 是否派发横向滚动事件。
type:Boolean,
default:false
},
listenScroll:{
// 是否派发滚动事件。
type:Boolean,
default:true
},
data:{
type:Array,
default:null //这里null其实是表明这个是一个任意类型。
},
pullup:{
// 是否派发滚动到底部的事件,用于上拉加载
type:Boolean,
default:false
},
pulldown:{
// 是否派发顶部下拉的事件,用于下拉刷新。
type:Boolean,
default:false
},
beforeScroll:{
// 是否派发列表滚动开始时的事件。
type:Boolean,
default:false
},
refreshDelay:{
// 当数据更新后刷新scroll的延时。
type:Number,
default:20
},
scrollEndx:{
type:Boolean,
default:false
}
},
methods:{
_initScroll(){
if(!this.$refs.wrapper){
return
}
// 初始化better-scroll
this.scroll=new BScroll(this.$refs.wrapper,{
probeType:this.probeType,
click:this.click,
scrollX:this.scrollX
})
// 是否派发滚动事件。
if(this.listenScroll){
this.scroll.on('scroll',(pos)=>{
this.$emit('scroll',pos);
})
}
// 是否派发滚动到底部的事件,用于上拉加载。
if(this.pullup){
this.scroll.on('scrollEnd',()=>{
if(this.scroll.y<=(this.scroll.maxScrollY+50)){
this.$emit('scrollEnd');
}
})
} // 是否派发顶部下拉事件,用下下拉刷新。
if(this.pulldown){
this.scroll.on('touchend',(pos)=>{
if(pos.y>50){
this.$emit('pulldown')
}
})
} // 是否派发列表滚动开始的事件。
if(this.beforeScroll){
this.scroll.on('beforeScrollStart',()=>{
this.$emit('beforeScroll')
})
} // 新增一个事件的判断,滚动结束时也会触发事件scrollEnd
if(this.scrollEndx){
this.scroll.on('scrollEnd',(pos)=>{
this.$emit("scrollEnd",pos);
})
}
},
refresh(){
this.scroll && this.scroll.refresh();
},
scrollTo(){
this.scroll && this.scroll.scrollTo.apply(this.scroll,arguments);
},
scrollToElement(){
this.scroll && this.scroll.scrollToElement.apply(this.scroll,arguments);
}
},
watch:{
data(){
setTimeout(() => {
this.refresh();
}, this.refreshDelay);
}
},
mounted () {
// mouted全部挂载完成后,调用初始化BScroll;
setTimeout(() => {
this._initScroll();
}, 20);
}
}
</script> <style scoped lang="stylus" rel="stylesheet/stylus"> </style>
vue滚动+滑动删除标记(移动端)仿qq/微信的更多相关文章
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
- Android 仿QQ微信开场导航以及登陆界面
相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后进入应 用,这一效果适用于多种项目中,相信今后开发应用一定会用得 ...
- Android仿QQ微信开场导航以及登陆界面
相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后 进入应用,这一效果适用于多种项目中,相信今后开发应用一定会用得 ...
- JS 点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/ 相册模块,点击弹出图片,并左右滚动幻灯片
1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码
iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 iOS高仿微信完整项目源码 想要更简单的推送消息,看本文就对了 ScrollView嵌套ScrolloView解决方 ...
- 仿知乎安卓client滑动删除撤销ListView
标签(空格分隔): Android 新版的知乎安卓client有一个有趣的功能,就是在一个item里.向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了.放开手指就是删除.删除后还 ...
- 干货--手把手撸vue移动UI框架: 滑动删除
前言 前几天因为项目需要,用jquery写了一个swiperOut组件,然后我就随便把这个组件翻译成基于Vue的了,有兴趣的朋友可以看下.Github源码(不麻烦的话帮忙start,请各位大爷赏个星星 ...
- 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能
大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...
- [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子
转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...
随机推荐
- [hibernate]save()与persist()区别
Hibernate 之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯.另一方面,save()和 persist()方法还有一个区别:使用 save() ...
- 一百一十六:CMS系统之使用阿里大于sdk发送短信验证码
阿里大于短信平台:https://dysms.console.aliyun.com/dysms.htm#/overview 使用教程:https://blog.csdn.net/qq103189393 ...
- vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...
- DS18b20温度传感器基础使用
认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...
- Spring Boot默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
- 分类并查集[noi2001 食物链]
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=pxNJzxVPU 题目有三种动物,A吃B,B吃C,C吃A 即B是A的食物,A是B的天敌, ...
- mysql对字段的操作
增: alter table 表名 add 字段名+数据类型, add 字段名+数据类型; alter table 表名 add primary key 字段: "添加主键" 删: ...
- 【VS开发】CTabView多页卡界面
转载地址:http://blog.csdn.net/akof1314/article/details/5618454 目录(?)[-] Public Methods Protected Methods ...
- A Mixed Flash Translation Layer Structure for SLC-MLC Combined Flash Memory System
http://blog.sina.com.cn/s/blog_502c8cc40100pztk.html 摘要 1.In this paper, we propose the SLC-MLC mixe ...
- Linux下将用户添加到sudoers中
Linux默认是没有将用户添加到sudoers列表中的,需要root手动将账户添加到sudoers列表中,才能让普通账户执行sudo命令. root 账户键入visudo即可进入sudo配置,这个命令 ...
