From 723f83d8c8981a4b942b288cc53db5f4c7c6a03f Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Mon, 3 Oct 2022 02:00:43 -0500 Subject: [PATCH 1/3] fix: invalidate pierced props --- packages/fiber/src/core/utils.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index fd9606e0da..c71767d3d6 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -233,6 +233,11 @@ export function diffProps( let entries: string[] = [] if (key.includes('-')) entries = key.split('-') changes.push([key, value, false, entries]) + + // Reset pierced props + for (const [prop, value] of entries) { + if (prop.startsWith(`${key}-`)) changes.push([prop, value, false, prop.split('-')]) + } }) const memoized: { [key: string]: any } = { ...props } From af084925369af9242e10a851b90592646664e2d6 Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 11 Oct 2022 04:37:48 -0500 Subject: [PATCH 2/3] fix(applyProps): reference props instead --- packages/fiber/src/core/utils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/fiber/src/core/utils.ts b/packages/fiber/src/core/utils.ts index c71767d3d6..25d8eeb79c 100644 --- a/packages/fiber/src/core/utils.ts +++ b/packages/fiber/src/core/utils.ts @@ -235,7 +235,8 @@ export function diffProps( changes.push([key, value, false, entries]) // Reset pierced props - for (const [prop, value] of entries) { + for (const prop in props) { + const value = props[prop] if (prop.startsWith(`${key}-`)) changes.push([prop, value, false, prop.split('-')]) } }) From 120515028839a27a3c704292d3b6959e00ee8dad Mon Sep 17 00:00:00 2001 From: Cody Bennett <23324155+CodyJasonBennett@users.noreply.github.com> Date: Tue, 11 Oct 2022 04:38:01 -0500 Subject: [PATCH 3/3] chore(tests): add pierced props invalidation case --- packages/fiber/tests/core/renderer.test.tsx | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/fiber/tests/core/renderer.test.tsx b/packages/fiber/tests/core/renderer.test.tsx index e742c6d2c3..ac0e55eff0 100644 --- a/packages/fiber/tests/core/renderer.test.tsx +++ b/packages/fiber/tests/core/renderer.test.tsx @@ -762,4 +762,26 @@ describe('renderer', () => { expect(groupHandle).toBeDefined() expect(prevUUID).not.toBe(groupHandle!.uuid) }) + + it('invalidates pierced props when root is changed', async () => { + const material = React.createRef() + const texture1 = { needsUpdate: false, name: '' } as THREE.Texture + const texture2 = { needsUpdate: false, name: '' } as THREE.Texture + + await act(async () => + root.render(), + ) + + expect(material.current!.map).toBe(texture1) + expect(texture1.needsUpdate).toBe(true) + expect(texture1.name).toBe('test') + + await act(async () => + root.render(), + ) + + expect(material.current!.map).toBe(texture2) + expect(texture2.needsUpdate).toBe(true) + expect(texture2.name).toBe('test') + }) })