Commit 3731f6aa908c977f0d18bd03c8149a709ea06b30
1 parent
46b6cdbf
feat(packages/external): 优化自定义按钮跳转
Showing
4 changed files
with
68 additions
and
49 deletions
1 | -import { toRefs, ref } from 'vue' | 1 | +import { toRefs } from 'vue' |
2 | import { CreateComponentType } from '@/packages/index.d' | 2 | import { CreateComponentType } from '@/packages/index.d' |
3 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | 3 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' |
4 | 4 | ||
@@ -14,6 +14,8 @@ export const useChartInteract = ( | @@ -14,6 +14,8 @@ export const useChartInteract = ( | ||
14 | ) => { | 14 | ) => { |
15 | const chartEditStore = useChartEditStore() | 15 | const chartEditStore = useChartEditStore() |
16 | const { interactEvents } = chartConfig.events | 16 | const { interactEvents } = chartConfig.events |
17 | + const { selectCurrentItems } = chartConfig.option | ||
18 | + const { selectTargetItems } = chartConfig.option | ||
17 | const fnOnEvent = interactEvents.filter(item => { | 19 | const fnOnEvent = interactEvents.filter(item => { |
18 | return item.interactOn === interactEventOn | 20 | return item.interactOn === interactEventOn |
19 | }) | 21 | }) |
@@ -30,26 +32,21 @@ export const useChartInteract = ( | @@ -30,26 +32,21 @@ export const useChartInteract = ( | ||
30 | Header.value[key] = param[item.interactFn[key]] | 32 | Header.value[key] = param[item.interactFn[key]] |
31 | } | 33 | } |
32 | }) | 34 | }) |
33 | - setJump(chartConfig) | 35 | + setJump(selectCurrentItems, selectTargetItems) |
34 | }) | 36 | }) |
35 | - function setJump(chart: CreateComponentType) { | ||
36 | - /** | ||
37 | - * 通过页面显示隐藏来模拟页面跳转 | ||
38 | - * 当前点击对象和绑定的联动组件(分组或单个)内容隐藏,目标对象和绑定的联动组件(分组或单个)内容显示 | ||
39 | - */ | 37 | + function setJump(selectCurrentItems: string[], selectTargetItems: string[]) { |
40 | try { | 38 | try { |
41 | - const targetId = chart.option.dataset[0].target | ||
42 | - const currentId = chart.option.dataset[0].current | ||
43 | - const targetButtonId = chart.option.dataset[0].targetButton | ||
44 | - const currentButtonId = chart.option.dataset[0].currentButton | ||
45 | - const targetIndex = chartEditStore.fetchTargetIndex(targetId) | ||
46 | - const currentIndex = chartEditStore.fetchTargetIndex(currentId) | ||
47 | - const targetButtonIndex = chartEditStore.fetchTargetIndex(targetButtonId) | ||
48 | - const currentButtonIndex = chartEditStore.fetchTargetIndex(currentButtonId) | ||
49 | - chartEditStore.componentList[targetIndex].status.hide = false | ||
50 | - chartEditStore.componentList[currentIndex].status.hide = true | ||
51 | - chartEditStore.componentList[targetButtonIndex].status.hide = false | ||
52 | - chartEditStore.componentList[currentButtonIndex].status.hide = true | 39 | + //优化循环性能 |
40 | + for (let i = 0, len = chartEditStore.componentList.length; i < len; i++) { | ||
41 | + const compId = chartEditStore.componentList[i].id | ||
42 | + const compItem = chartEditStore.componentList[i] | ||
43 | + if (selectCurrentItems.includes(compId)) { | ||
44 | + compItem.status.hide = true | ||
45 | + } | ||
46 | + if (selectTargetItems.includes(compId)) { | ||
47 | + compItem.status.hide = false | ||
48 | + } | ||
49 | + } | ||
53 | } finally { | 50 | } finally { |
54 | console.log() | 51 | console.log() |
55 | } | 52 | } |
@@ -6,25 +6,20 @@ import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum' | @@ -6,25 +6,20 @@ import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum' | ||
6 | import { interactActions, ComponentInteractEventEnum } from './interact' | 6 | import { interactActions, ComponentInteractEventEnum } from './interact' |
7 | import { ButtonConfig } from './index' | 7 | import { ButtonConfig } from './index' |
8 | 8 | ||
9 | + | ||
9 | export const option = { | 10 | export const option = { |
10 | // 时间组件展示类型,必须和 interactActions 中定义的数据一致 | 11 | // 时间组件展示类型,必须和 interactActions 中定义的数据一致 |
11 | [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATA, | 12 | [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATA, |
12 | // 暴露配置内容给用户 | 13 | // 暴露配置内容给用户 |
13 | - dataset: [ | ||
14 | - { | ||
15 | - label: '', | ||
16 | - current: '', | ||
17 | - target: '', | ||
18 | - currentButton: '', | ||
19 | - targetButton: '' | ||
20 | - } | ||
21 | - ], | 14 | + dataset: '第1页', |
22 | buttonType: 'primary', | 15 | buttonType: 'primary', |
23 | buttonGhost: false, | 16 | buttonGhost: false, |
24 | buttonDashed: false, | 17 | buttonDashed: false, |
25 | buttonColor: '', | 18 | buttonColor: '', |
26 | buttonTextColor: 'white', | 19 | buttonTextColor: 'white', |
27 | buttonTextSize: '16', | 20 | buttonTextSize: '16', |
21 | + selectCurrentItems: [], | ||
22 | + selectTargetItems: [] | ||
28 | } | 23 | } |
29 | 24 | ||
30 | export default class Config extends PublicConfigClass implements CreateComponentType { | 25 | export default class Config extends PublicConfigClass implements CreateComponentType { |
@@ -40,27 +40,41 @@ | @@ -40,27 +40,41 @@ | ||
40 | <span class="help-span">{{ threeFileHelpMessgae }}</span> | 40 | <span class="help-span">{{ threeFileHelpMessgae }}</span> |
41 | </n-tooltip> | 41 | </n-tooltip> |
42 | </template> | 42 | </template> |
43 | - <setting-item v-for="(item, index) in optionData.dataset" :key="index"> | ||
44 | - <n-input v-model:value="item.label" size="small" placeholder="按钮文字"></n-input> | ||
45 | - <div style="height: 5px"></div> | ||
46 | - <n-input v-model:value="item.currentButton" size="small" placeholder="填写当前按钮id(事件里面)"></n-input> | ||
47 | - <div style="height: 5px"></div> | ||
48 | - <n-input v-model:value="item.targetButton" size="small" placeholder="填写目标按钮id(事件里面)"></n-input> | ||
49 | - <div style="height: 5px"></div> | ||
50 | - <n-input v-model:value="item.current" size="small" placeholder="填写当前页面id(事件里面)"></n-input> | ||
51 | - <div style="height: 5px"></div> | ||
52 | - <n-input v-model:value="item.target" size="small" placeholder="填写目标页面id(事件里面)"></n-input> | ||
53 | - <div style="height: 5px"></div> | 43 | + <setting-item name="按钮文字" :alone="true"> |
44 | + <n-input v-model:value="optionData.dataset" size="small" placeholder="按钮文字"></n-input> | ||
45 | + </setting-item> | ||
46 | + </setting-item-box> | ||
47 | + <setting-item-box name="当前项"> | ||
48 | + <setting-item name="当前项" :alone="true"> | ||
49 | + <n-select | ||
50 | + placeholder="请选择当前项" | ||
51 | + multiple | ||
52 | + size="small" | ||
53 | + v-model:value="optionData.selectCurrentItems" | ||
54 | + :options="selectCurrentItemOptions" | ||
55 | + /> | ||
56 | + </setting-item> | ||
57 | + </setting-item-box> | ||
58 | + <setting-item-box name="目标项"> | ||
59 | + <setting-item name="目标项" :alone="true"> | ||
60 | + <n-select | ||
61 | + placeholder="请选择目标项" | ||
62 | + multiple | ||
63 | + size="small" | ||
64 | + v-model:value="optionData.selectTargetItems" | ||
65 | + :options="selectTargetItemOptions" | ||
66 | + /> | ||
54 | </setting-item> | 67 | </setting-item> |
55 | </setting-item-box> | 68 | </setting-item-box> |
56 | </collapse-item> | 69 | </collapse-item> |
57 | </template> | 70 | </template> |
58 | 71 | ||
59 | <script lang="ts" setup> | 72 | <script lang="ts" setup> |
60 | -import { PropType, ref } from 'vue' | 73 | +import { PropType, ref, onMounted } from 'vue' |
61 | import { CollapseItem, SettingItemBox } from '@/components/Pages/ChartItemSetting' | 74 | import { CollapseItem, SettingItemBox } from '@/components/Pages/ChartItemSetting' |
62 | import { option } from './config' | 75 | import { option } from './config' |
63 | import { icon } from '@/plugins' | 76 | import { icon } from '@/plugins' |
77 | +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | ||
64 | 78 | ||
65 | defineProps({ | 79 | defineProps({ |
66 | optionData: { | 80 | optionData: { |
@@ -69,11 +83,11 @@ defineProps({ | @@ -69,11 +83,11 @@ defineProps({ | ||
69 | } | 83 | } |
70 | }) | 84 | }) |
71 | 85 | ||
86 | +const chartEditStore = useChartEditStore() | ||
87 | + | ||
72 | const { HelpOutlineIcon } = icon.ionicons5 | 88 | const { HelpOutlineIcon } = icon.ionicons5 |
73 | 89 | ||
74 | -const threeFileHelpMessgae = ref(` | ||
75 | -在事件里面复制对应组件id,填写你要跳转的目标,相当于一个按钮就绑定了一个页面(分组),然后跳转到另一个页面,其实就是点击当前页隐藏,目标页显示 | ||
76 | -`) | 90 | +const threeFileHelpMessgae = ref(`勾选当前项和跳转的目标项`) |
77 | 91 | ||
78 | const buttonTypeOptions = [ | 92 | const buttonTypeOptions = [ |
79 | { | 93 | { |
@@ -105,6 +119,19 @@ const buttonTypeOptions = [ | @@ -105,6 +119,19 @@ const buttonTypeOptions = [ | ||
105 | value: 'error' | 119 | value: 'error' |
106 | } | 120 | } |
107 | ] | 121 | ] |
122 | + | ||
123 | +const selectCurrentItemOptions = ref<{ label: string; value: string }[]>([]) | ||
124 | + | ||
125 | +const selectTargetItemOptions = ref<{ label: string; value: string }[]>([]) | ||
126 | + | ||
127 | +onMounted(() => { | ||
128 | + const componentList = chartEditStore.componentList.map(item => ({ | ||
129 | + label: item.chartConfig?.title, | ||
130 | + value: item.id | ||
131 | + })) | ||
132 | + selectCurrentItemOptions.value = componentList | ||
133 | + selectTargetItemOptions.value = componentList | ||
134 | +}) | ||
108 | </script> | 135 | </script> |
109 | <style lang="scss" scoped> | 136 | <style lang="scss" scoped> |
110 | .help-span { | 137 | .help-span { |
@@ -5,9 +5,9 @@ | @@ -5,9 +5,9 @@ | ||
5 | :dashed="buttonDashed" | 5 | :dashed="buttonDashed" |
6 | :ghost="buttonGhost" | 6 | :ghost="buttonGhost" |
7 | :color="buttonColor" | 7 | :color="buttonColor" |
8 | - @click="onClick(option.value.dataset[0])" | 8 | + @click="onClick(option.value.dataset)" |
9 | > | 9 | > |
10 | - <span class="button-text-color">{{ option.value.dataset[0].label }}</span> | 10 | + <span class="button-text-color">{{ dataset }}</span> |
11 | </n-button> | 11 | </n-button> |
12 | </template> | 12 | </template> |
13 | 13 | ||
@@ -28,7 +28,7 @@ const props = defineProps({ | @@ -28,7 +28,7 @@ const props = defineProps({ | ||
28 | }) | 28 | }) |
29 | 29 | ||
30 | const { w, h } = toRefs(props.chartConfig.attr) | 30 | const { w, h } = toRefs(props.chartConfig.attr) |
31 | -const { buttonType, buttonDashed, buttonGhost, buttonColor, buttonTextColor, buttonTextSize } = toRefs( | 31 | +const { buttonType, buttonDashed, buttonGhost, buttonColor, buttonTextColor, buttonTextSize, dataset } = toRefs( |
32 | props.chartConfig.option | 32 | props.chartConfig.option |
33 | ) | 33 | ) |
34 | const option = shallowReactive({ | 34 | const option = shallowReactive({ |
@@ -39,13 +39,13 @@ const onClick = (v: any) => { | @@ -39,13 +39,13 @@ const onClick = (v: any) => { | ||
39 | useChartInteract( | 39 | useChartInteract( |
40 | props.chartConfig, | 40 | props.chartConfig, |
41 | useChartEditStore, | 41 | useChartEditStore, |
42 | - { [ComponentInteractParamsEnum.DATA]: v?.current }, | ||
43 | - InteractEventOn.CHANGE, | 42 | + { [ComponentInteractParamsEnum.DATA]: v }, |
43 | + InteractEventOn.CHANGE | ||
44 | ) | 44 | ) |
45 | } | 45 | } |
46 | 46 | ||
47 | onMounted(() => { | 47 | onMounted(() => { |
48 | - onClick(option.value.dataset[0]) | 48 | + onClick(option.value.dataset) |
49 | }) | 49 | }) |
50 | 50 | ||
51 | // 手动更新 | 51 | // 手动更新 |