diff --git a/.changeset/fix-spread-undefined-ref.md b/.changeset/fix-spread-undefined-ref.md new file mode 100644 index 0000000000..0586d6bf78 --- /dev/null +++ b/.changeset/fix-spread-undefined-ref.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/react": patch +--- + +fix: avoid crash when spread undefined ref diff --git a/packages/react/runtime/src/backgroundSnapshot.ts b/packages/react/runtime/src/backgroundSnapshot.ts index bf134d5915..0fe2675373 100644 --- a/packages/react/runtime/src/backgroundSnapshot.ts +++ b/packages/react/runtime/src/backgroundSnapshot.ts @@ -198,7 +198,7 @@ export class BackgroundSnapshotInstance { v.__snapshot_def.refAndSpreadIndexes?.forEach((i) => { const value = v.__values![i] as unknown; if (value && (typeof value === 'object' || typeof value === 'function')) { - if ('__spread' in value && 'ref' in value) { + if ('__spread' in value && 'ref' in value && value.ref) { applyRef(value.ref as Ref, null); } else if ('__ref' in value) { applyRef(value as Ref, null); diff --git a/packages/react/testing-library/src/__tests__/ref.test.jsx b/packages/react/testing-library/src/__tests__/ref.test.jsx index 51664bf58a..d1ca395752 100644 --- a/packages/react/testing-library/src/__tests__/ref.test.jsx +++ b/packages/react/testing-library/src/__tests__/ref.test.jsx @@ -460,4 +460,26 @@ describe('element ref', () => { expect(lynx.getNativeApp().callLepusMethod).toBeCalledTimes(2); vi.resetAllMocks(); }); + + it('spread undefined ref should work', () => { + let setProps, setShowChild; + const Child = () => { + const [props, _setProps] = useState({ ref: undefined }); + setProps = _setProps; + + return ; + }; + const App = () => { + let [showChild, _setShowChild] = useState(true); + setShowChild = _setShowChild; + + return showChild && ; + }; + + render(); + + act(() => { + setShowChild(false); + }); + }); });