Home  >  Article  >  Web Front-end  >  How to implement left slide to delete function in vue2

How to implement left slide to delete function in vue2

亚连
亚连Original
2018-06-23 17:47:131916browse

This article mainly introduces the left-swipe deletion function based on vue2 in detail, which has certain reference value. Interested friends can refer to

Left-swipe deletion, which is included in many UI frameworks. , such as Mint-UI, Muse-UI, etc. We used these two from the beginning, but our requirement is: when the img appears when swiping left, click to delete, as follows:

Because the UI framework is used, the underlying code has to be changed = =So, our team directly wrote a - -, which was very tiring... This component is used in many places, so it is recommended to put it under common. .

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

<script>
  export default {
    props: {
      index: Number
    },
    data() {
      return {
        startX: 0,    //触摸位置
         moveX: 0,    //滑动时的位置
         disX: 0,    //移动距离
         txtStyle: &#39;&#39;,
        delWidth: 200,
        top: &#39;&#39;,
        zIndex: &#39;z-index:-1&#39;,
      }
    },
    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(&#39;disX==>&#39;,this.disX)
          // 如果是向右滑动或者只是点击,不改变滑动位置
          if(this.disX < 0 || this.disX == 0) {
            // console.log(&#39;没有移动&#39;);
            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(&#39;deleteItem&#39;, 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>

Then whichever page needs it, whichever page needs it, just import it. For example, if the myCollect page requires it, then it is as follows:

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

  import Financial from &#39;./../common/financial.vue&#39;;
  import LeftSlider from &#39;./../common/leftSlider.vue&#39;;

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

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

    },
    computed: {
        ...mapGetters([
          &#39;getContextPathSrc&#39;,
          &#39;sessionId&#39;,
          &#39;token&#39;
        ]),
  },
  methods: {
    // 删除
    deleteItem: function(index) {
      api.commonApi(&#39;后台接口,请求数据&#39;)//此处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>

Then it is completed.

The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.

Related articles:

Complex operations about MVC in AngularJS

How to use CommonsChunkPlugin to extract public modules

How to implement Toast using ReactNative

Angular CLI installation tutorial

The above is the detailed content of How to implement left slide to delete function in vue2. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn