From 0506f81ea3f1b2b4c7b091c568ce4e4c717762a9 Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Thu, 29 May 2025 11:33:28 +0200 Subject: [PATCH 1/7] Fix lagging signal --- packages/list/README.md | 5 ++--- packages/list/src/index.ts | 40 +++++++++++++------------------------- 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/packages/list/README.md b/packages/list/README.md index 3030abe4d..25c0b8d39 100644 --- a/packages/list/README.md +++ b/packages/list/README.md @@ -36,8 +36,7 @@ function Component() { {(value, index) => { return (
- {" "} - {index()}: {value()}{" "} + {index()}: {value()}
); }} @@ -54,7 +53,7 @@ Every element is keyed by item reference and index, but item reference is priori Underlying helper for `` unkeyed control flow. Returns array with elements mapped using provided mapping function. -Mapping function may use provided reactive value and reactive index, but signals for each of them are created only if they are used. Mapping function is ran only when original array has more elements than before. Elements are disposed only if original array has less elements than before. +Mapping function may use provided reactive value and reactive index. Mapping function is ran only when original array has more elements than before. Elements are disposed only if original array has less elements than before. ## Demo diff --git a/packages/list/src/index.ts b/packages/list/src/index.ts index 4996783e3..941bc73f6 100644 --- a/packages/list/src/index.ts +++ b/packages/list/src/index.ts @@ -168,32 +168,20 @@ export function listArray( item.valueSetter?.(newValueGetter); } function mapper(disposer: () => void) { - const t: ListItem = { - value: newValue, - index: i, - disposer, - }, - scopedV = newValue, - scopedI = i; - items.push(t); - // signal created when used - let sV: Accessor = () => { - [sV, t.valueSetter] = isDev - ? createSignal(scopedV, { name: "value" }) - : createSignal(scopedV); - return sV(); - }, - sI: Accessor = () => { - [sI, t.indexSetter] = isDev - ? createSignal(scopedI, { name: "index" }) - : createSignal(scopedI); - return sI(); - }; - - return mapFn( - () => sV(), - () => sI(), - ); + const [sV, valueSetter] = isDev + ? createSignal(newValue, { name: "value" }) + : createSignal(newValue), + [sI, indexSetter] = isDev ? createSignal(i, { name: "index" }) : createSignal(i); + + items.push({ + value: newValue, + index: i, + disposer, + valueSetter, + indexSetter, + }); + + return mapFn(sV, sI); } } From 18d69cc2c177dc3f0d4f9d3bad32b43160734760 Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Thu, 29 May 2025 11:40:02 +0200 Subject: [PATCH 2/7] Update package.json --- packages/list/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/list/package.json b/packages/list/package.json index 4b20347ca..629730fe8 100644 --- a/packages/list/package.json +++ b/packages/list/package.json @@ -1,6 +1,6 @@ { "name": "@solid-primitives/list", - "version": "0.1.1", + "version": "0.1.2", "description": "A List component, an alternative to For and Index.", "author": "Maciek50322 <34212298+maciek50322@users.noreply.github.com>", "contributors": [], @@ -54,4 +54,4 @@ "peerDependencies": { "solid-js": "^1.6.12" } -} +} \ No newline at end of file From eea69b6ac3d4d4319e9a195b7f78519359b1dfdf Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Thu, 29 May 2025 11:57:09 +0200 Subject: [PATCH 3/7] Update CHANGELOG.md --- packages/list/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/list/CHANGELOG.md b/packages/list/CHANGELOG.md index b6151c596..9c0670e25 100644 --- a/packages/list/CHANGELOG.md +++ b/packages/list/CHANGELOG.md @@ -1,5 +1,11 @@ # @solid-primitives/list +## 0.1.2 + +### Patch Changes + +- Fix signal reporting wrong value when used only after changes. + ## 0.1.1 ### Patch Changes From c5974345844012720bce5959a1643fc4b800d6a2 Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Thu, 29 May 2025 12:23:36 +0200 Subject: [PATCH 4/7] remove changelog & version --- packages/list/CHANGELOG.md | 6 ------ packages/list/package.json | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/list/CHANGELOG.md b/packages/list/CHANGELOG.md index 9c0670e25..b6151c596 100644 --- a/packages/list/CHANGELOG.md +++ b/packages/list/CHANGELOG.md @@ -1,11 +1,5 @@ # @solid-primitives/list -## 0.1.2 - -### Patch Changes - -- Fix signal reporting wrong value when used only after changes. - ## 0.1.1 ### Patch Changes diff --git a/packages/list/package.json b/packages/list/package.json index 629730fe8..4b20347ca 100644 --- a/packages/list/package.json +++ b/packages/list/package.json @@ -1,6 +1,6 @@ { "name": "@solid-primitives/list", - "version": "0.1.2", + "version": "0.1.1", "description": "A List component, an alternative to For and Index.", "author": "Maciek50322 <34212298+maciek50322@users.noreply.github.com>", "contributors": [], @@ -54,4 +54,4 @@ "peerDependencies": { "solid-js": "^1.6.12" } -} \ No newline at end of file +} From 4d93f6ed02f89d86bad16c65dc02fcb2cde45160 Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Thu, 29 May 2025 13:15:23 +0200 Subject: [PATCH 5/7] Add test --- packages/list/test/index.test.tsx | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/list/test/index.test.tsx b/packages/list/test/index.test.tsx index 74b55311a..2496a0f3c 100644 --- a/packages/list/test/index.test.tsx +++ b/packages/list/test/index.test.tsx @@ -302,4 +302,45 @@ describe("List", () => { unmount(); document.body.removeChild(container); }); + + test("later used signal reports correct values", () => { + const container = document.createElement("div"); + document.body.appendChild(container); + + const startingArray = [1, 2, 3]; + const [s, set] = createSignal(startingArray); + const callbacks: (() => { v: number; i: number })[] = []; + const unmount = render( + () => ( + + {(v, i) => { + // this could be event callback (eg. onClick), v & i read only later + function futureAction() { + return { + v: v(), + i: i(), + }; + } + callbacks.push(() => futureAction()); + + return
No signals used in this fn
; + }} +
+ ), + container, + ); + + set([2, 1, 4]); // swap 1,2 & replace 3 with 4 (swap for index update, replace for value update) + + // get entries, sort by index & check values in order + const values = callbacks + .map(x => x()) + .sort((a, b) => a.i - b.i) + .map(x => x.v); + + expect(values).toStrictEqual([2, 1, 4]); + + unmount(); + document.body.removeChild(container); + }); }); From ccff708cf33023d08a33081343d88e71974b9454 Mon Sep 17 00:00:00 2001 From: maciek50322 <34212298+maciek50322@users.noreply.github.com> Date: Fri, 30 May 2025 09:51:59 +0200 Subject: [PATCH 6/7] Different way to fix --- packages/list/src/index.ts | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/list/src/index.ts b/packages/list/src/index.ts index 941bc73f6..6893e2212 100644 --- a/packages/list/src/index.ts +++ b/packages/list/src/index.ts @@ -168,20 +168,30 @@ export function listArray( item.valueSetter?.(newValueGetter); } function mapper(disposer: () => void) { - const [sV, valueSetter] = isDev - ? createSignal(newValue, { name: "value" }) - : createSignal(newValue), - [sI, indexSetter] = isDev ? createSignal(i, { name: "index" }) : createSignal(i); - - items.push({ + const t: ListItem = { value: newValue, index: i, disposer, - valueSetter, - indexSetter, - }); - - return mapFn(sV, sI); + }; + items.push(t); + // signal created when used + let sV: Accessor = () => { + [sV, t.valueSetter] = isDev + ? createSignal(t.value, { name: "value" }) + : createSignal(t.value); + return sV(); + }, + sI: Accessor = () => { + [sI, t.indexSetter] = isDev + ? createSignal(t.index, { name: "index" }) + : createSignal(t.index); + return sI(); + }; + + return mapFn( + () => sV(), + () => sI(), + ); } } From 2f06d076abc3479c287725a254e9b3152411f7a3 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Fri, 30 May 2025 11:46:14 +0200 Subject: [PATCH 7/7] Create clean-bulldogs-pump.md --- .changeset/clean-bulldogs-pump.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clean-bulldogs-pump.md diff --git a/.changeset/clean-bulldogs-pump.md b/.changeset/clean-bulldogs-pump.md new file mode 100644 index 000000000..d0abf915e --- /dev/null +++ b/.changeset/clean-bulldogs-pump.md @@ -0,0 +1,5 @@ +--- +"@solid-primitives/list": patch +--- + +Fix for `` "unused" signal returning wrong values when read only after changes. (#791)