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);
+ });
+ });
});