Skip to content

Commit 96d67fb

Browse files
committed
perf: create wrapped signal only once for attributes diff
1 parent 313d53e commit 96d67fb

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
@@ -831,7 +831,20 @@ export const vnode_diff = (
831831
}
832832

833833
if (isSignal(value)) {
834-
value = trackSignalAndAssignHost(value, vnode, key, container, NON_CONST_SUBSCRIPTION_DATA);
834+
const unwrappedSignal =
835+
value instanceof WrappedSignalImpl ? value.$unwrapIfSignal$() : value;
836+
const currentSignal =
837+
vnode?.[_EFFECT_BACK_REF]?.get(key)?.[EffectSubscriptionProp.CONSUMER];
838+
if (currentSignal === unwrappedSignal) {
839+
return;
840+
}
841+
value = trackSignalAndAssignHost(
842+
unwrappedSignal,
843+
vnode,
844+
key,
845+
container,
846+
NON_CONST_SUBSCRIPTION_DATA
847+
);
835848
}
836849

837850
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)