🐛 dynamicStyleElement array should not be clear after remount (#1054)

This commit is contained in:
Kuitos 2020-11-05 20:07:48 +08:00 committed by GitHub
parent 3b98d6d708
commit 006536dc19
3 changed files with 35 additions and 24 deletions

View File

@ -349,12 +349,12 @@ export function patchHTMLDynamicAppendPrototypeFunctions(
export function rebuildCSSRules( export function rebuildCSSRules(
styleSheetElements: HTMLStyleElement[], styleSheetElements: HTMLStyleElement[],
reAppendElement: (stylesheetElement: HTMLStyleElement) => void, reAppendElement: (stylesheetElement: HTMLStyleElement) => boolean,
) { ) {
styleSheetElements.forEach((stylesheetElement) => { styleSheetElements.forEach((stylesheetElement) => {
// re-append the dynamic stylesheet to sub-app container // re-append the dynamic stylesheet to sub-app container
reAppendElement(stylesheetElement); const appendSuccess = reAppendElement(stylesheetElement);
if (appendSuccess) {
/* /*
get the stored css rules from styled-components generated element, and the re-insert rules for them. get the stored css rules from styled-components generated element, and the re-insert rules for them.
note that we must do this after style element had been added to document, which stylesheet would be associated to the document automatically. note that we must do this after style element had been added to document, which stylesheet would be associated to the document automatically.
@ -370,5 +370,6 @@ export function rebuildCSSRules(
} }
} }
} }
}
}); });
} }

View File

@ -70,10 +70,16 @@ export function patchLooseSandbox(
// the dynamic style sheet would be removed automatically while unmoutting // the dynamic style sheet would be removed automatically while unmoutting
return function rebuild() { return function rebuild() {
rebuildCSSRules(dynamicStyleSheetElements, (stylesheetElement) => rebuildCSSRules(dynamicStyleSheetElements, (stylesheetElement) => {
const appWrapper = appWrapperGetter();
if (!appWrapper.contains(stylesheetElement)) {
// Using document.head.appendChild ensures that appendChild invocation can also directly use the HTMLHeadElement.prototype.appendChild method which is overwritten at mounting phase // Using document.head.appendChild ensures that appendChild invocation can also directly use the HTMLHeadElement.prototype.appendChild method which is overwritten at mounting phase
document.head.appendChild.call(appWrapperGetter(), stylesheetElement), document.head.appendChild.call(appWrapper, stylesheetElement);
); return true;
}
return false;
});
// As the patcher will be invoked every mounting phase, we could release the cache for gc after rebuilding // As the patcher will be invoked every mounting phase, we could release the cache for gc after rebuilding
if (mounting) { if (mounting) {

View File

@ -94,17 +94,21 @@ export function patchStrictSandbox(
unpatchDocumentCreate(); unpatchDocumentCreate();
} }
proxyAttachContainerConfigMap.delete(proxy);
recordStyledComponentsCSSRules(dynamicStyleSheetElements); recordStyledComponentsCSSRules(dynamicStyleSheetElements);
// As now the sub app content all wrapped with a special id container, // As now the sub app content all wrapped with a special id container,
// the dynamic style sheet would be removed automatically while unmoutting // the dynamic style sheet would be removed automatically while unmoutting
return function rebuild() { return function rebuild() {
rebuildCSSRules(dynamicStyleSheetElements, (stylesheetElement) => rebuildCSSRules(dynamicStyleSheetElements, (stylesheetElement) => {
rawHeadAppendChild.call(appWrapperGetter(), stylesheetElement), const appWrapper = appWrapperGetter();
); if (!appWrapper.contains(stylesheetElement)) {
rawHeadAppendChild.call(appWrapper, stylesheetElement);
return true;
}
return false;
});
}; };
}; };
} }