这个组件展示了一系列带有节点和箭头连接的流程线,并具备不同风险等级的样式和动画效果,非常适合大屏展示项目。
功能概述
这个流程线组件具备以下功能:
- 动态渲染:根据传入的数据,组件可以自动生成节点和箭头。
- 风险等级样式:不同的节点根据风险等级(1-3)呈现不同的视觉效果。
- 炫酷的动画效果:节点和箭头自带动画效果,适合用于大屏可视化项目。
- 灵活的数据传递:通过组件的
props
传递数据,支持动态更新。
接下来,我将带你一步步实现这个组件,并展示如何在项目中使用。
组件实现
1. 组件的基本结构
我们首先定义组件的基本模板和脚本部分。FlowLine
组件接受一个 data
参数,代表流程线的各个节点,并根据节点的 risk
属性渲染不同的样式。
<template>
<div class="flow-container">
<div v-for="(line, index) in state" :key="index" class="flow-line">
<div v-for="(node, nodeIndex) in line" :key="nodeIndex" class="node-wrapper">
<div class="node" :class="getRiskClass(node.risk)">
{{ node.label }}
</div>
<div v-if="nodeIndex < line.length - 1" class="arrow-wrapper">
<div class="arrow"></div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch, defineProps } from 'vue';
const state = ref([]);
const props = defineProps({
data: {
type: Array,
default: () => [],
},
});
function getRiskClass(risk) {
if (risk === 1) return 'risk-1';
if (risk === 2) return 'risk-2';
if (risk === 3) return 'risk-3';
return '';
}
watch(() => props.data, (newData) => {
if (newData && newData.length) {
state.value = newData;
} else {
state.value = [];
}
}, { deep: true });
</script>
解析:
data
是一个二维数组,每一条数组表示一条流程线,节点通过node
表示,risk
表示风险等级。getRiskClass
根据节点的风险等级返回不同的 CSS 类名,用于控制样式。
2. 样式设计
组件的样式部分为节点和箭头设计了动态的动画效果,增加了大屏展示的视觉冲击力。不同的 risk
等级通过不同颜色和动画来区分。
.flow-container {
display: flex;
flex-direction: column;
gap: 20px;
}
.flow-line {
display: flex;
align-items: center;
gap: 10px;
}
.node-wrapper {
position: relative;
display: flex;
align-items: center;
}
.node {
padding: 10px 20px;
border-radius: 8px;
background-color: rgba(0, 188, 212, 0.1);
color: white;
font-weight: bold;
text-align: center;
position: relative;
border: 2px solid transparent;
animation: glow 2s infinite alternate;
}
.node::before {
content: "";
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
border-radius: 8px;
border: 2px solid transparent;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent);
animation: border-marquee 3s linear infinite, border-fade 2s infinite alternate;
}
@keyframes glow {
0% {
box-shadow: 0 0 6px rgba(0, 188, 212, 0.5);
}
100% {
box-shadow: 0 0 12px rgba(0, 188, 212, 1);
}
}
.risk-3::before {
border-color: #19ef07;
background: linear-gradient(90deg, transparent, rgba(42, 255, 23, 0.575), transparent);
}
.risk-2::before {
border-color: rgba(0, 188, 212, 1);
background: linear-gradient(90deg, transparent, rgba(0, 188, 212, 0.5), transparent);
}
.risk-1::before {
border-color: #b71c1c;
background: linear-gradient(90deg, transparent, rgba(183, 28, 28, 0.5), transparent);
}
.arrow-wrapper {
display: flex;
align-items: center;
justify-content: center;
flex-grow: 1;
}
.arrow {
width: 50px;
height: 2px;
background-color: #00bcd4;
position: relative;
}
解析:
node
元素设置了光效和渐变动画,使其在大屏展示中更加引人注目。arrow
元素为连接节点的箭头,使用了简单的样式和闪烁动画来模拟流动感。risk
等级样式通过不同颜色来区分,增强了风险信息的可视化表现力。
如何在项目中使用
组件封装完成后,你可以在其他项目中非常简单地复用它。只需要将组件文件导入,并传入合适的 data
即可。
1. 引入组件
首先,将 FlowLine.vue
文件复制到你的项目的 components
文件夹中。然后在需要的页面中引入这个组件:
<template>
<FlowLine :data="flowData" />
</template>
<script setup>
import FlowLine from '@/components/FlowLine.vue';
const flowData = [
[
{ label: '节点 1', risk: 1 },
{ label: '节点 2', risk: 2 },
{ label: '节点 3', risk: 3 }
],
[
{ label: '节点 A', risk: 3 },
{ label: '节点 B', risk: 2 }
]
];
</script>
2. 数据结构
flowData
是一个二维数组,每个子数组代表一条流程线,数组中的每个对象代表一个节点,并包含 label
和 risk
字段。label
是节点的显示文本,risk
是风险等级(1-3)。
总结
通过将这个流程线组件封装成一个独立的 Vue 3 组件,你可以在不同项目中轻松复用它,并根据需求动态更新显示的数据。组件不仅支持动态渲染,还具备动画效果和风险等级区分,特别适合用于大屏数据可视化展示。你可以根据项目的具体需求进一步调整样式和功能,使其更加灵活。
希望这篇博客对你封装和复用 Vue 组件有所帮助,期待你在项目中实现更多酷炫的效果!