Skip to content

SwipeAction 滑动单元格组件

滑动单元格组件,用于左滑或右滑唤出操作菜单的场景,常用于删除、收藏等操作。

📌平台差异说明

APP(vue)H5微信小程序支付宝小程序

⚠️注意事项

注意事项

  • 组件支持左滑和右滑两种方向,通过 leftright 插槽分别定义左右两侧的操作按钮
  • options 属性用于配置右侧按钮,只有在没有使用 left 插槽时才生效
  • modelValue 用于控制滑动状态,值为 leftrightclose
  • beforeClose 钩子函数会在关闭滑动按钮前触发,可用于确认操作
  • 多个滑动单元格同时使用时,滑动一个会自动关闭其他已打开的单元格
  • 点击已打开的滑动单元格内容区域会自动关闭

🏯基本使用示例

基础用法

html
<template>
    <hy-swipe-action borderBottom>
        <view class="cell">
            <view class="cell-title">我是标题</view>
            <view class="cell-value">我是内容</view>
        </view>
    </hy-swipe-action>
</template>

<style lang="scss" scoped>
    .cell {
        padding: 20rpx;
        display: flex;
        justify-content: space-between;
        align-items: center;

        &-title {
            font-size: 28rpx;
            color: #333;
        }

        &-value {
            font-size: 24rpx;
            color: #999;
        }
    }
</style>

右侧操作按钮(默认)

html
<template>
    <hy-swipe-action borderBottom :options="options">
        <view class="cell">
            <view class="cell-title">滑动删除</view>
            <view class="cell-value">向左滑动显示操作按钮</view>
        </view>
    </hy-swipe-action>
</template>

<script setup lang="ts">
    import { ref } from 'vue';

    const options = [
        {
            text: '收藏',
            style: {
                backgroundColor: '#3c9cff',
            },
        },
        {
            text: '删除',
            style: {
                backgroundColor: '#f56c6c',
            },
        },
    ];
</script>

左侧操作按钮

html
<template>
    <hy-swipe-action borderBottom>
        <view class="cell">
            <view class="cell-title">向右滑动</view>
            <view class="cell-value">显示左侧操作按钮</view>
        </view>
        <template #left>
            <view class="action">
                <view class="action-btn" style="background-color: #3c9cff">标记</view>
                <view class="action-btn" style="background-color: #f56c6c">删除</view>
            </view>
        </template>
    </hy-swipe-action>
</template>

<style lang="scss" scoped>
    .action {
        display: flex;
        height: 100%;

        &-btn {
            padding: 0 30rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            color: #fff;
            font-size: 28rpx;
        }
    }
</style>

双侧操作按钮

html
<template>
    <hy-swipe-action borderBottom>
        <view class="cell">
            <view class="cell-title">双向滑动</view>
            <view class="cell-value">左右滑动均可显示操作按钮</view>
        </view>
        <template #left>
            <view class="action">
                <view class="action-btn" style="background-color: #3c9cff">收藏</view>
            </view>
        </template>
        <template #right>
            <view class="action">
                <view class="action-btn" style="background-color: #19be6b">编辑</view>
                <view class="action-btn" style="background-color: #f56c6c">删除</view>
            </view>
        </template>
    </hy-swipe-action>
</template>

禁用滑动

html
<template>
    <hy-swipe-action borderBottom :disabled="true">
        <view class="cell">
            <view class="cell-title">禁用滑动</view>
            <view class="cell-value">此单元格无法滑动</view>
        </view>
    </hy-swipe-action>
</template>

自定义动画时间

html
<template>
    <hy-swipe-action borderBottom :duration="500">
        <view class="cell">
            <view class="cell-title">慢速动画</view>
            <view class="cell-value">动画过渡时间为 500ms</view>
        </view>
    </hy-swipe-action>
</template>

关闭前钩子

html
<template>
    <hy-swipe-action borderBottom :options="options" :beforeClose="handleBeforeClose">
        <view class="cell">
            <view class="cell-title">关闭确认</view>
            <view class="cell-value">关闭前会触发确认提示</view>
        </view>
    </hy-swipe-action>
</template>

<script setup lang="ts">
    const options = [
        {
            text: '删除',
            style: {
                backgroundColor: '#f56c6c',
            },
        },
    ];

    const handleBeforeClose = (reason: string, position: string) => {
        console.log('关闭原因:', reason);
        console.log('关闭位置:', position);
        uni.showToast({
            title: '操作已关闭',
            icon: 'none',
        });
    };
</script>

监听点击事件

html
<template>
    <hy-swipe-action
        borderBottom
        :options="options"
        @click="handleClick"
        @clickAction="handleAction"
    >
        <view class="cell">
            <view class="cell-title">点击事件</view>
            <view class="cell-value">点击内容或按钮触发事件</view>
        </view>
    </hy-swipe-action>
</template>

<script setup lang="ts">
    const options = [
        {
            text: '收藏',
            style: {
                backgroundColor: '#3c9cff',
            },
        },
        {
            text: '删除',
            style: {
                backgroundColor: '#f56c6c',
            },
        },
    ];

    const handleClick = (value: string) => {
        console.log('点击位置:', value);
        uni.showToast({
            title: `点击了: ${value}`,
            icon: 'none',
        });
    };

    const handleAction = (item: any, index: number) => {
        console.log('操作按钮:', item, index);
        uni.showToast({
            title: `点击了: ${item.text}`,
            icon: 'none',
        });
    };
</script>

程序控制开关

html
<template>
    <view>
        <hy-swipe-action borderBottom v-model="status" :options="options">
            <view class="cell">
                <view class="cell-title">程序控制</view>
                <view class="cell-value">通过按钮控制开关</view>
            </view>
        </hy-swipe-action>
        <view class="controls">
            <hy-button text="打开" @click="status = 'right'"></hy-button>
            <hy-button text="关闭" @click="status = 'close'"></hy-button>
        </view>
    </view>
</template>

<script setup lang="ts">
    import { ref } from 'vue';

    const status = ref('close');
    const options = [
        {
            text: '删除',
            style: {
                backgroundColor: '#f56c6c',
            },
        },
    ];
</script>

<style lang="scss" scoped>
    .controls {
        display: flex;
        gap: 20rpx;
        padding: 20rpx;
    }
</style>

列表场景

html
<template>
    <view class="list">
        <hy-swipe-action
            v-for="(item, index) in list"
            :key="index"
            borderBottom
            :options="options"
            @clickAction="handleDelete(index)"
        >
            <view class="cell">
                <view class="cell-title">{{ item.title }}</view>
                <view class="cell-value">{{ item.desc }}</view>
            </view>
        </hy-swipe-action>
    </view>
</template>

<script setup lang="ts">
    import { ref } from 'vue';

    const list = ref([
        { title: '列表项 1', desc: '这是第一条数据' },
        { title: '列表项 2', desc: '这是第二条数据' },
        { title: '列表项 3', desc: '这是第三条数据' },
    ]);

    const options = [
        {
            text: '删除',
            style: {
                backgroundColor: '#f56c6c',
            },
        },
    ];

    const handleDelete = (index: number) => {
        uni.showModal({
            title: '提示',
            content: '确定删除此条数据吗?',
            success: (res) => {
                if (res.confirm) {
                    list.value.splice(index, 1);
                    uni.showToast({
                        title: '删除成功',
                        icon: 'success',
                    });
                }
            },
        });
    };
</script>

<style lang="scss" scoped>
    .list {
        background: #fff;
    }
</style>

API

SwipeAction Props

参数说明类型默认值
modelValue滑动按钮的状态'left' | 'close' | 'right'close
disabled是否禁用滑动操作booleanfalse
borderBottom是否显示底部边框booleanfalse
options右侧按钮配置(无 left 插槽时生效)SwipeActionOptionsVo[]见下方
duration动画过渡时间,单位 msnumber300
beforeClose关闭滑动按钮前的钩子函数(reason: SwipeActionReason, position: SwipeActionPosition) => void-

Events

事件名说明回调参数
click当滑动按钮打开时,点击整个滑动操作容器触发 click 事件value: SwipeActionPosition
clickAction点击右侧操作按钮时触发item: SwipeActionOptionsVo, index: number
update:modelValue滑动状态改变时触发value: SwipeActionStatus

Slots

插槽名说明接收值
left自定义左侧按钮-
default自定义内容-
right自定义右侧按钮-

Typings

类型说明
ts
export interface SwipeActionOptionsVo {
    /** 按钮文本 */
    text: string;
    /** 按钮样式 */
    style?: CSSProperties;
    /** 按钮图标 */
    icon?: string;
    /** 图标大小 */
    iconSize?: string | number;
}

/** 滑动按钮状态 */
export type SwipeActionStatus = 'close' | 'left' | 'right';

/** 关闭原因 */
export type SwipeActionReason = 'click' | 'swipe' | 'value';

/** 点击位置 */
export type SwipeActionPosition = SwipeActionStatus | 'inside';

/** 关闭前钩子函数类型 */
export type SwipeActionBeforeClose = (
    reason: SwipeActionReason,
    position: SwipeActionPosition
) => void;

options

ts
[
    {
        text: '收藏',
        style: {
            backgroundColor: '#3c9cff',
        },
    },
    {
        text: '删除',
        style: {
            backgroundColor: '#f56c6c',
        },
    },
];
03:29