de/core/frontend/src/components/asyncComponent/index.vue
2023-08-24 17:34:35 +08:00

85 lines
1.9 KiB
Vue

<template>
<component
:is="mode"
:ref="refId"
:obj="obj"
:bus="bus"
:axios-request="request"
v-bind="$attrs"
v-on="$listeners"
/>
</template>
<script>
import { uuid } from 'vue-uuid'
import { get } from '@/api/system/dynamic'
import bus from '@/utils/bus'
import request from '@/utils/request'
export default {
name: 'AsyncComponent',
inheritAttrs: true,
props: {
// 父组件提供请求地址
url: {
type: String,
default: ''
},
obj: {
type: Object,
default: () => {}
}
},
data() {
return {
resData: '',
mode: '',
refId: null,
bus: bus,
request: request
}
},
watch: {
url: {
immediate: true,
async handler(val, oldVal) {
if (!this.url) return
// Cache 缓存 根据 url 参数
if (!window.SyncComponentCache) {
window.SyncComponentCache = {}
}
let res
if (!window.SyncComponentCache[this.url]) {
window.SyncComponentCache[this.url] = get(this.url)
// window.SyncComponentCache[this.url] = Axios.get(this.url)
res = await window.SyncComponentCache[this.url]
} else {
res = await window.SyncComponentCache[this.url]
}
if (res) {
const Fn = Function
const dynamicCode = res.data || res
const component = new Fn(`return ${dynamicCode}`)()
this.mode = component.default || component
}
}
}
},
created() {
this.refId = uuid.v1
},
beforeDestroy() {
this.mode = null
},
methods: {
/* chartResize() {
this.$refs[this.refId] && this.$refs[this.refId].chartResize && this.$refs[this.refId].chartResize()
}, */
callPluginInner(param) {
const { methodName, methodParam } = param
return this.$refs[this.refId] && this.$refs[this.refId][methodName] && this.$refs[this.refId][methodName](methodParam)
}
}
}
</script>