89 lines
2.0 KiB
Vue
89 lines
2.0 KiB
Vue
|
<!-- 装修基础组件:悬浮按钮 -->
|
|||
|
<template>
|
|||
|
<!-- 模态背景:展开时显示,点击后折叠 -->
|
|||
|
<view class="modal-bg" v-if="fabRef?.isShow" @click="handleCollapseFab"></view>
|
|||
|
<!-- 悬浮按钮 -->
|
|||
|
<uni-fab
|
|||
|
ref="fabRef"
|
|||
|
horizontal="right"
|
|||
|
vertical="bottom"
|
|||
|
:direction="state.direction"
|
|||
|
:pattern="state.pattern"
|
|||
|
:content="state.content"
|
|||
|
@trigger="handleOpenLink"
|
|||
|
/>
|
|||
|
</template>
|
|||
|
<script setup>
|
|||
|
/**
|
|||
|
* 悬浮按钮
|
|||
|
*/
|
|||
|
|
|||
|
import sheep from '@/sheep';
|
|||
|
import { reactive, ref, unref } from 'vue';
|
|||
|
import { onBackPress } from '@dcloudio/uni-app';
|
|||
|
|
|||
|
// 定义属性
|
|||
|
const props = defineProps({
|
|||
|
data: {
|
|||
|
type: Object,
|
|||
|
default() {},
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
// 悬浮按钮配置: https://uniapp.dcloud.net.cn/component/uniui/uni-fab.html#fab-props
|
|||
|
const state = reactive({
|
|||
|
// 可选样式配置项
|
|||
|
pattern: [],
|
|||
|
// 展开菜单内容配置项
|
|||
|
content: [],
|
|||
|
// 展开菜单显示方式:horizontal-水平显示,vertical-垂直显示
|
|||
|
direction: '',
|
|||
|
});
|
|||
|
|
|||
|
// 悬浮按钮引用
|
|||
|
const fabRef = ref(null);
|
|||
|
// 按钮方向
|
|||
|
state.direction = props.data.direction;
|
|||
|
props.data?.list.forEach((item) => {
|
|||
|
// 按钮文字
|
|||
|
const text = props.data?.showText ? item.text : ''
|
|||
|
// 生成内容配置项
|
|||
|
state.content.push({ iconPath: sheep.$url.cdn(item.imgUrl), url: item.url, text });
|
|||
|
// 生成样式配置项
|
|||
|
state.pattern.push({ color: item.textColor });
|
|||
|
});
|
|||
|
|
|||
|
// 处理链接跳转
|
|||
|
function handleOpenLink(e) {
|
|||
|
sheep.$router.go(e.item.url);
|
|||
|
}
|
|||
|
|
|||
|
// 折叠
|
|||
|
function handleCollapseFab() {
|
|||
|
if (unref(fabRef)?.isShow) {
|
|||
|
unref(fabRef)?.close();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 按返回值后,折叠悬浮按钮
|
|||
|
onBackPress(() => {
|
|||
|
if (unref(fabRef)?.isShow) {
|
|||
|
unref(fabRef)?.close();
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
});
|
|||
|
</script>
|
|||
|
<style lang="scss" scoped>
|
|||
|
/* 模态背景 */
|
|||
|
.modal-bg {
|
|||
|
position: fixed;
|
|||
|
left: 0;
|
|||
|
top: 0;
|
|||
|
z-index: 11;
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
background-color: rgba(#000000, 0.4);
|
|||
|
}
|
|||
|
</style>
|