Skip to content

Commit 88cbe38

Browse files
committed
fix: add missing classes of loading component before hydration
1 parent 3c59a68 commit 88cbe38

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/utils.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,34 @@ export function createObserver(options) {
2121
return observer;
2222
}
2323

24+
function unwrapClass(classes) {
25+
if (!classes) return [];
26+
27+
const result = [];
28+
if (Array.isArray(classes)) {
29+
classes.forEach(cl => {
30+
result.push(...unwrapClass(cl));
31+
});
32+
return result;
33+
} else if (typeof classes === 'object') {
34+
Object.keys(classes).forEach(key => {
35+
if (classes[key]) result.push(...unwrapClass(classes[key]));
36+
});
37+
return result;
38+
} else {
39+
// string
40+
return classes.split(' ');
41+
}
42+
}
43+
44+
function getMissingClasses(vnodeClasses, elementClasses) {
45+
const vnodes = unwrapClass(vnodeClasses);
46+
const elements = unwrapClass(elementClasses);
47+
48+
// return all classes which are not in the vnode, but in the elements
49+
return elements.filter(x => !vnodes.includes(x));
50+
}
51+
2452
export function loadingComponentFactory(resolvableComponent, options) {
2553
return {
2654
render(h) {
@@ -29,7 +57,14 @@ export function loadingComponentFactory(resolvableComponent, options) {
2957
// eslint-disable-next-line no-underscore-dangle
3058
if (!this.$el) resolvableComponent._resolve();
3159

32-
return h(tag);
60+
return h(tag, {
61+
class: getMissingClasses(
62+
[
63+
this.$vnode && this.$vnode.data && this.$vnode.data.class && this.$vnode.data.class,
64+
this.$vnode && this.$vnode.data && this.$vnode.data.staticClass && this.$vnode.data.staticClass
65+
],
66+
this.$el && this.$el.getAttribute('class'))
67+
});
3368
},
3469
...options,
3570
};

test/integration/integration.test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ describe(`integration`, () => {
7373

7474
let classAttribute = await page.$('#DummyInteractionFct');
7575

76-
expect(classAttribute._remoteObject.description).toBe('div#DummyInteractionFct.additional.DummyInteraction');
76+
expect(classAttribute._remoteObject.description).toMatch(/#DummyInteractionFct/);
77+
expect(classAttribute._remoteObject.description).toMatch(/\.additional/);
78+
expect(classAttribute._remoteObject.description).toMatch(/\.DummyInteraction/);
7779
});
7880

7981
test(`It should hydrate the component when an interaction happens.`, async () => {

0 commit comments

Comments
 (0)