mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-04-06 03:57:56 +08:00
79 lines
2.5 KiB
Vue
79 lines
2.5 KiB
Vue
<template>
|
|
<el-tab-pane v-if="config" :name="config.text">
|
|
<template #label>
|
|
<div :key="config.text">
|
|
<m-icon v-if="config.icon" :icon="config.icon"></m-icon>
|
|
<div v-if="config.text" class="magic-editor-tab-panel-title">{{ config.text }}</div>
|
|
</div>
|
|
</template>
|
|
|
|
<component :is="config.component" v-bind="config.props || {}" v-on="config?.listeners || {}">
|
|
<template #component-list-panel-header v-if="data === 'component-list' || config.slots?.componentListPanelHeader">
|
|
<slot v-if="data === 'component-list'" name="component-list-panel-header"></slot>
|
|
<component v-else-if="config.slots?.componentListPanelHeader" :is="config.slots.componentListPanelHeader" />
|
|
</template>
|
|
|
|
<template #layer-panel-header v-if="data === 'layer' || config.slots?.layerPanelHeader">
|
|
<slot v-if="data === 'layer'" name="layer-panel-header"></slot>
|
|
<component v-else-if="config.slots?.layerPanelHeader" :is="config.slots.layerPanelHeader" />
|
|
</template>
|
|
|
|
<template #layer-node-content="{ data, node }" v-if="config.slots?.layerNodeContent">
|
|
<component :is="config.slots?.layerNodeContent" :data="data" :node="node" />
|
|
</template>
|
|
</component>
|
|
</el-tab-pane>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { computed, defineComponent, PropType } from 'vue';
|
|
import { Coin, Files } from '@element-plus/icons-vue';
|
|
|
|
import MIcon from '@editor/components/Icon.vue';
|
|
import { SideComponent, SideItem } from '@editor/type';
|
|
|
|
import ComponentListPanel from './ComponentListPanel.vue';
|
|
import LayerPanel from './LayerPanel.vue';
|
|
|
|
export default defineComponent({
|
|
components: { MIcon },
|
|
|
|
props: {
|
|
data: {
|
|
type: [Object, String] as PropType<SideItem>,
|
|
},
|
|
},
|
|
|
|
setup(props) {
|
|
return {
|
|
config: computed<SideComponent | undefined>(() => {
|
|
if (typeof props.data !== 'string') {
|
|
return props.data;
|
|
}
|
|
|
|
switch (props.data) {
|
|
case 'component-list':
|
|
return {
|
|
type: 'component',
|
|
icon: Coin,
|
|
text: '组件',
|
|
component: ComponentListPanel,
|
|
slots: {},
|
|
};
|
|
case 'layer':
|
|
return {
|
|
type: 'component',
|
|
icon: Files,
|
|
text: '已选组件',
|
|
component: LayerPanel,
|
|
slots: {},
|
|
};
|
|
default:
|
|
return undefined;
|
|
}
|
|
}),
|
|
};
|
|
},
|
|
});
|
|
</script>
|