政务云大屏修改
This commit is contained in:
parent
1af489ab4b
commit
9e0ccac1e5
@ -9,16 +9,13 @@ import { useEcharts } from '@/hooks/useEcharts';
|
||||
|
||||
defineOptions({ name: 'NewHyalineCake' });
|
||||
|
||||
// 记录当前选中和高亮的系列索引
|
||||
let selectedIndex = null;
|
||||
let hoveredIndex = null;
|
||||
|
||||
// 定义组件 props
|
||||
const props = defineProps({
|
||||
chartData: {
|
||||
type: Array,
|
||||
default: () => [
|
||||
// 默认示例数据
|
||||
{ name: '项目一', value: 60 },
|
||||
{ name: '项目二', value: 44 },
|
||||
{ name: '项目三', value: 32 },
|
||||
@ -27,8 +24,8 @@ const props = defineProps({
|
||||
option: {
|
||||
type: Object,
|
||||
default: () => ({
|
||||
k: 1, // 控制内外径关系的系数,1 表示无内径(实心饼),值越小内径越大
|
||||
itemGap: 0.1, // 扇形边缘向外偏移距离比例(用于选中效果),扇形的间距,单位视图坐标,可调
|
||||
k: 1, // 控制内外径关系的系数,1 表示无内径,值越小内径越大
|
||||
itemGap: 0.1, // 扇形的间距
|
||||
itemHeight: 120, // 扇形高度(影响z轴拉伸程度)
|
||||
autoItemHeight: 0, // 自动计算扇形高度时使用的系数(>0时 itemHeight 失效,使用 autoItemHeight * value )
|
||||
opacity: 0.6, // 透明度设置
|
||||
@ -46,15 +43,11 @@ const props = defineProps({
|
||||
},
|
||||
});
|
||||
|
||||
// 声明组件触发的事件
|
||||
const emit = defineEmits(['click']);
|
||||
|
||||
// 绑定到DOM的容器引用
|
||||
const chartRef = ref(null);
|
||||
// 使用 useEcharts 钩子初始化 ECharts 实例,并获取控制方法
|
||||
const { setOptions, getInstance } = useEcharts(chartRef);
|
||||
|
||||
// 存储当前的 ECharts 配置项
|
||||
const chartOption = ref({});
|
||||
|
||||
/**
|
||||
@ -69,8 +62,7 @@ const chartOption = ref({});
|
||||
* @return {Object} parametric 曲面方程
|
||||
*/
|
||||
function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h, offsetZ = 0) {
|
||||
console.log('getParametricEquation params :>> ', startRatio, endRatio, isSelected, isHovered, k, h, offsetZ);
|
||||
// 中心弧度用于计算偏移方向
|
||||
// console.log('getParametricEquation params :>> ', startRatio, endRatio, isSelected, isHovered, k, h, offsetZ);
|
||||
const midRatio = (startRatio + endRatio) / 2;
|
||||
const startRadian = startRatio * Math.PI * 2;
|
||||
const endRadian = endRatio * Math.PI * 2;
|
||||
@ -89,7 +81,6 @@ function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h
|
||||
// 计算高亮时的放大比例(未高亮时为1)
|
||||
const hoverRate = isHovered ? 1.05 : 1;
|
||||
|
||||
// 返回 parametric 曲面方程
|
||||
return {
|
||||
u: {
|
||||
// u 参数控制饼的周向角度:从 -π 到 3π,可以完整绘制一圈
|
||||
@ -155,10 +146,6 @@ function getPie3D(pieData, internalDiameterRatio) {
|
||||
|
||||
const k = typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3;
|
||||
|
||||
// 计算总值
|
||||
// pieData.forEach((item) => {
|
||||
// sumValue += item.value;
|
||||
// });
|
||||
// 构建每个扇形的 series 数据
|
||||
for (let i = 0; i < pieData.length; i += 1) {
|
||||
sumValue += pieData[i].value;
|
||||
@ -169,16 +156,19 @@ function getPie3D(pieData, internalDiameterRatio) {
|
||||
parametric: true,
|
||||
wireframe: { show: false },
|
||||
pieData: pieData[i],
|
||||
// itemStyle: {
|
||||
// opacity: props.option.opacity,
|
||||
// borderRadius: 300,
|
||||
// borderColor: '#fff',
|
||||
// }
|
||||
pieStatus: {
|
||||
selected: true,
|
||||
hovered: false,
|
||||
k,
|
||||
},
|
||||
label: {
|
||||
show: true,
|
||||
formatter: () => `${pieData[i].value}`, // 直接显示 value
|
||||
position: 'outside', // 标签位置
|
||||
distance: 10, // 距扇形边缘的距离
|
||||
color: '#fff', // 根据背景色调整
|
||||
fontSize: 14,
|
||||
},
|
||||
};
|
||||
if (typeof pieData[i].itemStyle !== 'undefined') {
|
||||
const { itemStyle } = pieData[i];
|
||||
@ -191,7 +181,7 @@ function getPie3D(pieData, internalDiameterRatio) {
|
||||
}
|
||||
// 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
|
||||
// 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
|
||||
console.log(series);
|
||||
// console.log(series);
|
||||
for (let i = 0; i < series.length; i += 1) {
|
||||
endValue = startValue + series[i].pieData.value;
|
||||
|
||||
@ -301,7 +291,7 @@ function getPie3D(pieData, internalDiameterRatio) {
|
||||
|
||||
// 监听 mouseover,近似实现高亮(放大)效果
|
||||
function handleMouseover(params) {
|
||||
console.log('mouseover');
|
||||
// console.log('mouseover');
|
||||
const idx = params.seriesIndex;
|
||||
const series = chartOption.value.series;
|
||||
|
||||
@ -418,19 +408,10 @@ function handleClick(params) {
|
||||
series[idx].parametricEquation = getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h);
|
||||
series[idx].pieStatus.selected = isSelected;
|
||||
|
||||
// 更新记录选中的系列索引
|
||||
selectedIndex = isSelected ? idx : null;
|
||||
|
||||
// 更新图表配置
|
||||
setOptions(optionVal);
|
||||
// 触发组件 click 事件供父组件使用
|
||||
emit('click', params);
|
||||
}
|
||||
// 在函数顶部声明(确保作用域覆盖所有需要的地方)
|
||||
window.debugZValues = {
|
||||
current: null,
|
||||
history: [],
|
||||
};
|
||||
|
||||
// 组件挂载后绑定事件
|
||||
onMounted(() => {
|
||||
|
@ -42,16 +42,46 @@ const state = reactive({
|
||||
icon: 'rect',
|
||||
left: 'center',
|
||||
textStyle: {
|
||||
color: '#fff', // 根据你的主题调整颜色
|
||||
fontSize: 14,
|
||||
},
|
||||
itemStyle: {
|
||||
display: 'float',
|
||||
top: '120px',
|
||||
backgroundColor: 'rgba(255, 255, 255, 0.2)',
|
||||
color: '#fff',
|
||||
fontSize: 16,
|
||||
},
|
||||
formatter: (name) => name,
|
||||
},
|
||||
// series: [
|
||||
// {
|
||||
// type: 'pie3D',
|
||||
// center: ['50%', '50%'],
|
||||
// radius: ['40%', '60%'],
|
||||
// avoidLabelOverlap: false,
|
||||
// label: {
|
||||
// normal: {
|
||||
// formatter: (params) => {
|
||||
// return params.value + '%';
|
||||
// },
|
||||
// padding: [0, -100, 25, -100],
|
||||
// rich: {
|
||||
// icon: {
|
||||
// fontSize: 16,
|
||||
// },
|
||||
// name: {
|
||||
// fontSize: 14,
|
||||
// padding: [0, 10, 0, 4],
|
||||
// color: '#666666',
|
||||
// },
|
||||
// value: {
|
||||
// fontSize: 18,
|
||||
// fontWeight: 'bold',
|
||||
// color: '#333333',
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// labelLine: {
|
||||
// show: false,
|
||||
// },
|
||||
// data: [],
|
||||
// },
|
||||
// ],
|
||||
},
|
||||
data: [
|
||||
{ value: 76, name: '产业运营平台' },
|
||||
|
Loading…
x
Reference in New Issue
Block a user