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的.左滑删除 ...
随机推荐
- NoSQL的种类
https://www.zhihu.com/question/30219620
- RabbitMQ学习之:(二)介绍 (转贴+我的评论)
转自:http://lostechies.com/derekgreer/2012/03/05/rabbitmq-for-windows-introduction/ RabbitMQ for Windo ...
- 运行python程序不显示cmd方法
运行python程序不显示cmd方法 Pythonw xxx.py 将*.py改成*.pyw,然后执行*.pyw Python.exe和pythonw.exe不同: 执行时没有控制台窗口 所有向原有的 ...
- 2018.05.17 nace关于采购订单的配置笔记
由于公司的打印都是使用nast作为记录表,在给日企中国客户做扩展时单独配置了一下nace的设置 ZM01作为采购订单批量打印的输出类型,ZM02作为采购订单创建变更时输出的pdf打印输出类型 1.TC ...
- goroutine 调度算法
自从开始使用 Go 语言,到现在也有一年多了,虽不算精通,但也算小有理解.在这里简单记录一下我的心得(其实是学习别人的心得) goroutine,Go 语言中 cpu 运行的最小单元,与 lua 携程 ...
- springcloud随便写点
eureka 注册注册 ribbon 负载均衡 feign 声名式client hystrix 断路器 zuul 网关,智能路由,过滤 config 集群配置 bus 分布式的节点用轻量的消息 ...
- C# 加解密工具类
using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Clov ...
- 前端学习之JavaScript(1)
目录 一. JavaScript简介 二. 第一个JavaScript代码 三. 基本数据类型 四. 运算符 五. 数据类型转换 六. 流程控制 七. 常用内置对象 八. 函数 一. JavaScri ...
- springboot-RequestMappingHandlerMapping
作用:查看应用请求对应的ur和方法l情况 实例: RequestMappingHandlerMapping mapping =applicationContext.getBean("requ ...
- C++学习笔记-继承中的构造与析构
C++存在构造函数与析构函数,继承中也存在构造和析构函数.继承中的构造和析构函数与普通的构造析构有细微差别. 赋值兼容性原则 #include "iostream" using n ...
