62 lines
1.4 KiB
Vue
62 lines
1.4 KiB
Vue
<script setup>
|
||
import { computed, ref, useSlots } from 'vue'
|
||
|
||
// 接收最大长度的 prop,默认值 100
|
||
const props = defineProps({
|
||
maxLength: {
|
||
type: Number,
|
||
default: 100,
|
||
},
|
||
})
|
||
|
||
// 记录当前是否展开
|
||
const isExpanded = ref(false)
|
||
|
||
// 获取 slot 内容
|
||
const slots = useSlots()
|
||
|
||
// 计算截断后的内容
|
||
const truncatedContent = computed(() => {
|
||
const slotContent = getSlotContent()
|
||
return slotContent.length > props.maxLength
|
||
? `${slotContent.slice(0, props.maxLength)}...`
|
||
: slotContent
|
||
})
|
||
|
||
// 获取 slot 内容,确保返回的内容为字符串
|
||
function getSlotContent() {
|
||
const slotVNode = slots.default ? slots.default()[0] : null
|
||
return slotVNode ? slotVNode.children.toString().trim() : '' // 获取并转化为字符串
|
||
}
|
||
|
||
// 切换展开/收起状态
|
||
function toggleExpand() {
|
||
isExpanded.value = !isExpanded.value
|
||
}
|
||
</script>
|
||
|
||
<template>
|
||
<view>
|
||
<!-- 展开/收起按钮 -->
|
||
|
||
<!-- 展开/收起的内容 -->
|
||
<text v-if="isExpanded">
|
||
<slot /> <!-- 使用 slot 来展示传递的内容 -->
|
||
</text>
|
||
<text v-else>
|
||
<text>{{ truncatedContent }}</text>
|
||
</text>
|
||
<text
|
||
:title="isExpanded ? '点击收起' : '点击展开'"
|
||
class="cursor-pointer text-blue-500"
|
||
@click="toggleExpand"
|
||
>
|
||
{{ isExpanded ? '收起' : '展开' }}
|
||
</text>
|
||
</view>
|
||
</template>
|
||
|
||
<style scoped>
|
||
|
||
</style>
|