diff --git a/devui/skeleton/__tests__/skeleton.spec.ts b/devui/skeleton/__tests__/skeleton.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e55e134a615f1d42ac9eefd35b07288a785f6ee0 --- /dev/null +++ b/devui/skeleton/__tests__/skeleton.spec.ts @@ -0,0 +1,81 @@ +import { mount } from '@vue/test-utils'; +import { ref } from 'vue'; +import DSkeleton from '../src/skeleton'; + +describe('skeleton 组件', () => { + it('render basic skeleton successfully', () => { + const row = ref(4); + const wrapper = mount({ + components: { DSkeleton }, + template: ``, + setup() { + return { + row + }; + }, + }); + + expect(wrapper.classes()).toContain('devui-skeleton') + expect(wrapper.classes()).toContain('devui-skeleton-animated') + expect(wrapper.element.childElementCount).toBe(1) + // 渲染个数应当与传入的 row 的数量相同 + expect(wrapper.element.children[0].childElementCount).toBe(4) + }) + + it('render skeleton without animate', () => { + const animate = ref(false); + const wrapper = mount({ + components: { DSkeleton }, + template: ``, + setup() { + return { + animate + }; + }, + }); + + expect(wrapper.classes()).toContain('devui-skeleton-no-animated') + }) + + it('render skeleton with avatar', () => { + const avatar = ref(true); + const wrapper = mount({ + components: { DSkeleton }, + template: ``, + setup() { + return { + avatar + }; + }, + }); + + expect(wrapper.element.childElementCount).toBe(2) + expect(wrapper.element.children[0].innerHTML).toBe('
') + }) + + it('hide skeleton and show real content', () => { + const row = ref(4); + const loading = ref(false); + const wrapper = mount({ + components: { DSkeleton }, + template: ` + +
+
content1
+
content2
+
content3
+
content4
+
+
`, + setup() { + return { + row, + loading + }; + }, + }); + + expect(wrapper.classes()).toContain('devui-skeleton') + expect(wrapper.element.children[0].innerHTML).toBe('
content1
content2
content3
content4
') + }) +}) \ No newline at end of file diff --git a/devui/skeleton/index.ts b/devui/skeleton/index.ts index 1e40f962128b694d836dcc4c61b4aa505a32ec10..e51762a5593d81295caf39af293f62d83c6154fd 100644 --- a/devui/skeleton/index.ts +++ b/devui/skeleton/index.ts @@ -10,7 +10,7 @@ export { Skeleton } export default { title: 'Skeleton 骨架屏', category: '数据展示', - status: undefined, // TODO: 组件若开发完成则填入"已完成",并删除该注释 + status: '已完成', install(app: App): void { app.use(Skeleton as any) diff --git a/devui/skeleton/src/skeleton.scss b/devui/skeleton/src/skeleton.scss index ab0fadc0641cdc3868c3eb0e82aca2cfe0a36d0e..74508318b30df6033d918fc501efae17dbced4e5 100644 --- a/devui/skeleton/src/skeleton.scss +++ b/devui/skeleton/src/skeleton.scss @@ -3,7 +3,9 @@ justify-content: space-between; .devui-skeleton__avatar { - display: none; + display: flex; + flex: 1; + justify-content: center; .avatar { width: 40px; @@ -13,12 +15,6 @@ } } - .is-shown { - flex: 1; - display: flex; - justify-content: center; - } - .devui-skeleton__item__group { flex: 7; @@ -42,14 +38,14 @@ .devui-skeleton-animated > .devui-skeleton__avatar > .avatar, .devui-skeleton-animated > .devui-skeleton__item__group > .devui-skeleton__item { - background-color: #cccccc; - // background: linear-gradient( - // 100deg, - // rgba(255, 255, 255, 0) 40%, - // rgba(255, 255, 255, 0.5) 50%, - // rgba(255, 255, 255, 0) 60% - // ) - // #ccc; + background: + linear-gradient( + 100deg, + rgba(255, 255, 255, 0) 40%, + rgba(255, 255, 255, 0.5) 50%, + rgba(255, 255, 255, 0) 60% + ) + #cccccc; background-size: 200% 100%; background-position-x: 180%; animation: 2s loading ease-in-out infinite; diff --git a/devui/skeleton/src/skeleton.tsx b/devui/skeleton/src/skeleton.tsx index 4e6bc3cbb7428ae2df0b72518fc9c246af0629af..1939a776162f02f7b9691328fc83e4edf03e09d1 100644 --- a/devui/skeleton/src/skeleton.tsx +++ b/devui/skeleton/src/skeleton.tsx @@ -14,10 +14,8 @@ export default defineComponent({ } return () => { if (props.loading) { - return
-
-
-
+ return
+ {props.avatar ?
: null}
{ arr.map(() => { return