基于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 相关文章推荐
jQuery实现统计复选框选中数量
Nov 24 Javascript
JS实现页面超时后自动跳转到登陆页面
Jan 19 Javascript
AngularJS语法详解
Jan 23 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
bootstrap css样式之表单
Jan 19 Javascript
浅谈vue路径优化之resolve
Oct 13 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
实现AJAX异步调用和局部刷新的基本步骤
Mar 17 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP自定义多进制的方法
2016/11/03 PHP
深入理解JavaScript中Ajax
2016/08/02 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
python插入排序算法实例分析
2015/07/03 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
Python 列表的清空方式
2020/01/13 Python
如何基于Python实现数字类型转换
2020/02/07 Python
Python分类测试代码实例汇总
2020/07/23 Python
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
星空联盟C# .net笔试题
2014/12/05 面试题
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
高一地理教学反思
2014/01/18 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
趣味运动会活动方案
2014/02/12 职场文书
地球一小时活动总结
2015/02/27 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS