vue封装一个左滑删除的组件

 

 messageList.vue:

<template>
<div class="message_list_box">
    <ul :class="className" >
        <li class="message_list_item" v-for="(item,key) in list" data-type="0" :key="key">
            <div class="message_wrap" @touchstart.capture="touchStart" @touchend.capture="touchEnd" @click="skip(item)">
                <div class="title">{{item.title}}</div>
                <div class="message_Box">
                    <div class="message_text">{{item.messageText}}</div>
                    <div class="message_img" v-show="item.messageImg">
                        <img :src="item.messageImg" alt="">
                    </div>
                </div>
            </div>
            <div class="delete" @click="deleteItem(item)" :data-index="key">删除</div>
        </li>
    </ul>
</div>       
</template>

<script>
export default {
    props:{
        className:{//自定义类
            type:String,
            default:''
        },
        list:{//消息列表
            type:Array,
            required:true
        }
    },
    data(){
        return{
            startX: 0,
            endX: 0
        }
    },
    methods:{
        // 滑动开始
        touchStart (e) {
            // 记录初始位置
            this.startX = e.touches[0].clientX
        },
        // 滑动结束
        touchEnd (e) {
            // 当前滑动的父级元素
            let parentElement = e.currentTarget.parentElement
            // 记录结束位置
            this.endX = e.changedTouches[0].clientX
            // 左滑
            if (parentElement.dataset.type == 0 && this.startX - this.endX > 30) {
                this.restSlide()
                parentElement.dataset.type = 1
            }
            // 右滑
            if (parentElement.dataset.type == 1 && this.startX - this.endX < -30) {
                this.restSlide()
                parentElement.dataset.type = 0
            }
            this.startX = 0
            this.endX = 0
        },
        // 复位滑动状态
        restSlide () {
            let listItems = document.querySelectorAll('.message_list_item')
            // 复位
            for (let i = 0; i < listItems.length; i++) {
                listItems[i].dataset.type = 0
            }
        },
        skip(item){//跳转
            this.$emit("jump",item);
        },
        deleteItem(item){//删除
            this.$emit("delete",item);
        }
    }
}
</script>

<style lang="scss" scoped>
.message_list_box{
    overflow: hidden;
}
.message_list_item{
    position:relative;
    border:1px solid $mainColor;
    border-bottom: 0;
    height:1.6rem;
    -webkit-transition: all 0.2s;
    transition: all 0.2s;
}
.message_list_item:last-child{
    border-bottom:1px solid $mainColor;
}
.message_list_item[data-type="0"]{
    transform: translate3d(0,0,0);
}
.message_list_item[data-type="1"]{
    transform: translate3d(-2rem,0,0);
}
.message_wrap{
    display: flex;
    flex-direction: column;
    padding:4px;
    position: absolute;
    top:0;
    left:0;
    right:0;
    bottom:0;
    box-sizing: border-box;
    .title{
        flex-shrink: 0;
        height:.4rem;
        overflow: hidden; 
        text-overflow:ellipsis; 
        white-space: nowrap;
        font-weight:bold;
        font-size:.3rem;
    }
    .message_Box{
        flex-shrink: 0;
        display: flex;
        flex:1;
        flex-direction: row;
        align-items: center;
        .message_text{
            flex:1;
            color:#c2c7cc;
            display: -webkit-box;
            overflow: hidden;
            white-space: normal;
            text-overflow: ellipsis;
            word-wrap: break-word;
            -webkit-line-clamp: 3;
            -webkit-box-orient: vertical;
        }
        .message_img{
            width:1rem;
            height:.8rem;
            margin:6px;
            img{
                width:100%;
                height:100%;
            }
        }
    }
}
.delete{
    width:2rem;
    height: 1.6rem;
    background: #ff4949;
    font-size: 17px;
    color: #fff;
    text-align: center;
    line-height: 1.6rem;
    position: absolute;
    top:0;
    right: -2.1rem;
}
</style>

使用:

<template>
    <div class="kuaixun">
        <div class="message_list_item">
            <messageList :list="messageList" @jump="jumpPaper" @delete="deleteThis"/>
        </div> 
    </div>
</template>

<script>
import messageList from "@/components/messageList";

export default {
    components:{messageList},
    data(){
        return{
            messageList:[
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:"http://kexiepingtaieposter.hoohui.cn//registFile/f827b3bf-e620-4754-a821-60d64ec5671b/Z0006_2020051610124.jpeg"},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:"http://kexiepingtaieposter.hoohui.cn//registFile/f827b3bf-e620-4754-a821-60d64ec5671b/Z0006_2020051610124.jpeg"},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:""},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:"http://kexiepingtaieposter.hoohui.cn//registFile/f827b3bf-e620-4754-a821-60d64ec5671b/Z0006_2020051610124.jpeg"},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:"http://kexiepingtaieposter.hoohui.cn//registFile/f827b3bf-e620-4754-a821-60d64ec5671b/Z0006_2020051610124.jpeg"},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:""},
                {title:"广西扩大村医养老生活补助范围",messageText:"近日,广西壮族自治区卫生健康委、财政厅、人力资源和社会保障厅印发《关于妥善解决乡村医生养老生活补助的补充通知》,调整乡村医生养老生活补助范围,加大补贴力度,给予乡村医生更多政策支持。",messageImg:"http://kexiepingtaieposter.hoohui.cn//registFile/f827b3bf-e620-4754-a821-60d64ec5671b/Z0006_2020051610124.jpeg"},
            ]
        }
    },
    methods: {
        jumpPaper(data){
            console.log(data);
        },
        deleteThis(data){
            console.log(data);
        }
    },
}
</script>

<style lang="scss" scoped>
.kuaixun{
    height:100vh;
    box-sizing: border-box;
    overflow-y: auto;
    padding:10px 10px 60px;
    // .message_list_item{
    //     border:1px solid $mainColor;
    //     border-bottom: 0;
    // }
    // .message_list_item:last-child{
    //     border-bottom:1px solid $mainColor;
    // }
}
</style>

 

 

 

 

posted @ 2020-05-16 21:59  古墩古墩  Views(805)  Comments(0Edit  收藏  举报