index.vue
2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<script lang="ts" setup>
  import { ComponentPropsConfigType } from '/@/views/visual/packages/index.type';
  import { option } from './config';
  import { useComponentScale } from '/@/views/visual/packages/hook/useComponentScale';
  import { computed } from 'vue';
  import { ref } from 'vue';
  import { DeviceName } from '/@/views/visual/commonComponents/DeviceName';
  import { useDataFetch } from '../../../hook/socket/useSocket';
  import { DataFetchUpdateFn } from '../../../hook/socket/useSocket.type';
  const props = defineProps<{
    config: ComponentPropsConfigType<typeof option>;
  }>();
  const currentValue = ref<string | number>(123);
  const getDesign = computed(() => {
    const { persetOption = {}, option } = props.config;
    const {
      fontColor: persetFontColor,
      fontSize: persetFontSize,
      valueSize: persetValueSize,
    } = persetOption;
    const { componentInfo, attribute, attributeRename, attributeName } = option;
    const { fontColor, fontSize, valueSize } = componentInfo || {};
    return {
      fontColor: fontColor || persetFontColor,
      fontSize: fontSize || persetFontSize || 14,
      valueSize: valueSize || persetValueSize || 20,
      attribute: attributeRename || attributeName || attribute,
    };
  });
  const updateFn: DataFetchUpdateFn = (message, attribute) => {
    const { data = {} } = message;
    const [latest] = data[attribute] || [];
    if (!latest.length) return;
    const [_, value] = latest;
    currentValue.value = value;
  };
  useDataFetch(props, updateFn);
  const { getScale, getRatio } = useComponentScale(props);
</script>
<template>
  <main :style="getScale" class="w-full h-full flex flex-col justify-center items-center">
    <DeviceName :config="config" />
    <h1
      class="my-4 font-bold !my-2 truncate"
      :style="{
        color: getDesign.fontColor,
        fontSize: (getRatio ? getRatio * getDesign.valueSize : getDesign.valueSize) + 'px',
      }"
    >
      {{ currentValue || 0 }}
    </h1>
    <div
      class="text-gray-500 truncate"
      :style="{ fontSize: (getRatio ? getRatio * getDesign.fontSize : getDesign.fontSize) + 'px' }"
      >{{ getDesign.attribute || '温度' }}</div
    >
    <!-- <div v-if="config.option.componentInfo.showDeviceName">
      {{ config.option.deviceRename || config.option.deviceName }}
    </div> -->
  </main>
</template>