• vue实现左侧滑动删除


    不是很完美,无法做到第一个左滑其他的隐藏删除;

    代码来源于 https://segmentfault.com/a/1190000011062124 自己做了写改动,添加父组件点击触发子组件

    引入组件

    <template>
       <div class="delete">
           <div class="slider">
              <div class="content" 
               @touchstart='touchStart'
               @touchmove='touchMove'
               @touchend='touchEnd'
               :style="deleteSlider"
              >
            <!-- 插槽中放具体项目中需要内容     -->  
              <slot></slot>
              </div>
              <div class="remove active" ref='remove' @click="handleClick">
                删除
              </div>
          </div>
        
       </div>
    </template>
    <script type="text/ecmascript-6">
     export default {
       props:{
         propE: {
          type: Object,
          default: function () {
          }
        }
       },
       data() {
       return {
            startX:0,  //触摸位置
            endX:0,   //结束位置
            moveX: 0,  //滑动时的位置
            disX: 0,  //移动距离
            deleteSlider: '',//滑动时的效果,使用v-bind:style="deleteSlider"
          }
       },
     
       methods:{
         handleClick (v) {
             this.$emit('msg-from-child', this.val)
             this.deleteSlider = "transform:translateX(0px)";
         },
         touchStart(ev){
            console.log(ev)
            ev= ev || event
         //tounches类数组,等于1时表示此时有只有一只手指在触摸屏幕
          if(ev.touches.length == 1){
              // 记录开始位置
              this.startX = ev.touches[0].clientX;
            }
          },
         touchMove(ev){
            ev = ev || event;
              //获取删除按钮的宽度,此宽度为滑块左滑的最大距离
            let wd=this.$refs.remove.offsetWidth;
              if(ev.touches.length == 1) {
                // 滑动时距离浏览器左侧实时距离
                this.moveX = ev.touches[0].clientX
            
                //起始位置减去 实时的滑动的距离,得到手指实时偏移距离
                this.disX = this.startX - this.moveX;
                // 如果是向右滑动或者不滑动,不改变滑块的位置
                if(this.disX < 0 || this.disX == 0) {
                  this.deleteSlider = "transform:translateX(0px)";
                // 大于0,表示左滑了,此时滑块开始滑动 
                }else if (this.disX > 0) {
                   //具体滑动距离我取的是 手指偏移距离*5。
                  this.deleteSlider = "transform:translateX(-" + this.disX*5 + "px)";
                  
                  // 最大也只能等于删除按钮宽度 
                  if (this.disX*5 >=wd) {
                    this.deleteSlider = "transform:translateX(-" +wd+ "px)";
                   
                  }
                }
              }
           },
         touchEnd(ev){
           ev = ev || event;
           console.log(ev)
           let wd=this.$refs.remove.offsetWidth;
           if (ev.changedTouches.length == 1) {
              let endX = ev.changedTouches[0].clientX;
               
                this.disX = this.startX - endX;
                //如果距离小于删除按钮一半,强行回到起点
                
                if ((this.disX*5) < (wd/2)) {
                 
                  this.deleteSlider = "transform:translateX(0px)";
                }else{
                  //大于一半 滑动到最大值
                   this.deleteSlider = "transform:translateX(-"+wd+ "px)";
                }
              }
            }   
       }
       }
    </script>
    <style scoped lang="less" scoped>
      .slider{
         100%;
        height:100px;
        position: relative;
         user-select: none;
        .content{
          position: absolute;
          left: 0;
          right: 0;
          top: 0;
          bottom: 0;
          background:green;
          z-index: 100;
          //  设置过渡动画
          transition: 0.3s;
           
        }
        .remove{
          position: absolute;
          100px;
          height:100px;
          background:red;
          right: 0;
          top: 0;
          color:#fff;
          text-align: center;
          font-size: 32px;
          line-height: 100px;
        }
      }
     
    </style>

    将组件引入页面

    <template>
      <div>
        <ul>
          <li v-for="item in data">
            <leftSlider @msg-from-child="getMsgFromChild(item)">
              <div>
                <p>哈哈这是一个标题:{{item.text}}-----{{item.id}}</p>
              </div>
            </leftSlider>
          </li>
        </ul>
      </div>
    </template>
    <script>
    import leftSlider from '../common/leftSlider.vue'
    export default{
      components:{
        leftSlider
      },
      data (){
        return {
          data:[{
            text:'苹果',
            id:1
          },{
            text:'香蕉',
            id:2
          },{
            text:'橘子',
            id:3
          },{
            text:'菠萝',
            id:4
          },{
            text:'哈密瓜',
            id:5
          }]
        }
      },
      methods: {
        getMsgFromChild (v) {
          this.data.splice(v,1)
        }
      }
    }
    </script>
    <style>
      
    </style>
  • 相关阅读:
    LInux-crontab
    Linux权限-chmod1
    Tool_BurpSuite安装和简单使用
    python与redis交互(四)
    Flask_环境部署(十六)
    Nginx_配置文件nginx.conf配置详解
    Tool_linux环境安装python3和pip
    Nginx_全局命令设置
    Linux_无法解析域名
    VMware_克隆机器后主机Ping不同虚拟机,虚拟机能Ping通主机
  • 原文地址:https://www.cnblogs.com/qq364735538/p/7606702.html
Copyright © 2020-2023  润新知