基于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学习笔记(三) String 字符串类型介绍
Jun 19 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
angular实现form验证实例代码
Jan 17 Javascript
JS中promise化微信小程序api
Apr 12 Javascript
echarts整合多个类似option的方法实例
Jul 10 Javascript
jquery使用FormData实现异步上传文件
Oct 25 jQuery
socket在egg中的使用实例代码详解
May 30 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
vue实现简单跑马灯效果
May 25 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 Javascript
基于vue实现微博三方登录流程解析
Nov 04 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 过滤危险html代码
2009/06/29 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
php二维数组转成字符串示例
2014/02/17 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
PHP之header函数详解
2021/03/02 PHP
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python中的闭包实例详解
2014/08/29 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
Pytorch 使用 nii数据做输入数据的操作
2020/05/26 Python
python中字典增加和删除使用方法
2020/09/30 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
安全教育实施方案
2014/03/02 职场文书
学生会部长竞聘书
2014/03/31 职场文书
家长寄语大全
2014/04/02 职场文书
捐款倡议书
2014/04/14 职场文书
鲁迅故里导游词
2015/02/05 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
把77A收信机改造成收音机
2022/04/05 无线电