基于vue2实现左滑删除功能


Posted in Javascript onNovember 28, 2017

左滑删除,很多UI框架里有,比如Mint-UI, Muse-UI等,一开始我们就是用的这两个,但是我们需求是要:左滑的时候出现img然后来实现点击删除,如下:

基于vue2实现左滑删除功能

因为用UI框架,还得改底层代码= =所以,我们小组就直接写了一个- -,心累……此组件多地方使用,所以建议还是放到common下。。

<template>
  <div class="left-delete">
    <div class="move"
       @touchstart="_touchStart"
       @touchmove="_touchMove"
       @touchend="_touchEnd"
       :style="txtStyle">
      <slot></slot>
    </div>
    <div class="deleteIcon" :style="zIndex" @click.prevent="deleteItem(index)"></div>
  </div>
</template>

<script>
  export default {
    props: {
      index: Number
    },
    data() {
      return {
        startX: 0,    //触摸位置
         moveX: 0,    //滑动时的位置
         disX: 0,    //移动距离
         txtStyle: '',
        delWidth: 200,
        top: '',
        zIndex: 'z-index:-1',
      }
    },
    methods: {
      _touchStart: function(ev) {
        ev = ev || event;
        if(ev.touches.length == 1){
          // 手指按下的时候记录按下的位置
          this.startX = ev.touches[0].clientX;
          console.log(this.startX)
        }
      },
      _touchMove: function(ev) {
        ev = ev || event;
        if(ev.touches.length == 1) {
          // 滑动过程中的实时位置
          this.moveX = ev.touches[0].clientX
          // 滑动过程中实时计算滑动距离
          this.disX = this.startX - this.moveX;
          // console.log('disX==>',this.disX)
          // 如果是向右滑动或者只是点击,不改变滑动位置
          if(this.disX < 0 || this.disX == 0) {
            // console.log('没有移动');
            this.txtStyle = "transform:translateX(0rem)";
          }else if (this.disX > 0) {
如果是向左滑动,则实时给这个根元素一个向左的偏移-left,当偏移量到达固定值delWidth时,固定元素的偏移量为 delWidth
            this.txtStyle = "transform:translateX(-" + this.disX/100 + "rem)";
            if (this.disX >= this.delWidth/100) {
              this.txtStyle = "transform:translateX(-" + this.delWidth/100 + "rem)";
              this.zIndex = "z-index:" + 10 + "rem";
            }
          }
        }
      },
      _touchEnd: function(ev) {
        if (event.changedTouches.length == 1) {
          this.startX = 0;
          this.zIndex = "z-index:" + -1 + "rem";
          console.log(event.changedTouches[0].clientX)
          // 手指移动结束后的水平位置
          let endX = event.changedTouches[0].clientX;
          // 触摸开始与结束,手指移动的距离
          this.disX = this.startX - endX;
          //如果距离小于删除按钮的1/2,不显示删除按钮
        }
      },
      deleteItem: function(index) {
        this.$emit('deleteItem', index);
      }
    }
  }
</script>

<style>
  .left-delete{
    width:100%;
    height:100%;
    position:relative;
    z-index:2;
  }
  .move{
    position: relative;
  }
  .deleteIcon{
    width: 2rem;
    height:100%;
    position: absolute;
    right:0;
    top:0;
    background:url(./../../assets/main/4.png) no-repeat;
    background-size: contain;
  }
</style>

然后哪个页面需要,哪个页面引入就好。比如myCollect页面需要,那么如下:

<template>
  <section class="myCollect">
 <section>
      <div v-for="(item,index) in collectionList">
        <left-slider :index="index" @deleteItem="deleteItem">
          <Financial :item="item" :index="index"></Financial>
        </left-slider>
      </div>
    </section>
  </section>
</template>
<script>
  import api from './../../fetch/api';
  import { mapGetters } from 'vuex';

  import Financial from './../common/financial.vue';
  import LeftSlider from './../common/leftSlider.vue';

  export default {
    name: 'MyCollect',
    props: {
      item: Object,
      index: Number
    },
    components: {
      Financial,
      LeftSlider
    },
    data() {
      return {

      }
    },
    created() {
      this.getCollectionList();
    },
    methods: {

    },
    computed: {
        ...mapGetters([
          'getContextPathSrc',
          'sessionId',
          'token'
        ]),
  },
  methods: {
    // 删除
    deleteItem: function(index) {
      api.commonApi('后台接口,请求数据')//此处api是封装的axios,详情看文章:vue2+vuex+axios即可
          .then(res => {
        console.debug("REQ_ADD_STORE.res.data.result -> " + res.data.result);
      this.collectionList.splice(index, 1);
    });
    }
  },
  mounted() {

  }
  }
</script>

然后就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript的9个陷阱及评点分析
May 16 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
Jun 04 Javascript
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
Jan 16 Javascript
js操作iframe父子窗体示例
May 22 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
Jun 06 Javascript
详解vue的diff算法原理
May 20 Javascript
Angularjs实现多图片上传预览功能
Jul 18 Javascript
用vscode开发vue应用的方法步骤
May 06 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
js实现验证码干扰(静态)
Feb 22 Javascript
JavaScript生成简单等差数列
Nov 28 #Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 #Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 #Javascript
浅谈vue中慎用style的scoped属性
Nov 28 #Javascript
元素全屏的设置与监听实例
Nov 28 #Javascript
vue2实现数据请求显示loading图
Nov 28 #Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 #Javascript
You might like
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
python集合类型用法分析
2015/04/08 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
python多进程并行代码实例
2019/09/30 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
《陈涉世家》教学反思
2014/04/12 职场文书
2014年女职工工作总结
2014/11/27 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL