index.vue
2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!--
列表项操作按钮组件
@description 统一的列表项操作按钮组件,支持查看、收藏、删除三种操作
@example
<ListItemActions
:viewable="true"
:collectable="true"
:deletable="true"
:collected="item.collected"
:item-id="item.id"
@view="onView(item)"
@collect="onCollect(item)"
@delete="onDelete(item)"
/>
-->
<template>
<view class="flex justify-end gap-[24rpx]">
<!-- 查看按钮 -->
<view v-if="viewable" class="flex items-center text-blue-600" @tap="handleView">
<IconFont name="eye" size="14" class="mr-[8rpx]" />
<text class="text-[24rpx]">查看</text>
</view>
<!-- 收藏按钮 -->
<view v-if="collectable" class="flex items-center" :class="isCollected ? 'text-red-500' : 'text-gray-400'" @tap="handleCollect">
<IconFont :name="isCollected ? 'heart-fill' : 'heart'" size="14" class="mr-[8rpx]" />
<text class="text-[24rpx]">{{ isCollected ? '已收藏' : '收藏' }}</text>
</view>
<!-- 删除按钮 -->
<view v-if="deletable" class="flex items-center text-red-500" @tap="handleDelete">
<IconFont name="del" size="14" class="mr-[8rpx]" />
<text class="text-[24rpx]">删除</text>
</view>
</view>
</template>
<script setup>
import { computed } from 'vue'
import IconFont from '@/components/IconFont.vue'
import { useEventTracking } from '@/composables/useEventTracking'
/**
* 组件属性
*/
const props = defineProps({
/**
* 是否显示查看按钮
* @type {boolean}
* @default true
*/
viewable: {
type: Boolean,
default: true
},
/**
* 是否显示收藏按钮
* @type {boolean}
* @default false
*/
collectable: {
type: Boolean,
default: false
},
/**
* 是否显示删除按钮
* @type {boolean}
* @default false
*/
deletable: {
type: Boolean,
default: false
},
/**
* 是否已收藏
* @type {boolean}
* @default false
*/
collected: {
type: Boolean,
default: false
},
/**
* 关联对象 ID(用于埋点)
* @type {string}
*/
itemId: {
type: String,
default: ''
}
})
/**
* 组件事件
*/
const emit = defineEmits({
/**
* 点击查看按钮时触发
*/
view: null,
/**
* 点击收藏按钮时触发
*/
collect: null,
/**
* 点击删除按钮时触发
*/
delete: null
})
const isCollected = computed(() => props.collected)
// 初始化埋点功能
const { trackFileRead } = useEventTracking()
/**
* 处理查看点击
*
* @description 触发查看事件,并自动发送埋点数据
*/
const handleView = () => {
// 如果提供了 itemId,自动发送埋点
if (props.itemId) {
trackFileRead(props.itemId)
}
emit('view')
}
/**
* 处理收藏点击
*/
const handleCollect = () => {
emit('collect')
}
/**
* 处理删除点击
*/
const handleDelete = () => {
emit('delete')
}
</script>
<style lang="less" scoped>
</style>