Skip to content

Commit 1800b44

Browse files
committed
fix(ts-macro): prevent useSelector undefined error
1 parent 25aab36 commit 1800b44

File tree

7 files changed

+229
-192
lines changed

7 files changed

+229
-192
lines changed

packages/compiler/src/generators/for.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,18 +119,26 @@ export function genFor(
119119
keyProp,
120120
idMap,
121121
)
122-
const patternFrag: CodeFragment[] = []
122+
const selectorDeclarations: CodeFragment[] = []
123+
const selectorSetup: CodeFragment[] = []
123124

124125
for (const [i, { selector }] of selectorPatterns.entries()) {
125126
const selectorName = `_selector${id}_${i}`
126-
patternFrag.push(
127+
selectorDeclarations.push(`let ${selectorName}`, NEWLINE)
128+
if (i === 0) {
129+
selectorSetup.push(`({ createSelector }) => {`, INDENT_START)
130+
}
131+
selectorSetup.push(
127132
NEWLINE,
128-
`const ${selectorName} = `,
129-
...genCall(`n${id}.useSelector`, [
133+
`${selectorName} = `,
134+
...genCall(`createSelector`, [
130135
`() => `,
131136
...genExpression(selector, context),
132137
]),
133138
)
139+
if (i === selectorPatterns.length - 1) {
140+
selectorSetup.push(INDENT_END, NEWLINE, '}')
141+
}
134142
}
135143

136144
const blockFn = context.withId(() => {
@@ -183,16 +191,17 @@ export function genFor(
183191

184192
return [
185193
NEWLINE,
194+
...selectorDeclarations,
186195
`const n${id} = `,
187196
...genCall(
188-
helper('createFor'),
197+
[helper('createFor'), 'undefined'],
189198
sourceExpr,
190199
blockFn,
191200
genCallback(keyProp),
192201
flags ? String(flags) : undefined,
202+
selectorSetup.length ? selectorSetup : undefined,
193203
// todo: hydrationNode
194204
),
195-
...patternFrag,
196205
]
197206

198207
// construct a id -> accessor path map.

packages/compiler/test/transforms/__snapshots__/transformTemplateRef.spec.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ exports[`compiler: template ref transform > ref + v-for 1`] = `
1818
let r2
1919
_renderEffect(() => r2 = _setTemplateRef(n2, foo, r2, true))
2020
return n2
21-
}, null, 4)
21+
}, undefined, 4)
2222
return n0
2323
"
2424
`;

packages/compiler/test/transforms/__snapshots__/vFor.spec.ts.snap

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ exports[`compiler: v-for > nested v-for 1`] = `
7373
const x4 = _child(n4)
7474
_setNodes(x4, () => (_for_item1.value+_for_item0.value))
7575
return n4
76-
}, null, 1)
76+
}, undefined, 1)
7777
return n5
7878
})
7979
return n0
@@ -118,29 +118,33 @@ exports[`compiler: v-for > object value, key and index 1`] = `
118118

119119
exports[`compiler: v-for > selector pattern 1`] = `
120120
"
121+
let _selector0_0
121122
const n0 = _createFor(() => (rows), (_for_item0) => {
122123
const n2 = t0()
123124
const x2 = _child(n2)
124125
_selector0_0(() => {
125126
_setText(x2, _toDisplayString(selected === _for_item0.value.id ? 'danger' : ''))
126127
})
127128
return n2
128-
}, (row) => (row.id))
129-
const _selector0_0 = n0.useSelector(() => selected)
129+
}, (row) => (row.id), undefined, ({ createSelector }) => {
130+
_selector0_0 = createSelector(() => selected)
131+
})
130132
return n0
131133
"
132134
`;
133135

134136
exports[`compiler: v-for > selector pattern 2`] = `
135137
"
138+
let _selector0_0
136139
const n0 = _createFor(() => (rows), (_for_item0) => {
137140
const n2 = t0()
138141
_selector0_0(() => {
139142
_setClass(n2, selected === _for_item0.value.id ? 'danger' : '')
140143
})
141144
return n2
142-
}, (row) => (row.id))
143-
const _selector0_0 = n0.useSelector(() => selected)
145+
}, (row) => (row.id), undefined, ({ createSelector }) => {
146+
_selector0_0 = createSelector(() => selected)
147+
})
144148
return n0
145149
"
146150
`;
@@ -158,14 +162,16 @@ exports[`compiler: v-for > selector pattern 3`] = `
158162

159163
exports[`compiler: v-for > selector pattern 4`] = `
160164
"
165+
let _selector0_0
161166
const n0 = _createFor(() => (rows), (_for_item0) => {
162167
const n2 = t0()
163168
_selector0_0(() => {
164169
_setClass(n2, { danger: _for_item0.value.id === selected })
165170
})
166171
return n2
167-
}, (row) => (row.id))
168-
const _selector0_0 = n0.useSelector(() => selected)
172+
}, (row) => (row.id), undefined, ({ createSelector }) => {
173+
_selector0_0 = createSelector(() => selected)
174+
})
169175
return n0
170176
"
171177
`;

packages/compiler/test/transforms/__snapshots__/vOnce.spec.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ exports[`compiler: v-once > with v-for 1`] = `
4949
const n0 = _createFor(() => (list), (_for_item0) => {
5050
const n2 = t0()
5151
return n2
52-
}, null, 4)
52+
}, undefined, 4)
5353
return n0
5454
"
5555
`;

playground/src/for.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default () => {
1919
</>
2020
)
2121

22+
const selected = ref(0)
2223
return (
2324
<div>
2425
<input v-model_number={count.value} />
@@ -31,9 +32,25 @@ export default () => {
3132

3233
<fieldset>
3334
<legend>v-for</legend>
34-
<div v-for={(_, index) in count.value}>{index}</div>
35+
<div
36+
v-for={
37+
(i, index) in
38+
Array.from({ length: count.value }).map((_, id) => ({ id }))
39+
}
40+
key={i.id}
41+
class={{ 'text-red': i.id === selected.value }}
42+
onClick={() => (selected.value = i.id)}
43+
>
44+
{i.id}
45+
</div>
3546
</fieldset>
3647
</div>
3748
</div>
3849
)
3950
}
51+
52+
defineStyle(`
53+
.text-red {
54+
color: red;
55+
}
56+
`)

0 commit comments

Comments
 (0)