vue移动端实现左滑编辑与删除的全过程

前言

根据项目需要使用 Vue-touch 实现了一个vue移动端的左滑编辑和删除功能,废话不多说,先看效果图,然后上代码吧!

方法如下:

第一步:安装   vue-touch

npm install vue-touch@next --save

第二步:main.js 中引入

import VueTouch from 'vue-touch';
Vue.use(VueTouch, {
  name: 'v-touch'
});

第三步:使用(用v-touch包住你要左滑删除的内容)

<div class="wrap">
      <v-touch
        style="margin-bottom:10px"
        v-on:panstart="onPanStart(key)"
        v-on:panmove="onPanMove"
        v-on:panend="onPanEnd"
        v-for="(item, key) in list"
        :key="key"
      >
  <!-- 下面div这一块是我页面需要左滑删除的项目内容,你可以替换成你自己的 -->
        <div class="item df_sb item-p" :style="activeId === key ? swipe : ''">
          <p class="left-img">
            <img :src="item.image_url" alt>
          </p>
          <p class="url" v-if="item.redirect_url != '' ">{{item.redirect_url}}</p>
          <p class="city nothave" v-else>无</p>
          <p class="city">{{item.city}}</p>
          <div class="edit-delete df_sad" :ref="'editBtn' + key">
            <div class="edit" @click="editFun('edit',item.id,item.image_url,item.redirect_url)">
              <img src="../../assets/images/adver/ic_xiugai.png" alt>
            </div>
            <p class="edit-line"></p>
            <div class="ad-delete" @click="deleteFun(key,item.id)">
              <img src="../../assets/images/adver/ic_shanchu.png" alt>
            </div>
          </div>
        </div>
      </v-touch>
    </div>

第四步:定义变量,以及方法,下面代码可直接拷贝,将不需要的删除换成自己的,需要的留着就行

<script>
import httpApi from "../../http/httpApi";
export default {
  name: "",
  data() {
    return {
      swipe: "", // 滑动的样式
      wd: 0, // 编辑和删除按钮的宽度之和
      swipeWd: 0, // 已经滑动的距离
      activeId: "", // 实际是上一次的活动id
    //以上四个变量必须保留,下面的三个可以删除
      page: 1,
      size: 10,
      list: []
    };
  },
  methods: {
//请求列表数据
    getList($state) {
      let params = new URLSearchParams();
      params.append("page", this.page);
      params.append("size", this.size);
      this.$post(httpApi.BANNERLIST, params)
        .then(res => {
          if (res.code == 10000) {
            if (res.data) {
              this.list = this.list.concat(res.data.list);
              this.page++;
              if (res.data.list.length === 10) {
                $state.loaded();
              } else {
                $state.complete();
              }
            } else {
              $state.complete();
            }
          } else {
            $state.complete();
          }
        })
        .catch(err => {
          console.log(err);
        });
    },
    // 编辑
    editFun(type, image_id, image, url) {
      this.$router.push({
        path: "/issueAdvertising",
      });
    },
    // 删除
    deleteFun(index, image_id) {
      this.activeId = ""; //将上一次的活动id制空
      let params = new URLSearchParams();
      params.append("agent_id", this.id);
      params.append("image_id", image_id);
      this.$post(httpApi.DELETEBANNER, params)
        .then(res => {
          if (res.code == 10000) {
// 虽然请求删除接口删除了列表其中的某一项内容,但是页面上还有
//因此需要在本地数组中也删除,这样才完美,下面这行代码比较重要,可以写在你删除接口成功后的地方
            this.list.splice(index, 1);
            this.modal.toastFun("删除成功");
          } else if (res.code == 20000) {
            this.modal.toastFun(res.message);
          }
        })
        .catch(err => {});
    },

// 以下三个方法全部拷贝,无需修改
//滑动位置
    onPanStart(id) {
      event.preventDefault();
      // 获取右侧按钮宽度
      let str = "editBtn" + id;
      this.wd = 1.2 * this.$refs[str][0].offsetWidth;
      // 初始化
      if (this.activeId != id) {
        this.swipe = "transform:translateX(0px)";
        this.swipeWd = 0;
      }
      this.activeId = id;
    },
//滑动位置
    onPanMove(event) {
      event.preventDefault();
      let deltaX = event.deltaX;
      // 组件向左移动直到最大距离
      if (deltaX < 0 && deltaX > -this.wd) {
        // 向左滑动
        this.swipe = "transform:translateX(" + deltaX + "px)";
        this.swipeWd = deltaX;
      }

      if (deltaX > 0 && deltaX <= this.wd && this.swipeWd < 0) {
        // 向右滑动
        let wx = deltaX + this.swipeWd;
        this.swipe = "transform:translateX(" + wx + "px)";
      }
    },
 // 结束位置
    onPanEnd(event) {
      event.preventDefault();
      // 判断向左移动的距离是否大于二分之一
      let deltaX = event.deltaX;
      if (deltaX < 0) {
        if (deltaX <= -this.wd / 2) {
          // 向左滑动超过二分之一
          this.swipe = "transform:translateX(" + -this.wd + "px)";
          this.swipeWd = -this.wd;
        } else {
          this.swipe = "transform:translateX(0px)";
          this.swipeWd = 0;
        }
      } else {
        if (this.swipeWd < 0 && deltaX >= this.wd / 2) {
          // 向左滑动超过二分之一
          this.swipe = "transform:translateX(0px)";
          this.swipeWd = 0;
        } else {
          this.swipe = "transform:translateX(" + this.swipeWd + "px)";
        }
      }
    }
  },

};
</script>

style

我只贴出了上面代码的css样式,根据需求自行删减吧,有需要的留着,不需要的删除,需要改变的自行修改

.wrap {
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.item {
  padding-left: 40px;
  height: 120px;
  background: #ffffff;
  align-items: center;
  flex-direction: inherit;
  .left-img {
    width: 120px;
    height: 100px;
    overflow: hidden;
    img {
      min-width: 120px;
      height: 100px;
    }
  }
}
.url {
  width: 400px;
  padding: 10px 30px 0;
  box-sizing: border-box;
  word-wrap: break-word;
  text-align: center;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.city {
  text-align: center;
  min-width: 100px;
}
.item-p {
  color: #333333;
  font-size: 22px;
}
.nothave {
  color: #999999;
}
.hint {
  height: 40px;
  align-items: center;
  margin-bottom: 30px;
}
.line {
  width: 250px;
  height: 1px;
  background: #999999;
  opacity: 0.5;
}
.item {
  width: 120%; // 超过100%
  transition: 0.1s ease 0s; // 过渡效果
}
.edit-line {
  width: 2px;
  height: 80px;
  background: rgba(255, 255, 255, 1);
}
.edit-delete {
  width: 160px;
  height: 100%;
  background: rgba(255, 126, 34, 1);
  opacity: 0.8;
  align-items: center;
}
.edit,
.ad-delete {
  img {
    width: 42px;
    height: 42px;
  }
}
.add-btn {
  width: 200px;
  height: 80px;
  background: rgba(255, 126, 34, 1);
  box-shadow: 0px 0px 5px 0px rgba(221, 221, 236, 1);
  border-radius: 40px;
  text-align: center;
  line-height: 80px;
  color: #ffffff;
  font-size: 30px;
  position: fixed;
  bottom: 8%;
  left: 50%;
  transform: translateX(-50%);
}

总结

有需要的拿走根据自己的需求稍做修改即可,写的很详细,到此这篇关于vue移动端实现左滑编辑与删除的全过程的文章就介绍到这了,更多相关vue左滑编辑与删除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Vue实现移动端左滑删除效果附源码

    左滑删除在移动端是很常见的一种操作,常见于删除购物车中的商品,删除收藏夹中文章等等场景.我们只需要手指按住要删除的对象,然后轻轻向左滑动,便会出现删除按钮,然后点击删除按钮即可删除对象. 点击下载源码 今天我给大家介绍的移动端左滑删除效果是基于Vue2实现的,结合以电商平台的删除购物车商品为例,来看实现步骤. 准备 安装vue项目过程已忽略,如果不懂vue的同学可以上官网看下:https://cn.vuejs.org/v2/guide/installation.html#NPM 我们使用安装一个

  • vue 左滑删除功能的示例代码

    最近有个需求是要添加一个左滑删除的功能.参考了一下别的老哥的代码,做了一点点改进.记录一下.以备不时之需,话不多说 ,上代码 <template> <div class="slider-item"> <div class="content" @touchstart='touchStart' @touchmove='touchMove' @touchend='touchEnd' :style="deleteSlider"

  • mpvue小程序仿qq左滑置顶删除组件

    背景: 前几天,公司的一个小程序项目开发的时候,遇到了一点点问题.设计师这狗币要让我在小程序上实现类似QQ左滑置顶删除的操作,心里mmp,我就是一个刚来公司三天的小小前端实习生而已,我想学习....当然刚刚来就被公司委以重任,也能看出本人技术过人,尤其是作为一个大二刚刚结束的学生来说.废话不多说,对于这个功能,第一反应就是百度,不百度不得了,一百度吓一跳.前辈们也来都做过."那我不是直接照搬就行,开心".开开心心的用mpvue上手之后,心里mmp,mpvue的坑这么多....还不如自己

  • Vue 使用 Mint UI 实现左滑删除效果CellSwipe

    Mint UI 是饿了么开源的,基于 Vue.js 的移动端组件库. 关于Mint UI,有文档不够准确详尽,组件略显粗糙,功能不够完善等问题:也有高度组件化,体积小等优点. 安装Mint UI: # Vue 1.x npm install mint-ui@1 -S # Vue 2.0 npm install mint-ui -S 引入组件: // 引入全部组件 import Mint from 'mint-ui'; import 'mint-ui/lib/style.css' Vue.use(

  • Vue 仿QQ左滑删除组件功能

    前几天在做Vue项目开发的时候,因为之前别人写的代码有点小 bug,有人反应 IOS 上面的滑动点击有点问题,于是让我来帮忙解决,我看了看以前的代码实现比较繁琐,冗余,索性就直接自己重新写了一套,供大家参考,如有更好的方式,欢迎及时交流~ 我们先看看效果图吧,毕竟无图无真相啊~ 效果图 实现思路 具体实现思路如下: 布局方面我采用的是 rem + flex 布局,具体如何结构和样式可以参考我的代码,值得注意的是后面的删除按钮是我通过定位放在了每一行的最后,超出隐藏了而已 左滑和右滑是通过 tou

  • 基于vue2实现左滑删除功能

    左滑删除,很多UI框架里有,比如Mint-UI, Muse-UI等,一开始我们就是用的这两个,但是我们需求是要:左滑的时候出现img然后来实现点击删除,如下: 因为用UI框架,还得改底层代码= =所以,我们小组就直接写了一个- -,心累--此组件多地方使用,所以建议还是放到common下.. <template> <div class="left-delete"> <div class="move" @touchstart="

  • Vue.js移动端左滑删除组件的实现代码

    左滑删除在移动端很常见.下面我们一起来封装一下这个简单的小组件.我们想要是: 当滑块没有超过删除按钮的一半时自动回到起点位置. 滑动距离超过一半滑动到最大值(删除按钮宽度) 尽量精简代码 效果如下: 在开始之前,我们先得将 [touchEventApi][1]弄清楚了.这个小组件中,用到了: 1.  TouchEvent.touches (表示一 个 TouchList 对象,包含了所有当前接触触摸平面的触点的Touch对象) 2.  TouchEvent.changedTouches (一个

  • vue项目实现左滑删除功能(完整代码)

    实现效果 代码如下 html <template> <div> <div class="biggestBox"> <ul> <!-- data-type=0 隐藏删除按钮 data-type=1 显示删除按钮 --> <li class="li_vessel" v-for="(item,index) in lists " data-type="0" :key=&

  • vue移动端实现左滑编辑与删除的全过程

    前言 根据项目需要使用 Vue-touch 实现了一个vue移动端的左滑编辑和删除功能,废话不多说,先看效果图,然后上代码吧! 方法如下: 第一步:安装   vue-touch npm install vue-touch@next --save 第二步:main.js 中引入 import VueTouch from 'vue-touch'; Vue.use(VueTouch, { name: 'v-touch' }); 第三步:使用(用v-touch包住你要左滑删除的内容) <div clas

  • 微信小程序实现左滑修改、删除功能

    本文实例为大家分享了微信小程序实现左滑修改.删除的具体代码,供大家参考,具体内容如下 wxml: <view class="offer-item" wx:for-items='{{offerList}}'> <!--这里绑定了刚才说的3个函数分别为 touchS,touchM touchE--> <!--这里注意这个 style="{{item.txtStyle}}" ,这是我们一会再js中 将要设置的样式 --> <vie

  • vue+element实现表格新增、编辑、删除功能

    几天前,需要做一个需求:新增一个xml文件时,添加数量不确定.属性相同的xml标签,想了想可以用表格做啊,属性相同,使用统一的表头,下面的属性值只是进行增删改不就行了,就类似于mysql给表里填数据一样. 可是目前似乎还没有表格的直接增删改一行的操作,那要怎么实现呢?于是,通过上网以及自己的思考,终于实现了,代码.思路以及效果图如下: 1 html部分: <el-button type="success" @click="addRow(tableData)"&

  • react 移动端实现列表左滑删除的示例代码

    最近做了一个类似系统操作的左滑删除的demo,用的taro框架,和大家分享一下~ 首先需要考虑的有以下几点: 1)布局: 2)判断是左滑还是右滑,左滑时出现删除,右滑时回归原位: 3)排他性,意思是某一个时间只能有一个项出现删除,当有另一个出现删除时,上一个自动回归原位. 我将列表项封装成一个组件,而整个列表是另一个组件. 接下来先说列表项这个组件,逐一解决以上这些问题: 1)布局 我采用的是列表项最外层套一个盒子,这个盒子宽度设置为100vw,并且overflow:hidden.而列表项要包括

  • 微信小程序实现列表项左滑删除效果

    本文实例为大家分享了微信小程序实现列表项左滑删除效果的具体代码,供大家参考,具体内容如下 效果 图片 WXML <view class="container"> <!-- 收货地址 --> <view class="address"> <view class="left"> <view class="icon"> <image src="../../i

  • Android仿QQ首页ListView左滑置顶、删除功能

    Android 仿QQ首页ListView左滑置顶.删除等实现源码,具体内容如下 效果图 实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.

  • Android仿微信实现左滑显示删除按钮功能

    在实际项目中删除列表中的某一项是非常常见的功能,传统的做法可以使用长按监听器等,而现在流行的做法是左滑弹出删除按钮,微信,QQ等都是这么做的,下面做一个示例,代码如下: 主页面MainActivity:代码比较简单常规 package com.home.testslideview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; im

  • 微信小程序列表中item左滑删除功能

    第一步:把想要的两种样式写出来 1.正常显示的样式 css: .box{ height: 100%; } .item{ position:relative; top: 0; width: 100%; height: 150rpx; border-bottom: #d9d9d9 solid 1rpx; padding: 0; } .item .content{ background-color: #ffffff; height: 100%; position: relative; left: 0;

随机推荐