Blame view

Yi.Vben5.Vue3/packages/effects/hooks/src/use-watermark.ts 1.8 KB
515fceeb   “wangming”   框架初始化
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
73
74
75
76
77
78
79
80
81
82
83
84
  import type { Watermark, WatermarkOptions } from 'watermark-js-plus';
  
  import { nextTick, onUnmounted, readonly, ref } from 'vue';
  
  const watermark = ref<Watermark>();
  const unmountedHooked = ref<boolean>(false);
  const cachedOptions = ref<Partial<WatermarkOptions>>({
    advancedStyle: {
      colorStops: [
        {
          color: 'gray',
          offset: 0,
        },
        {
          color: 'gray',
          offset: 1,
        },
      ],
      type: 'linear',
    },
    // fontSize: '20px',
    content: '',
    contentType: 'multi-line-text',
    globalAlpha: 0.25,
    gridLayoutOptions: {
      cols: 2,
      gap: [20, 20],
      matrix: [
        [1, 0],
        [0, 1],
      ],
      rows: 2,
    },
    height: 200,
    layout: 'grid',
    rotate: 30,
    width: 160,
  });
  
  export function useWatermark() {
    async function initWatermark(options: Partial<WatermarkOptions>) {
      const { Watermark } = await import('watermark-js-plus');
  
      cachedOptions.value = {
        ...cachedOptions.value,
        ...options,
      };
      watermark.value = new Watermark(cachedOptions.value);
      await watermark.value?.create();
    }
  
    async function updateWatermark(options: Partial<WatermarkOptions>) {
      if (watermark.value) {
        await nextTick();
        await watermark.value?.changeOptions({
          ...cachedOptions.value,
          ...options,
        });
      } else {
        await initWatermark(options);
      }
    }
  
    function destroyWatermark() {
      if (watermark.value) {
        watermark.value.destroy();
        watermark.value = undefined;
      }
    }
  
    // 只在第一次调用时注册卸载钩子,防止重复注册以致于在路由切换时销毁了水印
    if (!unmountedHooked.value) {
      unmountedHooked.value = true;
      onUnmounted(() => {
        destroyWatermark();
      });
    }
  
    return {
      destroyWatermark,
      updateWatermark,
      watermark: readonly(watermark),
    };
  }