[FIX] component: missing renderings in some cases

This commit is contained in:
Géry Debongnie
2022-03-03 13:57:29 +01:00
parent 8920b4b93a
commit 0457e5d4ed
4 changed files with 105 additions and 3 deletions
+9 -2
View File
@@ -107,8 +107,14 @@ export function component<P extends object>(
const parentFiber = ctx.fiber!;
if (node) {
const currentProps = node.component.props[TARGET];
if (parentFiber.deep || arePropsDifferent(currentProps, props)) {
let shouldRender = node.forceNextRender;
if (shouldRender) {
node.forceNextRender = false;
} else {
const currentProps = node.component.props[TARGET];
shouldRender = parentFiber.deep || arePropsDifferent(currentProps, props);
}
if (shouldRender) {
node.updateAndRender(props, parentFiber);
}
} else {
@@ -143,6 +149,7 @@ export class ComponentNode<P extends object = any, E = any> implements VNode<Com
component: Component<P, E>;
bdom: BDom | null = null;
status: STATUS = STATUS.NEW;
forceNextRender: boolean = false;
renderFn: Function;
parent: ComponentNode | null;
+9 -1
View File
@@ -43,7 +43,15 @@ function cancelFibers(fibers: Fiber[]): number {
let result = 0;
for (let fiber of fibers) {
fiber.node.fiber = null;
if (!fiber.bdom) {
if (fiber.bdom) {
// if fiber has been rendered, this means that the component props have
// been updated. however, this fiber will not be patched to the dom, so
// it could happen that the next render compare the current props with
// the same props, and skip the render completely. With the next line,
// we kindly request the component code to force a render, so it works as
// expected.
fiber.node.forceNextRender = true;
} else {
result++;
}
result += cancelFibers(fiber.children);