92 lines
2.4 KiB
Vue
92 lines
2.4 KiB
Vue
<template>
|
||
<div class="go-iframe-container" :style="{ width: w + 'px', height: h + 'px' }">
|
||
<iframe ref="iframeRef" class="iframe-content" src="/public/static/index.html"></iframe>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import config, { BarOption } from './config';
|
||
import { PropType, toRefs, ref, onMounted, computed, watchEffect } from 'vue'; // 1. 引入 watchEffect
|
||
import dataJson from './data.json'
|
||
|
||
const iframeRef = ref<HTMLIFrameElement | null>(null);
|
||
const isIframeReady = ref(false); // 2. 创建一个状态来跟踪 iframe 是否已加载
|
||
let iframeApi: any = null;
|
||
|
||
const props = defineProps({
|
||
chartConfig: {
|
||
type: Object as PropType<config>,
|
||
required: true
|
||
}
|
||
})
|
||
|
||
const { w, h } = toRefs(props.chartConfig.attr)
|
||
|
||
|
||
|
||
const BarOptionsData = computed(() => {
|
||
return dataJson.barOptions.map(item =>
|
||
new BarOption(item as unknown as Partial<BarOption>)
|
||
);
|
||
});
|
||
console.log(BarOptionsData)
|
||
|
||
onMounted(() => {
|
||
const iframe = iframeRef.value;
|
||
if (iframe) {
|
||
iframe.onload = () => {
|
||
console.log(" Iframe content has loaded!");
|
||
if (iframe.contentWindow && (iframe.contentWindow as any).g) {
|
||
iframeApi = (iframe.contentWindow as any).g.active3d;
|
||
isIframeReady.value = true;
|
||
} else {
|
||
console.error("无法访问 iframe 内的 g.active3d 对象。");
|
||
}
|
||
};
|
||
}
|
||
});
|
||
|
||
// 4. 使用 watchEffect 来处理所有绘图逻辑
|
||
// index.vue
|
||
|
||
watchEffect(() => {
|
||
if (isIframeReady.value && BarOptionsData.value && iframeApi) {
|
||
// console.log(" Drawing chart with new options...");
|
||
|
||
// 增加延迟,确保iframe内方法准备就绪
|
||
setTimeout(() => {
|
||
BarOptionsData.value.forEach(barConfig => {
|
||
// console.log(" Drawing bar with config:", barConfig);
|
||
callIframeMethod("createBar", barConfig);
|
||
});
|
||
}, 500); // 500ms延迟,可根据实际情况调整
|
||
}
|
||
});
|
||
|
||
|
||
/**
|
||
* 调用 iframe 内部方法的通用函数
|
||
*/
|
||
function callIframeMethod(methodName: string, ...args: any[]) {
|
||
if (iframeApi && typeof iframeApi[methodName] === 'function') {
|
||
iframeApi[methodName].apply(iframeApi, args);
|
||
} else if (isIframeReady.value) {
|
||
console.error(`方法 ${methodName} 在 iframe API 上不存在。`);
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.go-iframe-container {
|
||
// width: 1300px;
|
||
// height: 900px;
|
||
overflow: hidden;
|
||
// border: 1px solid #ccc;
|
||
}
|
||
|
||
.iframe-content {
|
||
width: 100%;
|
||
height: 100%;
|
||
border: none;
|
||
}
|
||
</style> |