@shijiu/jsview-vue 2.1.25 → 2.1.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/utils/JsViewEngineWidget/JsvFocusBlock.vue +1 -1
- package/utils/JsViewEngineWidget/JsvFocusHub.ts +123 -0
- package/utils/JsViewEngineWidget/JsvFocusManager.js +4 -3
- package/utils/JsViewEngineWidget/MetroWidget/AnimationManager.ts +145 -51
- package/utils/JsViewEngineWidget/MetroWidget/ListWidget.vue +51 -64
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +62 -71
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +308 -613
- package/utils/JsViewEngineWidget/TemplateParser/CommonMetroTemplate.ts +127 -247
- package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +1 -0
- package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +36 -2
- package/utils/JsViewEngineWidget/WidgetCommon.ts +25 -6
- package/utils/JsViewPlugin/JsvAudio/{JsvAudioBrowser.vue → BrowserAudio/BrowserAudio.vue} +1 -1
- package/utils/JsViewPlugin/JsvAudio/index.js +1 -1
- package/utils/JsViewPlugin/JsvLatex/BrowserDomBuilder.js +37 -0
- package/utils/JsViewPlugin/JsvLatex/Color.ts +43 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatex.vue +159 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatexBridgeProxy.js +16 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatexBrowser.vue +59 -0
- package/utils/JsViewPlugin/JsvLatex/PluginLoader.js +171 -0
- package/utils/JsViewPlugin/JsvLatex/index.js +28 -0
- package/utils/JsViewPlugin/JsvLatex/mathjax-tex-svg.txt +1 -0
- package/utils/JsViewPlugin/JsvLatex/version.js +24 -0
- package/utils/JsViewPlugin/JsvLatex/version.mjs +24 -0
- package/utils/JsViewPlugin/index.js +2 -1
- package/utils/JsViewVueTools/JsvDynamicCssStyle.js +2 -52
- package/utils/JsViewVueTools/JsvPerformance.ts +11 -0
- package/utils/JsViewVueTools/JsvPreDownloader.ts +55 -11
- package/utils/JsViewVueTools/JsvStyleSheetsDeclarer.js +40 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CanvasTexture.ts +143 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CommandList.ts +24 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/Path.ts +198 -0
- package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +31 -0
- package/utils/JsViewVueTools/JsvTextureStore/Store.ts +32 -0
- package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +38 -0
- package/utils/JsViewVueTools/index.js +3 -0
- package/utils/JsViewVueWidget/JsvEnableRenderBreak.vue +17 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +144 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/{CallbackManager.js → CallbackManager.ts} +19 -10
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +45 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +1 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/JsvEnvBlocker.vue +124 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/KeepFlags.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +553 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +138 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +53 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +11 -1
- package/utils/JsViewVueWidget/JsvHole.js +1 -1
- package/utils/JsViewVueWidget/JsvLine/JsvLine.vue +101 -0
- package/utils/JsViewVueWidget/JsvLine/LineManager.js +62 -0
- package/utils/JsViewVueWidget/JsvLine/index.js +3 -0
- package/utils/JsViewVueWidget/JsvMarquee.vue +316 -139
- package/utils/JsViewVueWidget/JsvMindMap/CommonType.ts +1 -0
- package/utils/JsViewVueWidget/JsvMindMap/Constant.ts +20 -0
- package/utils/JsViewVueWidget/JsvMindMap/DataTree.ts +394 -0
- package/utils/JsViewVueWidget/JsvMindMap/Geometry.ts +277 -0
- package/utils/JsViewVueWidget/JsvMindMap/JsvMindMap.vue +653 -0
- package/utils/JsViewVueWidget/JsvMindMap/index.js +1 -0
- package/utils/JsViewVueWidget/JsvMindMap/rtree.js +628 -0
- package/utils/JsViewVueWidget/JsvNinePatch.vue +2 -2
- package/utils/JsViewVueWidget/JsvPieChart.vue +124 -0
- package/utils/JsViewVueWidget/JsvPosterImage.vue +32 -9
- package/utils/JsViewVueWidget/JsvPreload/BrowserPreload.vue +135 -133
- package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +273 -270
- package/utils/JsViewVueWidget/JsvSector.vue +107 -0
- package/utils/JsViewVueWidget/JsvTextBox.vue +14 -1
- package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +28 -2
- package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +122 -93
- package/utils/JsViewVueWidget/index.js +15 -7
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.js +0 -112
- package/utils/JsViewVueWidget/JsvFreeMoveActor/CommonTools.js +0 -18
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.js +0 -216
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.js +0 -66
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.js +0 -38
- package/utils/JsViewVueWidget/JsvFreeMoveActor/TypeDefine.js +0 -12
- package/utils/JsViewVueWidget/JsvTouchContainer.vue +0 -183
- package/utils/JsViewVueWidget/JsvTransparentDiv.vue +0 -87
- /package/utils/{JsViewVueWidget → JsViewPlugin/JsvAudio/BrowserAudio}/JsvSystemAudio.vue +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* 【模块 export 内容】
|
|
3
|
+
* JsvPieChart:Vue高阶组件,饼图。
|
|
4
|
+
* props说明:
|
|
5
|
+
* centerPosition {Object} 圆心坐标,属性:{x,y}
|
|
6
|
+
* radius {Number} 半径
|
|
7
|
+
* animationTime {Number} 动画变化时间,单位 /秒
|
|
8
|
+
* data {Array} 数组对象,包含百分比和颜色。例如:[{color:'#FFFFFF',percent:20}]
|
|
9
|
+
* 说明:传入的数组要为响应式,且保证所有项的percent都是大于0并且相加等于100
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
<template>
|
|
13
|
+
<div v-for="(item, index) in finalData.slice().reverse()">
|
|
14
|
+
<JsvSector
|
|
15
|
+
:radius="props.radius"
|
|
16
|
+
:config="{
|
|
17
|
+
startAngle: Number(item.startAngle),
|
|
18
|
+
sweepAngle: Number(item.sweepAngle) + 1,
|
|
19
|
+
color: item.color,
|
|
20
|
+
}"
|
|
21
|
+
:id="`indexZ${index}`"
|
|
22
|
+
:animationTime="props.animationTime"
|
|
23
|
+
:centerPosition="props.centerPosition"
|
|
24
|
+
:extraTime="item.extraTime"
|
|
25
|
+
></JsvSector>
|
|
26
|
+
</div>
|
|
27
|
+
</template>
|
|
28
|
+
|
|
29
|
+
<script setup>
|
|
30
|
+
import { watch, reactive, nextTick } from "vue";
|
|
31
|
+
import { JsvSector } from "jsview";
|
|
32
|
+
const props = defineProps({
|
|
33
|
+
centerPosition: { type: Object, required: true },
|
|
34
|
+
data: { type: Array, required: true },
|
|
35
|
+
radius: { type: Number, required: true },
|
|
36
|
+
animationTime: { type: Number, default: 1 },
|
|
37
|
+
});
|
|
38
|
+
let myData = props.data;
|
|
39
|
+
//比较百分比数组
|
|
40
|
+
let previousPercent = [];
|
|
41
|
+
//额外时间数组
|
|
42
|
+
let extraTimeArray = [];
|
|
43
|
+
myData.forEach((item, index) => {
|
|
44
|
+
previousPercent.push(item.percent);
|
|
45
|
+
extraTimeArray.push(0);
|
|
46
|
+
});
|
|
47
|
+
//验证数据
|
|
48
|
+
const CheckData = (data) => {
|
|
49
|
+
let totalPercent = 0;
|
|
50
|
+
data.forEach((item) => {
|
|
51
|
+
if (!item.hasOwnProperty("percent")) {
|
|
52
|
+
throw new Error("每一项必须包含percent属性");
|
|
53
|
+
}
|
|
54
|
+
if (item.percent <= 0 || item.percent > 100) {
|
|
55
|
+
throw new Error("每一项percent必须大于0或者小于等于100!");
|
|
56
|
+
}
|
|
57
|
+
totalPercent += item.percent;
|
|
58
|
+
});
|
|
59
|
+
if (totalPercent < 99 || totalPercent > 101) {
|
|
60
|
+
throw new Error("percent属性值总和必须等于100!");
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
CheckData(props.data);
|
|
65
|
+
//过滤数据
|
|
66
|
+
let finalData = reactive([]);
|
|
67
|
+
const filterData = (data) => {
|
|
68
|
+
data.forEach((item, index) => {
|
|
69
|
+
if (item.percent > previousPercent[index]) {
|
|
70
|
+
extraTimeArray[index] = -0.1;
|
|
71
|
+
} else if (item.percent < previousPercent[index]) {
|
|
72
|
+
extraTimeArray[index] = 0.1;
|
|
73
|
+
} else {
|
|
74
|
+
extraTimeArray[index] = 0;
|
|
75
|
+
}
|
|
76
|
+
item.angle = ((item.percent / 100) * 360).toFixed(2);
|
|
77
|
+
if (index == 0) {
|
|
78
|
+
finalData.push({
|
|
79
|
+
startAngle: Number(0).toFixed(2),
|
|
80
|
+
sweepAngle: Number((item.percent / 100) * 360).toFixed(2),
|
|
81
|
+
color: item.color,
|
|
82
|
+
index: index,
|
|
83
|
+
extraTime: extraTimeArray[0],
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
finalData.push({
|
|
87
|
+
startAngle: (
|
|
88
|
+
Number(finalData[index - 1].startAngle) +
|
|
89
|
+
Number(finalData[index - 1].sweepAngle)
|
|
90
|
+
).toFixed(2),
|
|
91
|
+
sweepAngle: Number(item.angle).toFixed(2),
|
|
92
|
+
color: item.color,
|
|
93
|
+
index: index,
|
|
94
|
+
extraTime: extraTimeArray[index],
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
filterData(myData);
|
|
100
|
+
watch(
|
|
101
|
+
props.data,
|
|
102
|
+
(n, o) => {
|
|
103
|
+
if (CheckData(n)) {
|
|
104
|
+
finalData.splice(0, finalData.length);
|
|
105
|
+
filterData(n);
|
|
106
|
+
myData = n;
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{ deep: true }
|
|
110
|
+
);
|
|
111
|
+
watch(myData, (n, o) => {
|
|
112
|
+
previousPercent = [];
|
|
113
|
+
extraTimeArray = [];
|
|
114
|
+
myData.forEach((item, index) => {
|
|
115
|
+
previousPercent.push(item.percent);
|
|
116
|
+
extraTimeArray.push(0);
|
|
117
|
+
});
|
|
118
|
+
n.forEach((item, index) => {
|
|
119
|
+
previousPercent.push(item.percent);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<style lang="scss" scoped></style>
|
|
@@ -9,30 +9,50 @@
|
|
|
9
9
|
|
|
10
10
|
<script setup>
|
|
11
11
|
import { reactive, watchEffect, computed } from "vue";
|
|
12
|
+
import { JsvPerformance } from "../JsViewVueTools/JsvPerformance.ts";
|
|
12
13
|
|
|
13
14
|
const props = defineProps({
|
|
14
15
|
colorSpace: {
|
|
15
16
|
type: String,
|
|
16
|
-
default: "RGBA_8888"
|
|
17
|
-
imageCompress: {
|
|
18
|
-
type: Boolean,
|
|
19
|
-
default: true,
|
|
20
|
-
},
|
|
17
|
+
default: "RGBA_8888"
|
|
21
18
|
},
|
|
22
|
-
|
|
19
|
+
imageCompress: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: true
|
|
22
|
+
},
|
|
23
|
+
isPosterImage: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: true
|
|
26
|
+
},
|
|
27
|
+
fadeIn: {
|
|
28
|
+
type: Boolean,
|
|
29
|
+
default: true
|
|
30
|
+
},
|
|
31
|
+
src: {
|
|
32
|
+
type: String,
|
|
33
|
+
default: null
|
|
34
|
+
},
|
|
35
|
+
style: Object
|
|
23
36
|
});
|
|
24
37
|
|
|
25
38
|
const scaleddown = computed(() => {
|
|
26
39
|
return props.imageCompress ? "true" : "false";
|
|
27
40
|
});
|
|
28
41
|
|
|
42
|
+
const isPosterImage = computed(() => {
|
|
43
|
+
return JsvPerformance.getPosterSingleThreadDecode() || props.isPosterImage ? "true" : "false";
|
|
44
|
+
});
|
|
45
|
+
|
|
29
46
|
let common_style = reactive({});
|
|
30
47
|
let image_style = reactive({});
|
|
48
|
+
let show_background_holder = !!window.JsView; // PC浏览器模拟时, 不显示占位图,避免误导
|
|
31
49
|
|
|
32
50
|
watchEffect(() => {
|
|
33
51
|
if (props.style) {
|
|
34
|
-
|
|
52
|
+
// 提取left, top, width, height, 并去掉干扰项 backgroundImage backgroundColor(会引起同位置重复图片绘制)
|
|
53
|
+
let { left, top, width, height, backgroundImage, backgroundColor, ...others } = props.style;
|
|
35
54
|
|
|
55
|
+
// 承接x,y偏移和动画设置, 规避默认淡出动画被影响
|
|
36
56
|
common_style.left = left;
|
|
37
57
|
common_style.top = top;
|
|
38
58
|
|
|
@@ -45,13 +65,16 @@ watchEffect(() => {
|
|
|
45
65
|
|
|
46
66
|
<template>
|
|
47
67
|
<div :style="common_style">
|
|
48
|
-
<slot></slot>
|
|
68
|
+
<slot v-if="show_background_holder"></slot>
|
|
49
69
|
<img
|
|
50
|
-
|
|
70
|
+
v-if="!!props.src"
|
|
71
|
+
:data-jsv-vw-enable-fade="props.fadeIn"
|
|
51
72
|
data-jsv-vw-mask-poster-on-top="true"
|
|
52
73
|
:data-jsv-img-scaledown-tex="scaleddown"
|
|
53
74
|
:data-jsv-img-color-space="colorSpace"
|
|
75
|
+
:data-jsv-img-poster-image="isPosterImage"
|
|
54
76
|
:style="image_style"
|
|
77
|
+
:src="props.src"
|
|
55
78
|
v-bind="$attrs"
|
|
56
79
|
/>
|
|
57
80
|
</div>
|
|
@@ -1,146 +1,147 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import {
|
|
1
|
+
<script setup>
|
|
2
|
+
import { reactive, watchEffect, onBeforeUnmount } from "vue";
|
|
3
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
|
-
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
preloadList: Array,
|
|
6
|
+
downloadList: Array,
|
|
7
|
+
onPreloadDone: Function, // 预加载完成回调
|
|
8
|
+
onDownloadDone: Function, // 预下载完成回调
|
|
9
|
+
onPreloading: Function,
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
const loadViewList = reactive({
|
|
13
|
+
preloadViewList: [],
|
|
14
|
+
downloadViewList: []
|
|
15
|
+
})
|
|
16
|
+
// 记录传入的preload为null的数量,由于vue不支持在子组件修改props值,所有在删除值为null时,需要++,这样才能保证与传入数据的length相等从而触发回调
|
|
17
|
+
let preloadIsNullNum = 0;
|
|
18
|
+
let downloadIsNullNum = 0;
|
|
19
|
+
|
|
20
|
+
let preloadResultMap = {}
|
|
21
|
+
let downloadResultMap = {}
|
|
22
|
+
let downloadUrlList = []
|
|
23
|
+
let unmountStatus = { unmount: false }
|
|
24
|
+
let preloadStateList = null;
|
|
25
|
+
let downloadStateList = null;
|
|
26
|
+
|
|
27
|
+
const getPreloadList = () => {
|
|
28
|
+
preloadStateList = new Array(props.preloadList.length).fill(false);
|
|
29
|
+
let preloadListData = props.preloadList;
|
|
30
|
+
for (let i = 0; i < preloadListData.length; i++) {
|
|
31
|
+
if (!preloadListData[i] || !preloadListData[i].url) {
|
|
32
|
+
preloadListData.splice(i, 1);
|
|
33
|
+
preloadIsNullNum++;
|
|
34
|
+
i--;
|
|
29
35
|
}
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
}
|
|
37
|
+
loadViewList.preloadViewList = preloadListData.map((item, index) => {
|
|
38
|
+
if (!item || !item.url) {
|
|
39
|
+
preloadStateList[index] = true;
|
|
40
|
+
return null;
|
|
32
41
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
()
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const image = new Image();
|
|
43
|
+
const unmount_track = unmountStatus;
|
|
44
|
+
image.onload = () => {
|
|
45
|
+
if (unmount_track.unmount) {
|
|
46
|
+
// 子组件已经卸载不再回调
|
|
47
|
+
return;
|
|
39
48
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
let preloadListData = this.preloadList;
|
|
54
|
-
for (let i = 0; i < preloadListData.length; i++) {
|
|
55
|
-
if (!preloadListData[i]) {
|
|
56
|
-
this.preloadStateList[i] = true;
|
|
57
|
-
// this.preloadIsNullNum++;
|
|
58
|
-
}
|
|
49
|
+
|
|
50
|
+
preloadResultMap[item.url] = {
|
|
51
|
+
width: image.width,
|
|
52
|
+
height: image.height,
|
|
53
|
+
};
|
|
54
|
+
preloadStateList[index] = true;
|
|
55
|
+
let loadedNum = 0;
|
|
56
|
+
preloadStateList.map((item) => {
|
|
57
|
+
loadedNum += item ? 1 : 0;
|
|
58
|
+
});
|
|
59
|
+
props.onPreloading?.(loadedNum / preloadStateList.length);
|
|
60
|
+
if (props.onPreloadDone && loadedNum + preloadIsNullNum == preloadStateList.length) {
|
|
61
|
+
props.onPreloadDone?.(preloadResultMap);
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
const image = new Image();
|
|
66
|
-
const unmount_track = this.unmountStatus;
|
|
67
|
-
image.onload = () => {
|
|
68
|
-
if (unmount_track.unmount) {
|
|
69
|
-
// 子组件已经卸载不再回调
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
63
|
+
};
|
|
64
|
+
image.src = item.url;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
72
67
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
const getDownloadList = () => {
|
|
69
|
+
downloadStateList = new Array(props.downloadList.length).fill(false);
|
|
70
|
+
downloadUrlList = new Array(downloadStateList.length);
|
|
71
|
+
let downloadListData = props.downloadList;
|
|
72
|
+
for (let i = 0; i < downloadListData.length; i++) {
|
|
73
|
+
if (!downloadListData[i] || !downloadListData[i].url) {
|
|
74
|
+
downloadListData.splice(i, 1);
|
|
75
|
+
downloadUrlList[i] = "invalid";
|
|
76
|
+
downloadIsNullNum++;
|
|
77
|
+
i--;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
loadViewList.downloadViewList = downloadListData.map((item, index) => {
|
|
81
|
+
if (!item || !item.url) {
|
|
82
|
+
downloadStateList[index] = true;
|
|
83
|
+
downloadUrlList[index] = "invalid";
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const image = new Image();
|
|
87
|
+
const unmount_track = unmountStatus;
|
|
88
|
+
image.onload = () => {
|
|
89
|
+
if (unmount_track.unmount) {
|
|
90
|
+
// 子组件已经卸载不再回调
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
83
93
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
image.
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
downloadStateList[index] = true;
|
|
95
|
+
downloadUrlList[index] = item.url;
|
|
96
|
+
downloadResultMap[item.url] = {
|
|
97
|
+
width: image.width,
|
|
98
|
+
height: image.height,
|
|
99
|
+
};
|
|
100
|
+
console.log(`pre download succeed ${item.url}`);
|
|
101
|
+
if (props.onDownloadDone) {
|
|
102
|
+
let downloadNum = 0;
|
|
103
|
+
downloadStateList.map((item) => {
|
|
104
|
+
downloadNum += item ? 1 : 0;
|
|
105
|
+
});
|
|
106
|
+
if (downloadNum + downloadIsNullNum == downloadStateList.length) {
|
|
107
|
+
props.onDownloadDone?.(
|
|
108
|
+
downloadUrlList,
|
|
109
|
+
downloadResultMap
|
|
110
|
+
);
|
|
100
111
|
}
|
|
101
112
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
const image = new Image();
|
|
109
|
-
const unmount_track = this.unmountStatus;
|
|
110
|
-
image.onload = () => {
|
|
111
|
-
if (unmount_track.unmount) {
|
|
112
|
-
// 子组件已经卸载不再回调
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
113
|
+
};
|
|
114
|
+
image.src = item.url;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
115
117
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
};
|
|
118
|
+
if (props.preloadList) {
|
|
119
|
+
getPreloadList();
|
|
120
|
+
}
|
|
121
|
+
if (props.downloadList) {
|
|
122
|
+
getDownloadList();
|
|
123
|
+
}
|
|
124
|
+
watchEffect(() => {
|
|
125
|
+
if (props.preloadList) {
|
|
126
|
+
console.log("JsvPreload: update preloadList");
|
|
127
|
+
preloadIsNullNum = 0
|
|
128
|
+
preloadResultMap = {};
|
|
129
|
+
getPreloadList();
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
watchEffect(() => {
|
|
133
|
+
if (props.downloadList) {
|
|
134
|
+
console.log("JsvPreload: update downloadList");
|
|
135
|
+
downloadIsNullNum = 0;
|
|
136
|
+
downloadResultMap = {};
|
|
137
|
+
downloadUrlList = [];
|
|
138
|
+
getDownloadList();
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
onBeforeUnmount(() => {
|
|
143
|
+
unmountStatus.unmount = true;
|
|
144
|
+
})
|
|
144
145
|
</script>
|
|
145
146
|
|
|
146
147
|
<template>
|
|
@@ -148,3 +149,4 @@ export default {
|
|
|
148
149
|
<div v-if="!preloadList"></div>
|
|
149
150
|
</template>
|
|
150
151
|
|
|
152
|
+
|