Commit 9622995b38a8332a78db749581d75117dd89715b
Merge branch 'ft' into 'main_dev'
perf(src/hooks/): 优化自定义下拉选择器和图表交互,接口请求多次 See merge request yunteng/thingskit-view!101
Showing
6 changed files
with
107 additions
and
63 deletions
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 | * 重写select下拉框联动 | 2 | * 重写select下拉框联动 |
3 | */ | 3 | */ |
4 | -import {toRaw, toRefs} from 'vue' | 4 | +import {toRefs} from 'vue' |
5 | import {CreateComponentType} from '@/packages/index.d' | 5 | import {CreateComponentType} from '@/packages/index.d' |
6 | import {useChartEditStore} from '@/store/modules/chartEditStore/chartEditStore' | 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 | type ChartEditStoreType = typeof useChartEditStore | 9 | type ChartEditStoreType = typeof useChartEditStore |
@@ -36,21 +34,10 @@ export const useChartInteract = ( | @@ -36,21 +34,10 @@ export const useChartInteract = ( | ||
36 | Header.value[key] = param[item.interactFn[key]] | 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 | // 联动事件触发的 type 变更时,清除当前绑定内容 | 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,6 +54,8 @@ const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSe | ||
54 | 54 | ||
55 | use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent]) | 55 | use([DatasetComponent, CanvasRenderer, BarChart, GridComponent, TooltipComponent, LegendComponent]) |
56 | 56 | ||
57 | +const chartEditStore = useChartEditStore() | ||
58 | + | ||
57 | const replaceMergeArr = ref<string[]>() | 59 | const replaceMergeArr = ref<string[]>() |
58 | 60 | ||
59 | const option = computed(() => { | 61 | const option = computed(() => { |
@@ -195,7 +197,7 @@ watch( | @@ -195,7 +197,7 @@ watch( | ||
195 | ) | 197 | ) |
196 | 198 | ||
197 | //fix 修复v-chart图表绑定联动组件视图不更新问题 | 199 | //fix 修复v-chart图表绑定联动组件视图不更新问题 |
198 | -const updateVChart = (newData:SocketReceiveMessageType) => { | 200 | +const updateVChart =async (newData:SocketReceiveMessageType) => { |
199 | //区分是普通请求还是ws请求 | 201 | //区分是普通请求还是ws请求 |
200 | if (!isObject(newData) || !('dimensions' in newData)) { | 202 | if (!isObject(newData) || !('dimensions' in newData)) { |
201 | const { data } = newData | 203 | const { data } = newData |
@@ -207,26 +209,25 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | @@ -207,26 +209,25 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | ||
207 | } | 209 | } |
208 | }) | 210 | }) |
209 | } else { | 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 | const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, newData => { | 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 | updateVChart(newData) | 231 | updateVChart(newData) |
231 | }) | 232 | }) |
232 | 233 |
@@ -54,6 +54,8 @@ const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSe | @@ -54,6 +54,8 @@ const initOptions = useCanvasInitOptions(props.chartConfig.option, props.themeSe | ||
54 | 54 | ||
55 | use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) | 55 | use([DatasetComponent, CanvasRenderer, LineChart, GridComponent, TooltipComponent, LegendComponent]) |
56 | 56 | ||
57 | +const chartEditStore = useChartEditStore() | ||
58 | + | ||
57 | const replaceMergeArr = ref<string[]>() | 59 | const replaceMergeArr = ref<string[]>() |
58 | 60 | ||
59 | const option = computed(() => { | 61 | const option = computed(() => { |
@@ -194,7 +196,7 @@ watch( | @@ -194,7 +196,7 @@ watch( | ||
194 | ) | 196 | ) |
195 | 197 | ||
196 | //fix 修复v-chart图表绑定联动组件视图不更新问题 | 198 | //fix 修复v-chart图表绑定联动组件视图不更新问题 |
197 | -const updateVChart = (newData:SocketReceiveMessageType) => { | 199 | +const updateVChart =async (newData:SocketReceiveMessageType) => { |
198 | //区分是普通请求还是ws请求 | 200 | //区分是普通请求还是ws请求 |
199 | if (!isObject(newData) || !('dimensions' in newData)) { | 201 | if (!isObject(newData) || !('dimensions' in newData)) { |
200 | const { data } = newData | 202 | const { data } = newData |
@@ -207,25 +209,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | @@ -207,25 +209,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | ||
207 | }) | 209 | }) |
208 | } else { | 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 | const {vChartRef} = useChartDataFetch(props.chartConfig, useChartEditStore, (newData) => { | 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 | updateVChart(newData) | 230 | updateVChart(newData) |
230 | }) | 231 | }) |
231 | 232 |
@@ -226,7 +226,7 @@ watch( | @@ -226,7 +226,7 @@ watch( | ||
226 | ) | 226 | ) |
227 | 227 | ||
228 | //fix 修复v-chart图表绑定联动组件视图不更新问题 | 228 | //fix 修复v-chart图表绑定联动组件视图不更新问题 |
229 | -const updateVChart = (newData:SocketReceiveMessageType) => { | 229 | +const updateVChart =async (newData:SocketReceiveMessageType) => { |
230 | //区分是普通请求还是ws请求 | 230 | //区分是普通请求还是ws请求 |
231 | if (!isObject(newData) || !('dimensions' in newData)) { | 231 | if (!isObject(newData) || !('dimensions' in newData)) { |
232 | const { data } = newData | 232 | const { data } = newData |
@@ -239,25 +239,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | @@ -239,25 +239,24 @@ const updateVChart = (newData:SocketReceiveMessageType) => { | ||
239 | }) | 239 | }) |
240 | } else { | 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 | const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, newData => { | 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 | updateVChart(newData) | 260 | updateVChart(newData) |
262 | }) | 261 | }) |
263 | 262 |
@@ -15,7 +15,7 @@ import { PropType, toRefs, shallowReactive, watch ,ref,computed} from 'vue' | @@ -15,7 +15,7 @@ import { PropType, toRefs, shallowReactive, watch ,ref,computed} from 'vue' | ||
15 | import dayjs, {ManipulateType} from 'dayjs' | 15 | import dayjs, {ManipulateType} from 'dayjs' |
16 | import { CreateComponentType } from '@/packages/index.d' | 16 | import { CreateComponentType } from '@/packages/index.d' |
17 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | 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 | import { InteractEventOn } from '@/enums/eventEnum' | 19 | import { InteractEventOn } from '@/enums/eventEnum' |
20 | import {ComponentInteractEventEnum, ComponentInteractParamsEnum, DefaultTypeEnum} from './interact' | 20 | import {ComponentInteractEventEnum, ComponentInteractParamsEnum, DefaultTypeEnum} from './interact' |
21 | import quarterOfYear from 'dayjs/plugin/quarterOfYear'; | 21 | import quarterOfYear from 'dayjs/plugin/quarterOfYear'; |