Skip to content

Commit b71f354

Browse files
committed
perf: create wrapped signal only once for attributes diff
1 parent 906698a commit b71f354

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

packages/qwik/src/core/client/vnode-diff.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,20 @@ export const vnode_diff = (
827827
}
828828

829829
if (isSignal(value)) {
830-
value = trackSignalAndAssignHost(value, vnode, key, container, NON_CONST_SUBSCRIPTION_DATA);
830+
const unwrappedSignal =
831+
value instanceof WrappedSignalImpl ? value.$unwrapIfSignal$() : value;
832+
const currentSignal =
833+
vnode?.[_EFFECT_BACK_REF]?.get(key)?.[EffectSubscriptionProp.CONSUMER];
834+
if (currentSignal === unwrappedSignal) {
835+
return;
836+
}
837+
value = trackSignalAndAssignHost(
838+
unwrappedSignal,
839+
vnode,
840+
key,
841+
container,
842+
NON_CONST_SUBSCRIPTION_DATA
843+
);
831844
}
832845

833846
vnode.setAttr(

packages/qwik/src/core/reactive-primitives/internal-api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const getProp = <T extends object, P extends keyof T>(p0: T, p1: P) => p0[p1];
1616
const getWrapped = <T extends object>(args: [T, (keyof T | undefined)?]) => {
1717
if (args.length === 1) {
1818
if (isSignal(args[0])) {
19-
return ((args[0] as SignalImpl).$wrappedSignal$ ||= new WrappedSignalImpl(
19+
return ((args[0] as unknown as SignalImpl).$wrappedSignal$ ||= new WrappedSignalImpl(
2020
null,
2121
getValueProp,
2222
args,
@@ -25,7 +25,7 @@ const getWrapped = <T extends object>(args: [T, (keyof T | undefined)?]) => {
2525
} else if (isStore(args[0])) {
2626
return new WrappedSignalImpl(null, getValueProp, args, null);
2727
}
28-
return args[0].value;
28+
return (args[0] as { value: T }).value;
2929
} else {
3030
return new WrappedSignalImpl(null, getProp, args, null);
3131
}

0 commit comments

Comments
 (0)