Skip to content

Commit 3d789ec

Browse files
improved initial load
1 parent a993289 commit 3d789ec

File tree

3 files changed

+27
-31
lines changed

3 files changed

+27
-31
lines changed

apps/website/src/routes/docs/headless/select/examples/multiple-pill.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,23 @@ import { LuCheck, LuX } from '@qwikest/icons/lucide';
55
export default component$(() => {
66
useStyles$(styles);
77
const users = ['Tim', 'Ryan', 'Jim', 'Jessie', 'Abby'];
8-
const display = useSignal<string[]>(['Jim']);
9-
const selected = useSignal<string[]>(['Jim']);
8+
const display = useSignal<string[]>([]);
9+
const selected = useSignal<string[]>([]);
1010

1111
return (
1212
<Select.Root multiple bind:displayText={display} bind:value={selected} class="select">
1313
<Select.Label>Logged in users</Select.Label>
1414
<Select.Trigger class="select-trigger">
1515
<Select.DisplayText>
16-
{display.value.map((opt) => (
17-
<span class="select-pill" key={opt}>
18-
{opt}
16+
{display.value.map((item) => (
17+
<span class="select-pill" key={item}>
18+
{item}
1919
<span
20-
onClick$={() =>
21-
(selected.value = selected.value?.filter(
22-
(selectedOpt) => selectedOpt !== opt,
23-
))
24-
}
20+
onClick$={() => {
21+
selected.value = selected.value?.filter(
22+
(selectedItem) => selectedItem !== item,
23+
);
24+
}}
2525
>
2626
<LuX aria-hidden="true" />
2727
</span>

packages/kit-headless/src/components/select/select-inline.tsx

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -132,23 +132,6 @@ export const SelectRoot: Component<SelectProps & InlineCompProps> = (
132132
}
133133
}
134134

135-
// console warning if a consumer's passed in value does not match an option
136-
// let valueMatch = true;
137-
// if (props.value !== undefined) {
138-
// for (const item of itemsMap.values()) {
139-
// if (!props.value.includes(item.value)) {
140-
// console.log(props.value.includes(item.value));
141-
// valueMatch = false;
142-
// }
143-
// }
144-
145-
// if (!valueMatch) {
146-
// throw new Error(
147-
// `Qwik UI: a provided option value "${props.value}" does not match any of the option values in the Select.`,
148-
// );
149-
// }
150-
// }
151-
152135
return (
153136
<SelectImpl
154137
{...rest}

packages/kit-headless/src/components/select/select-root.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
160160

161161
const currDisplayValueSig = useSignal<string | string[]>();
162162

163+
const initialLoadSig = useSignal<boolean>(true);
164+
163165
const context: SelectContext = {
164166
itemsMapSig,
165167
currDisplayValueSig,
@@ -194,8 +196,10 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
194196
if (bindValueSig.value.includes(item.value)) {
195197
await selectionManager$(index, 'add');
196198

197-
// for both SSR and CSR, we need to set the initial index
198-
context.highlightedIndexSig.value = index;
199+
if (initialLoadSig.value) {
200+
// for both SSR and CSR, we need to set the initial index
201+
context.highlightedIndexSig.value = index;
202+
}
199203
}
200204
}
201205
});
@@ -210,7 +214,10 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
210214

211215
useTask$(function onOpenChangeTask({ track }) {
212216
track(() => isListboxOpenSig.value);
213-
onOpenChange$?.(isListboxOpenSig.value);
217+
218+
if (!initialLoadSig.value) {
219+
onOpenChange$?.(isListboxOpenSig.value);
220+
}
214221
});
215222

216223
const activeDescendantSig = useComputed$(() => {
@@ -227,7 +234,6 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
227234
track(() => selectedIndexSetSig.value);
228235

229236
const currValue = await extractedStrOrArrFromMap$('value');
230-
const currDisplayValue = await extractedStrOrArrFromMap$('displayValue');
231237

232238
if (onChange$ && selectedIndexSetSig.value.size > 0) {
233239
await onChange$(currValue);
@@ -240,9 +246,12 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
240246

241247
if (currUserSigValues !== newUserSigValues) {
242248
bindValueSig.value = currValue;
249+
console.log('BINDVALUE SIG', bindValueSig.value);
243250
}
244251
}
245252

253+
const currDisplayValue = await extractedStrOrArrFromMap$('displayValue');
254+
246255
// sync the user's given signal for the display value
247256
if (bindDisplayTextSig && currDisplayValue) {
248257
if (typeof currDisplayValue === 'string') {
@@ -253,6 +262,10 @@ export const SelectImpl = component$<SelectProps<boolean> & InternalSelectProps>
253262
}
254263
});
255264

265+
useTask$(() => {
266+
initialLoadSig.value = false;
267+
});
268+
256269
return (
257270
<div
258271
role="combobox"

0 commit comments

Comments
 (0)