fix: 解决预览时模糊问题

This commit is contained in:
xiangmaoshuo 2023-03-09 18:26:50 +08:00
parent d6f15b48c7
commit 93350f0f6a
23 changed files with 202 additions and 15 deletions

View File

@ -0,0 +1,45 @@
<template>
<n-radio-group :value="props.modelValue || INHERIT_VALUE" @update:value="handleChange">
<n-space>
<n-tooltip :show-arrow="false" trigger="hover" v-for="item in rendererList" :key="item.value">
<template #trigger>
<n-radio :value="item.value">
{{ item.value }}
</n-radio>
</template>
{{ item.desc }}
</n-tooltip>
</n-space>
</n-radio-group>
</template>
<script setup lang="ts">
import { type EchartsRenderer } from '@/settings/chartThemes'
const props = defineProps<{ modelValue?: EchartsRenderer; includeInherit?: boolean }>()
const emits = defineEmits(['update:modelValue'])
const INHERIT_VALUE = 'inherit'
const handleChange = (val: EchartsRenderer & typeof INHERIT_VALUE) => {
emits('update:modelValue', val === INHERIT_VALUE ? undefined : val)
}
const rendererList = [
{
value: 'svg',
desc: '在缩放场景下具有更好的表现'
},
{
value: 'canvas',
desc: '数据量较大(经验判断 > 1k、较多交互时建议选择'
},
...(props.includeInherit
? [
{
value: INHERIT_VALUE,
desc: '默认继承全局配置'
}
]
: [])
]
</script>

View File

@ -1,4 +1,34 @@
<template> <template>
<collapse-item name="渲染器">
<setting-item-box :alone="true">
<template #name>
<n-text>全局</n-text>
<n-tooltip trigger="hover">
<template #trigger>
<n-icon size="21" :depth="3">
<help-outline-icon></help-outline-icon>
</n-icon>
</template>
<n-text>所有echarts图表组件默认都将采用所选的渲染器进行渲染</n-text>
</n-tooltip>
</template>
<EchartsRendererSetting v-model="themeSetting.renderer" />
</setting-item-box>
<setting-item-box :alone="true">
<template #name>
<n-text>当前</n-text>
<n-tooltip trigger="hover">
<template #trigger>
<n-icon size="21" :depth="3">
<help-outline-icon></help-outline-icon>
</n-icon>
</template>
<n-text>仅当前组件采用指定渲染器渲染</n-text>
</n-tooltip>
</template>
<EchartsRendererSetting v-model="optionData.renderer" includeInherit />
</setting-item-box>
</collapse-item>
<collapse-item v-if="title" name="标题"> <collapse-item v-if="title" name="标题">
<template #header> <template #header>
<n-switch v-model:value="title.show" size="small"></n-switch> <n-switch v-model:value="title.show" size="small"></n-switch>
@ -283,6 +313,11 @@ import { PropType, computed } from 'vue'
import { GlobalThemeJsonType } from '@/settings/chartThemes/index' import { GlobalThemeJsonType } from '@/settings/chartThemes/index'
import { axisConfig } from '@/packages/chartConfiguration/echarts/index' import { axisConfig } from '@/packages/chartConfiguration/echarts/index'
import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting' import { CollapseItem, SettingItemBox, SettingItem, GlobalSettingPosition } from '@/components/Pages/ChartItemSetting'
import { icon } from '@/plugins'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import EchartsRendererSetting from './EchartsRendererSetting.vue'
const { HelpOutlineIcon } = icon.ionicons5
const props = defineProps({ const props = defineProps({
optionData: { optionData: {
@ -296,6 +331,12 @@ const props = defineProps({
} }
}) })
const chartEditStore = useChartEditStore()
const themeSetting = computed(() => {
const chartThemeSetting = chartEditStore.getEditCanvasConfig.chartThemeSetting
return chartThemeSetting
})
const title = computed(() => { const title = computed(() => {
return props.optionData.title return props.optionData.title
}) })

View File

@ -0,0 +1,26 @@
import { inject, type Ref } from 'vue'
import { EchartsRenderer } from '@/settings/chartThemes'
import { SCALE_KEY } from '@/views/preview/hooks/useScale.hook'
import { use } from 'echarts/core'
import { CanvasRenderer, SVGRenderer } from 'echarts/renderers'
use([CanvasRenderer, SVGRenderer])
type InitOptions = {
renderer: EchartsRenderer
devicePixelRatio?: number
}
// 获取需要给当前echarts组件设置什么初始值
export function useCanvasInitOptions(option: any, themeSetting: any) {
const renderer = option.renderer || themeSetting.renderer
const initOptions: InitOptions = { renderer }
const scaleRef = inject<Ref<{ width: number; height: number }>>(SCALE_KEY) || { value: { width: 1, height: 1 } }
if (renderer === 'canvas') {
initOptions.devicePixelRatio = Math.ceil(
Math.max(window.devicePixelRatio, scaleRef.value.width, scaleRef.value.height)
)
}
return initOptions
}

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -14,6 +15,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, nextTick, computed, watch, PropType } from 'vue' import { ref, nextTick, computed, watch, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { BarChart } from 'echarts/charts' import { BarChart } from 'echarts/charts'
@ -41,6 +43,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent])
const replaceMergeArr = ref<string[]>() const replaceMergeArr = ref<string[]>()

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -14,6 +15,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, nextTick, computed, watch, PropType } from 'vue' import { ref, nextTick, computed, watch, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { BarChart } from 'echarts/charts' import { BarChart } from 'echarts/charts'
@ -40,6 +42,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent])
const replaceMergeArr = ref<string[]>() const replaceMergeArr = ref<string[]>()

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -15,6 +16,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType, computed, watch, ref, nextTick } from 'vue' import { PropType, computed, watch, ref, nextTick } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { LineChart } from 'echarts/charts' import { LineChart } from 'echarts/charts'
@ -41,6 +43,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent])
const replaceMergeArr = ref<string[]>() const replaceMergeArr = ref<string[]>()

View File

@ -1,11 +1,12 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize>
</v-chart> </v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { reactive, watch, PropType } from 'vue' import { reactive, watch, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use, graphic } from 'echarts/core' import { use, graphic } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { LineChart } from 'echarts/charts' import { LineChart } from 'echarts/charts'
@ -32,6 +33,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent])
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { reactive, watch, PropType } from 'vue' import { reactive, watch, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use, graphic } from 'echarts/core' import { use, graphic } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { LineChart } from 'echarts/charts' import { LineChart } from 'echarts/charts'
@ -31,6 +32,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent])
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()

View File

@ -1,11 +1,12 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize>
</v-chart> </v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType, watch, reactive } from 'vue' import { PropType, watch, reactive } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { LineChart } from 'echarts/charts' import { LineChart } from 'echarts/charts'
@ -32,6 +33,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent])
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()

View File

@ -1,5 +1,5 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option.value" :manual-update="isPreview()" autoresize>
</v-chart> </v-chart>
</template> </template>
@ -7,6 +7,7 @@
import { PropType, reactive, watch, ref, nextTick } from 'vue' import { PropType, reactive, watch, ref, nextTick } from 'vue'
import config, { includes } from './config' import config, { includes } from './config'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use, registerMap } from 'echarts/core' import { use, registerMap } from 'echarts/core'
import { EffectScatterChart, MapChart } from 'echarts/charts' import { EffectScatterChart, MapChart } from 'echarts/charts'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -32,6 +33,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([ use([
MapChart, MapChart,
DatasetComponent, DatasetComponent,

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, PropType } from 'vue' import { computed, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { FunnelChart } from 'echarts/charts' import { FunnelChart } from 'echarts/charts'
@ -31,6 +32,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, FunnelChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, FunnelChart, GridComponent, TooltipComponent, LegendComponent])
const option = computed(() => { const option = computed(() => {

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch, computed, PropType } from 'vue' import { ref, watch, computed, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import dataJson from './data.json' import dataJson from './data.json'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -38,6 +39,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([ use([
DatasetComponent, DatasetComponent,
CanvasRenderer, CanvasRenderer,

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, PropType, watch } from 'vue' import { ref, computed, PropType, watch } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import dataJson from './data.json' import dataJson from './data.json'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -32,6 +33,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, RadarChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, RadarChart, GridComponent, TooltipComponent, LegendComponent])
const vChartRef = ref<typeof VChart>() const vChartRef = ref<typeof VChart>()

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, PropType, watch } from 'vue' import { ref, computed, PropType, watch } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import dataJson from './data.json' import dataJson from './data.json'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -31,6 +32,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([CanvasRenderer, TreemapChart]) use([CanvasRenderer, TreemapChart])
const vChartRef = ref<typeof VChart>() const vChartRef = ref<typeof VChart>()

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart :theme="themeColor" :option="option.value" autoresize></v-chart> <v-chart :theme="themeColor" :init-options="initOptions" :option="option.value" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType, watch, reactive } from 'vue' import { PropType, watch, reactive } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import 'echarts-liquidfill/src/liquidFill.js' import 'echarts-liquidfill/src/liquidFill.js'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -30,6 +31,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([CanvasRenderer, GridComponent]) use([CanvasRenderer, GridComponent])
const chartEditStore = useChartEditStore() const chartEditStore = useChartEditStore()

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart :theme="themeColor" :option="option.value" autoresize> </v-chart> <v-chart :theme="themeColor" :init-options="initOptions" :option="option.value" autoresize> </v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { PropType, reactive, watch } from 'vue' import { PropType, reactive, watch } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts' import { PieChart } from 'echarts/charts'
@ -29,6 +30,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent]) use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent])
const option = reactive({ const option = reactive({

View File

@ -1,10 +1,11 @@
<template> <template>
<v-chart ref="vChartRef" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart> <v-chart ref="vChartRef" :init-options="initOptions" :theme="themeColor" :option="option" :manual-update="isPreview()" autoresize></v-chart>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, PropType, reactive, watch } from 'vue' import { computed, PropType, reactive, watch } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts' import { PieChart } from 'echarts/charts'
@ -30,6 +31,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent])
const option = computed(() => { const option = computed(() => {

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -13,6 +14,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType, computed, watch, ref, nextTick } from 'vue' import { PropType, computed, watch, ref, nextTick } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
import { ScatterChart, EffectScatterChart } from 'echarts/charts' import { ScatterChart, EffectScatterChart } from 'echarts/charts'
@ -46,6 +48,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([ use([
DatasetComponent, DatasetComponent,
CanvasRenderer, CanvasRenderer,

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -13,6 +14,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PropType, computed, ref } from 'vue' import { PropType, computed, ref } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import ecStat from 'echarts-stat' import ecStat from 'echarts-stat'
import { use, registerTransform } from 'echarts/core' import { use, registerTransform } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -47,6 +49,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([ use([
DatasetComponent, DatasetComponent,
CanvasRenderer, CanvasRenderer,

View File

@ -1,4 +1,5 @@
<template> <template>
<global-setting :optionData="optionData"></global-setting>
<collapse-item name="词云" expanded> <collapse-item name="词云" expanded>
<setting-item-box name="形状"> <setting-item-box name="形状">
<setting-item> <setting-item>
@ -45,7 +46,7 @@
import { PropType, computed } from 'vue' import { PropType, computed } from 'vue'
import { option, ShapeEnumList } from './config' import { option, ShapeEnumList } from './config'
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' import { GlobalSetting, CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
const props = defineProps({ const props = defineProps({
optionData: { optionData: {

View File

@ -1,6 +1,7 @@
<template> <template>
<v-chart <v-chart
ref="vChartRef" ref="vChartRef"
:init-options="initOptions"
:theme="themeColor" :theme="themeColor"
:option="option" :option="option"
:manual-update="isPreview()" :manual-update="isPreview()"
@ -12,6 +13,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, watch, PropType } from 'vue' import { ref, computed, watch, PropType } from 'vue'
import VChart from 'vue-echarts' import VChart from 'vue-echarts'
import { useCanvasInitOptions } from '@/hooks/useCanvasInitOptions.hook'
import 'echarts-wordcloud' import 'echarts-wordcloud'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers' import { CanvasRenderer } from 'echarts/renderers'
@ -38,6 +40,8 @@ const props = defineProps({
} }
}) })
const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSetting)
use([CanvasRenderer, GridComponent, TooltipComponent]) use([CanvasRenderer, GridComponent, TooltipComponent])
const replaceMergeArr = ref<string[]>() const replaceMergeArr = ref<string[]>()

View File

@ -64,10 +64,13 @@ export const chartColorsSearch = {
roma: ['#e01f54', '#5e4ea5', 'rgba(137, 52, 72, 0.3)', 'rgba(224, 31, 84, 0.5)', 'rgba(94, 78, 165, 0.5)'], roma: ['#e01f54', '#5e4ea5', 'rgba(137, 52, 72, 0.3)', 'rgba(224, 31, 84, 0.5)', 'rgba(94, 78, 165, 0.5)'],
} }
export type EchartsRenderer = 'svg' | 'canvas';
// 默认主题详细配置 // 默认主题详细配置
type ThemeJsonType = typeof themeJson type ThemeJsonType = typeof themeJson
export interface GlobalThemeJsonType extends Partial<ThemeJsonType> { export interface GlobalThemeJsonType extends Partial<ThemeJsonType> {
dataset?: any, dataset?: any,
renderer?: EchartsRenderer,
[T:string]: any [T:string]: any
} }
export const globalThemeJson = {...themeJson, dataset: null,} export const globalThemeJson = {...themeJson, dataset: null, renderer: 'svg' as const }

View File

@ -1,13 +1,22 @@
import { ref, onMounted, onUnmounted} from 'vue' import { ref, provide, onMounted, onUnmounted } from 'vue'
import { usePreviewFitScale, usePreviewScrollYScale, usePreviewScrollXScale, usePreviewFullScale } from '@/hooks/index' import { usePreviewFitScale, usePreviewScrollYScale, usePreviewScrollXScale, usePreviewFullScale } from '@/hooks/index'
import type { ChartEditStorageType } from '../index.d' import type { ChartEditStorageType } from '../index.d'
import { PreviewScaleEnum } from '@/enums/styleEnum' import { PreviewScaleEnum } from '@/enums/styleEnum'
export const SCALE_KEY = 'scale-value'
export const useScale = (localStorageInfo: ChartEditStorageType) => { export const useScale = (localStorageInfo: ChartEditStorageType) => {
const entityRef = ref() const entityRef = ref()
const previewRef = ref() const previewRef = ref()
const width = ref(localStorageInfo.editCanvasConfig.width) const width = ref(localStorageInfo.editCanvasConfig.width)
const height = ref(localStorageInfo.editCanvasConfig.height) const height = ref(localStorageInfo.editCanvasConfig.height)
const scaleRef = ref({ width: 1, height: 1 })
provide(SCALE_KEY, scaleRef);
const updateScaleRef = (scale: { width: number; height: number }) => {
scaleRef.value = scale
}
// 屏幕适配 // 屏幕适配
onMounted(() => { onMounted(() => {
@ -17,6 +26,7 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
width.value as number, width.value as number,
height.value as number, height.value as number,
previewRef.value, previewRef.value,
updateScaleRef
) )
calcRate() calcRate()
windowResize() windowResize()
@ -34,6 +44,7 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
const dom = entityRef.value const dom = entityRef.value
dom.style.width = `${width.value * scale.width}px` dom.style.width = `${width.value * scale.width}px`
dom.style.height = `${height.value * scale.height}px` dom.style.height = `${height.value * scale.height}px`
updateScaleRef(scale)
} }
) )
calcRate() calcRate()
@ -53,6 +64,7 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
const dom = entityRef.value const dom = entityRef.value
dom.style.width = `${width.value * scale.width}px` dom.style.width = `${width.value * scale.width}px`
dom.style.height = `${height.value * scale.height}px` dom.style.height = `${height.value * scale.height}px`
updateScaleRef(scale)
} }
) )
calcRate() calcRate()
@ -68,6 +80,7 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
width.value as number, width.value as number,
height.value as number, height.value as number,
previewRef.value, previewRef.value,
updateScaleRef
) )
calcRate() calcRate()
windowResize() windowResize()
@ -81,6 +94,7 @@ export const useScale = (localStorageInfo: ChartEditStorageType) => {
return { return {
entityRef, entityRef,
previewRef previewRef,
scaleRef
} }
} }