Skip to content

Commit 8aebeb8

Browse files
committed
perf: use v-memo in c-select
1 parent 72685e9 commit 8aebeb8

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# 6.0.4
22
- AuditLogging: Stored procedure cache was not being correctly persisted to avoid redundant `SELECT OBJECT_DEFINITION` queries.
33
- Added `CoalesceOptions.PreventAspNetBrowserRefresh()` utility method to block unwanted `aspnetcore-browser-refresh.js` script.
4+
- Perf: use v-memo in `c-select` list items to avoid redundant re-renders.
45

56
# 6.0.3
67
- `c-select` now correctly respects the `filter` prop for enum collections.

playground/Coalesce.Web.Vue3/src/examples/c-select/styling.vue

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,39 @@
3636
</template>
3737
</c-select>
3838

39+
<h1>c-select slots</h1>
40+
<c-select for="Person" multiple v-model="people" variant="outlined">
41+
<!-- c-select specific slots -->
42+
<template #selected-item="{ item, index, remove }">
43+
<v-chip
44+
size="small"
45+
closable
46+
@click:close="remove"
47+
color="purple"
48+
class="ma-1"
49+
>
50+
<v-icon start>fa fa-star</v-icon>
51+
{{ item.name }} (#{{ index + 1 }})
52+
</v-chip>
53+
</template>
54+
55+
<template #list-item="{ item, search, selected }">
56+
<div class="d-flex align-center">
57+
<v-avatar size="24" color="primary" class="mr-2">
58+
<span class="text-caption">{{ item.name?.[0] }}</span>
59+
</v-avatar>
60+
<div>
61+
<div class="font-weight-bold">{{ item.name }}</div>
62+
<div class="text-caption text-grey">
63+
ID: {{ item.personId }} |
64+
{{ selected ? "✓ Selected" : "Not selected" }}
65+
{{ search ? `| Search: "${search}"` : "" }}
66+
</div>
67+
</div>
68+
</div>
69+
</template>
70+
</c-select>
71+
3972
<h1>compact/outlined via v-defaults-provider</h1>
4073
<v-defaults-provider
4174
:defaults="{
@@ -117,13 +150,15 @@
117150

118151
<script setup lang="ts">
119152
import { Person } from "@/models.g";
120-
import { CaseViewModel } from "@/viewmodels.g";
153+
import { CaseViewModel, PersonViewModel } from "@/viewmodels.g";
121154
import { modelDisplay, useBindToQueryString } from "coalesce-vue";
122-
import { ref } from "vue";
155+
import { reactive, ref } from "vue";
123156
124157
const caseVm = new CaseViewModel();
125158
caseVm.$load(15);
126159
caseVm.$useAutoSave();
127160
161+
const people = ref<Person[]>([]);
162+
128163
const dialogOpen = ref(false);
129164
</script>

src/coalesce-vue-vuetify3/src/components/input/c-select.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@
171171
<v-list-item
172172
v-for="(item, i) in listItems"
173173
:key="item.key"
174+
v-memo="[
175+
pendingSelection === i,
176+
item.selected,
177+
hasCustomItemSlots ? search : false,
178+
]"
174179
:value="item.key"
175180
:class="{
176181
'pending-selection': pendingSelection === i,
@@ -497,6 +502,10 @@ const passthroughSlots = computed(() => {
497502
return ret;
498503
});
499504
505+
const hasCustomItemSlots = computed(
506+
() => !!slots["list-item"] || !!slots["item"],
507+
);
508+
500509
const rootRef = useTemplateRef("rootRef");
501510
const menuContentRef = useTemplateRef("menuContentRef");
502511
const searchRef = useTemplateRef("searchRef");

0 commit comments

Comments
 (0)