Commit 9622995b38a8332a78db749581d75117dd89715b

Authored by xp.Huang
2 parents 6a033c49 b73e42b3

Merge branch 'ft' into 'main_dev'

perf(src/hooks/): 优化自定义下拉选择器和图表交互,接口请求多次

See merge request yunteng/thingskit-view!101
  1 +/**
  2 + * 重写select下拉框联动
  3 + */
  4 +import {toRaw, toRefs} from 'vue'
  5 +import {CreateComponentType} from '@/packages/index.d'
  6 +import {useChartEditStore} from '@/store/modules/chartEditStore/chartEditStore'
  7 +import {customRequest} from "@/api/external/customRequest";
  8 +import {useFilterFn} from "@/hooks/external/useFilterFn";
  9 +
  10 +// 获取类型
  11 +type ChartEditStoreType = typeof useChartEditStore
  12 +
  13 +// Params 参数修改触发 api 更新图表请求
  14 +export const useChartInteract = (
  15 + chartConfig: CreateComponentType,
  16 + useChartEditStore: ChartEditStoreType,
  17 + param: { [T: string]: any },
  18 + interactEventOn: string
  19 +) => {
  20 + const chartEditStore = useChartEditStore()
  21 + const {interactEvents} = chartConfig.events
  22 + const fnOnEvent = interactEvents.filter(item => {
  23 + return item.interactOn === interactEventOn
  24 + })
  25 +
  26 + if (fnOnEvent.length === 0) return
  27 + fnOnEvent.forEach(async (item) => {
  28 + const index = chartEditStore.fetchTargetIndex(item.interactComponentId)
  29 + if (index === -1) return
  30 + const {Params, Header} = toRefs(chartEditStore.componentList[index].request.requestParams)
  31 + Object.keys(item.interactFn).forEach(key => {
  32 + if (Params.value[key]) {
  33 + Params.value[key] = param[item.interactFn[key]]
  34 + }
  35 + if (Header.value[key]) {
  36 + Header.value[key] = param[item.interactFn[key]]
  37 + }
  38 + })
  39 + const res = await customRequest(toRaw(chartEditStore.componentList[index].request))
  40 + if (res) {
  41 + try {
  42 + const filter = chartEditStore.componentList[index].filter
  43 + const {value} = useFilterFn(filter, res)
  44 + if (!value) return
  45 + chartEditStore.componentList[index].option.dataset = value
  46 + } finally {
  47 + console.log
  48 + }
  49 + }
  50 + })
  51 +}
  52 +
  53 +// 联动事件触发的 type 变更时,清除当前绑定内容
  54 +// export const clearInteractEvent = (chartConfig: CreateComponentType) => {
  55 +
  56 +// }
... ...
1 1 /**
2 2 * 重写select下拉框联动
3 3 */
4   -import {toRaw, toRefs} from 'vue'
  4 +import {toRefs} from 'vue'
5 5 import {CreateComponentType} from '@/packages/index.d'
6 6 import {useChartEditStore} from '@/store/modules/chartEditStore/chartEditStore'
7   -import {customRequest} from "@/api/external/customRequest";
8   -import {useFilterFn} from "@/hooks/external/useFilterFn";
9 7
10 8 // 获取类型
11 9 type ChartEditStoreType = typeof useChartEditStore
... ... @@ -36,21 +34,10 @@ export const useChartInteract = (
36 34 Header.value[key] = param[item.interactFn[key]]
37 35 }
38 36 })
39   - const res = await customRequest(toRaw(chartEditStore.componentList[index].request))
40   - if (res) {
41   - try {
42   - const filter = chartEditStore.componentList[index].filter
43   - const {value} = useFilterFn(filter, res)
44   - if (!value) return
45   - chartEditStore.componentList[index].option.dataset = value
46   - } finally {
47   - console.log
48   - }
49   - }
50 37 })
51 38 }
52 39
53 40 // 联动事件触发的 type 变更时,清除当前绑定内容
54   -export const clearInteractEvent = (chartConfig: CreateComponentType) => {
  41 +// export const clearInteractEvent = (chartConfig: CreateComponentType) => {
55 42
56   -}
  43 +// }
... ...
... ... @@ -54,6 +54,8 @@ const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSe
54 54
55 55 use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent])
56 56
  57 +const chartEditStore = useChartEditStore()
  58 +
57 59 const replaceMergeArr = ref<string[]>()
58 60
59 61 const option = computed(() => {
... ... @@ -195,7 +197,7 @@ watch(
195 197 )
196 198
197 199 //fix 修复v-chart图表绑定联动组件视图不更新问题
198   -const updateVChart = (newData:SocketReceiveMessageType) => {
  200 +const updateVChart =async (newData:SocketReceiveMessageType) => {
199 201 //区分是普通请求还是ws请求
200 202 if (!isObject(newData) || !('dimensions' in newData)) {
201 203 const { data } = newData
... ... @@ -207,26 +209,25 @@ const updateVChart = (newData:SocketReceiveMessageType) => {
207 209 }
208 210 })
209 211 } else {
210   - //异步更新,同步更新会造成联动组件控制,图表不及时更新
211   - new Promise((resolve) => {
212   - setTimeout(() => {
213   - resolve(
214   - vChartRef.value?.setOption(
215   - {
216   - ...option.value,
217   - dataset: newData
218   - },
219   - {
220   - notMerge: true
221   - }
222   - )
223   - )
224   - }, 100)
  212 + //异步更新,同步更新会造成联动组件控制,图表不及时更新
  213 + await nextTick().then(()=>{
  214 + vChartRef.value?.setOption(
  215 + {
  216 + ...option.value,
  217 + dataset: newData
  218 + },
  219 + {
  220 + notMerge: true
  221 + }
  222 + )
225 223 })
226 224 }
227 225 }
228 226
229 227 const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, newData => {
  228 + const index = chartEditStore.fetchTargetIndex(props.chartConfig.id)
  229 + if (index === -1) return
  230 + chartEditStore.componentList[index].option.dataset = newData
230 231 updateVChart(newData)
231 232 })
232 233
... ...
... ... @@ -54,6 +54,8 @@ const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSe
54 54
55 55 use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent])
56 56
  57 +const chartEditStore = useChartEditStore()
  58 +
57 59 const replaceMergeArr = ref<string[]>()
58 60
59 61 const option = computed(() => {
... ... @@ -194,7 +196,7 @@ watch(
194 196 )
195 197
196 198 //fix 修复v-chart图表绑定联动组件视图不更新问题
197   -const updateVChart = (newData:SocketReceiveMessageType) => {
  199 +const updateVChart =async (newData:SocketReceiveMessageType) => {
198 200 //区分是普通请求还是ws请求
199 201 if (!isObject(newData) || !('dimensions' in newData)) {
200 202 const { data } = newData
... ... @@ -207,25 +209,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => {
207 209 })
208 210 } else {
209 211 //异步更新,同步更新会造成联动组件控制,图表不及时更新
210   - new Promise((resolve) => {
211   - setTimeout(() => {
212   - resolve(
213   - vChartRef.value?.setOption(
214   - {
215   - ...option.value,
216   - dataset: newData
217   - },
218   - {
219   - notMerge: true
220   - }
221   - )
222   - )
223   - }, 100)
  212 + await nextTick().then(()=>{
  213 + vChartRef.value?.setOption(
  214 + {
  215 + ...option.value,
  216 + dataset: newData
  217 + },
  218 + {
  219 + notMerge: true
  220 + }
  221 + )
224 222 })
225 223 }
226 224 }
227 225
228 226 const {vChartRef} = useChartDataFetch(props.chartConfig, useChartEditStore, (newData) => {
  227 + const index = chartEditStore.fetchTargetIndex(props.chartConfig.id)
  228 + if (index === -1) return
  229 + chartEditStore.componentList[index].option.dataset = newData
229 230 updateVChart(newData)
230 231 })
231 232
... ...
... ... @@ -226,7 +226,7 @@ watch(
226 226 )
227 227
228 228 //fix 修复v-chart图表绑定联动组件视图不更新问题
229   -const updateVChart = (newData:SocketReceiveMessageType) => {
  229 +const updateVChart =async (newData:SocketReceiveMessageType) => {
230 230 //区分是普通请求还是ws请求
231 231 if (!isObject(newData) || !('dimensions' in newData)) {
232 232 const { data } = newData
... ... @@ -239,25 +239,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => {
239 239 })
240 240 } else {
241 241 //异步更新,同步更新会造成联动组件控制,图表不及时更新
242   - new Promise((resolve) => {
243   - setTimeout(() => {
244   - resolve(
245   - vChartRef.value?.setOption(
246   - {
247   - ...option.value,
248   - dataset: newData
249   - },
250   - {
251   - notMerge: true
252   - }
253   - )
254   - )
255   - }, 100)
  242 + await nextTick().then(()=>{
  243 + vChartRef.value?.setOption(
  244 + {
  245 + ...option.value,
  246 + dataset: newData
  247 + },
  248 + {
  249 + notMerge: true
  250 + }
  251 + )
256 252 })
257 253 }
258 254 }
259 255
260 256 const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, newData => {
  257 + const index = chartEditStore.fetchTargetIndex(props.chartConfig.id)
  258 + if (index === -1) return
  259 + chartEditStore.componentList[index].option.dataset = newData
261 260 updateVChart(newData)
262 261 })
263 262
... ...
... ... @@ -15,7 +15,7 @@ import { PropType, toRefs, shallowReactive, watch ,ref,computed} from 'vue'
15 15 import dayjs, {ManipulateType} from 'dayjs'
16 16 import { CreateComponentType } from '@/packages/index.d'
17 17 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
18   -import { useChartInteract } from '@/hooks/external/useChartSelectInteract.hook'
  18 +import { useChartInteract } from '@/hooks/external/useChartDateInteract.hook'
19 19 import { InteractEventOn } from '@/enums/eventEnum'
20 20 import {ComponentInteractEventEnum, ComponentInteractParamsEnum, DefaultTypeEnum} from './interact'
21 21 import quarterOfYear from 'dayjs/plugin/quarterOfYear';
... ...