diff --git a/build/optimize.ts b/build/optimize.ts
index 89d049c59..d7c2a696d 100644
--- a/build/optimize.ts
+++ b/build/optimize.ts
@@ -36,6 +36,7 @@ const include = [
"element-resize-detector",
"@amap/amap-jsapi-loader",
"el-table-infinite-scroll",
+ "vue-waterfall-plugin-next",
"@wangeditor/editor-for-vue",
"vuedraggable/src/vuedraggable"
];
diff --git a/locales/en.yaml b/locales/en.yaml
index 213450135..3035c784a 100644
--- a/locales/en.yaml
+++ b/locales/en.yaml
@@ -39,6 +39,7 @@ menus:
hsdialog: Dialog Components
hsmessage: Message Tips Components
hsvideo: Video Components
+ hswaterfall: Waterfall Components
hsmap: Map Components
hsdraggable: Draggable Components
hssplitPane: Split Pane
diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml
index 30fa6d9bc..9f52c29c1 100644
--- a/locales/zh-CN.yaml
+++ b/locales/zh-CN.yaml
@@ -39,6 +39,7 @@ menus:
hsdialog: 函数式弹框组件
hsmessage: 消息提示组件
hsvideo: 视频组件
+ hswaterfall: 瀑布流组件
hsmap: 地图组件
hsdraggable: 拖拽组件
hssplitPane: 切割面板
diff --git a/package.json b/package.json
index 0f47fabe5..a20e88757 100644
--- a/package.json
+++ b/package.json
@@ -72,6 +72,7 @@
"vue-router": "^4.2.0",
"vue-types": "^5.0.2",
"vue-virtual-scroller": "2.0.0-beta.7",
+ "vue-waterfall-plugin-next": "^2.2.1",
"vue3-danmaku": "1.4.0-beta.1",
"vuedraggable": "^4.1.0",
"xgplayer": "^3.0.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7cb72a87d..1d695a0bd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -108,6 +108,7 @@ specifiers:
vue-tsc: ^1.6.5
vue-types: ^5.0.2
vue-virtual-scroller: 2.0.0-beta.7
+ vue-waterfall-plugin-next: ^2.2.1
vue3-danmaku: 1.4.0-beta.1
vuedraggable: ^4.1.0
xgplayer: ^3.0.2
@@ -157,6 +158,7 @@ dependencies:
vue-router: 4.2.0_vue@3.3.2
vue-types: 5.0.2_vue@3.3.2
vue-virtual-scroller: 2.0.0-beta.7_vue@3.3.2
+ vue-waterfall-plugin-next: 2.2.1_vue@3.3.2
vue3-danmaku: 1.4.0-beta.1_vue@3.3.2
vuedraggable: 4.1.0_vue@3.3.2
xgplayer: 3.0.2
@@ -11966,6 +11968,33 @@ packages:
vue-resize: 2.0.0-alpha.1_vue@3.3.2
dev: false
+ /vue-waterfall-plugin-next/2.2.0_vue@3.3.2:
+ resolution:
+ {
+ integrity: sha512-rhrTdAlBnMWWt6737L+E08A7itgK3wHTy1NsSDgR9EPiBPuHYlth8jL2/hp2gIMAS4XUxJBtitfNUyK5qynkEA==
+ }
+ dependencies:
+ animate.css: 4.1.1
+ element-plus: 2.3.4_vue@3.3.2
+ transitivePeerDependencies:
+ - "@vue/composition-api"
+ - vue
+ dev: false
+
+ /vue-waterfall-plugin-next/2.2.1_vue@3.3.2:
+ resolution:
+ {
+ integrity: sha512-wEPT9D9VLTPWxGKrIusBxj9JVyXyXU6RLEqKIm3mJt/DeaTUvKu0sZjLOKK9UztkcJV2LaRALwRoCDOOKbLsiw==
+ }
+ dependencies:
+ animate.css: 4.1.1
+ element-plus: 2.3.4_vue@3.3.2
+ vue-waterfall-plugin-next: 2.2.0_vue@3.3.2
+ transitivePeerDependencies:
+ - "@vue/composition-api"
+ - vue
+ dev: false
+
/vue/3.3.2:
resolution:
{
diff --git a/src/router/modules/components.ts b/src/router/modules/components.ts
index 4ce9a4a7a..5fb555b92 100644
--- a/src/router/modules/components.ts
+++ b/src/router/modules/components.ts
@@ -31,6 +31,15 @@ export default {
title: $t("menus.hsmessage")
}
},
+ {
+ path: "/components/waterfall",
+ name: "Waterfall",
+ component: () => import("@/views/components/waterfall/index.vue"),
+ meta: {
+ title: $t("menus.hswaterfall"),
+ extraIcon: "IF-pure-iconfont-new svg"
+ }
+ },
{
path: "/components/video",
name: "Video",
diff --git a/src/views/components/waterfall/api.ts b/src/views/components/waterfall/api.ts
new file mode 100644
index 000000000..7e3439ce1
--- /dev/null
+++ b/src/views/components/waterfall/api.ts
@@ -0,0 +1,38 @@
+export function randomID(length = 6) {
+ return Number(
+ Math.random().toString().substr(3, length) + Date.now()
+ ).toString(36);
+}
+
+const COLORS = ["#409EFF", "#67C23A", "#E6A23C", "#F56C6C", "#909399"];
+
+function getRandomNum(min: number, max: number) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+}
+
+function randomColor() {
+ return COLORS[getRandomNum(0, 4)];
+}
+
+const website = "https://www.getphotoblanket.com";
+
+export const getList = ({ page = 1, pageSize = 20 }) => {
+ const url = `${website}/products.json?page=${page}&limit=${pageSize}`;
+ return fetch(url)
+ .then(res => res.json())
+ .then(res => res.products)
+ .then(res => {
+ return res.map((item: any) => {
+ return {
+ id: randomID(),
+ star: false,
+ price: item.variants[0].price,
+ src: {
+ original: item.images[0].src
+ },
+ backgroundColor: randomColor(),
+ name: item.title
+ };
+ });
+ });
+};
diff --git a/src/views/components/waterfall/error.png b/src/views/components/waterfall/error.png
new file mode 100644
index 000000000..aabee2d57
Binary files /dev/null and b/src/views/components/waterfall/error.png differ
diff --git a/src/views/components/waterfall/index.vue b/src/views/components/waterfall/index.vue
new file mode 100644
index 000000000..577540fe2
--- /dev/null
+++ b/src/views/components/waterfall/index.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
$ {{ item.price }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/components/waterfall/loading.png b/src/views/components/waterfall/loading.png
new file mode 100644
index 000000000..8f9e6649c
Binary files /dev/null and b/src/views/components/waterfall/loading.png differ