Skip to content

Commit 593631d

Browse files
committed
perf tweaks
1 parent 0240ec4 commit 593631d

File tree

1 file changed

+25
-21
lines changed
  • packages/svelte/src/internal/client/dom/blocks

1 file changed

+25
-21
lines changed

packages/svelte/src/internal/client/dom/blocks/each.js

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,30 @@ export function index(_, i) {
4949
/**
5050
* Pause multiple effects simultaneously, and coordinate their
5151
* subsequent destruction. Used in each blocks
52-
* @param {import('#client').Effect[]} effects
52+
* @param {import('#client').EachItem[]} items
5353
* @param {null | Node} controlled_anchor
5454
* @param {() => void} [callback]
5555
*/
56-
function pause_effects(effects, controlled_anchor, callback) {
56+
function pause_effects(items, controlled_anchor, callback) {
5757
/** @type {import('#client').TransitionManager[]} */
5858
var transitions = [];
59-
var length = effects.length;
59+
var length = items.length;
6060

6161
for (var i = 0; i < length; i++) {
62-
pause_children(effects[i], transitions, true);
62+
pause_children(items[i].e, transitions, true);
6363
}
6464

6565
// If we have a controlled anchor, it means that the each block is inside a single
6666
// DOM element, so we can apply a fast-path for clearing the contents of the element.
67-
if (effects.length > 0 && transitions.length === 0 && controlled_anchor !== null) {
67+
if (length > 0 && transitions.length === 0 && controlled_anchor !== null) {
6868
var parent_node = /** @type {Element} */ (controlled_anchor.parentNode);
6969
parent_node.textContent = '';
7070
parent_node.append(controlled_anchor);
7171
}
7272

7373
run_out_transitions(transitions, () => {
7474
for (var i = 0; i < length; i++) {
75-
destroy_effect(effects[i]);
75+
destroy_effect(items[i].e);
7676
}
7777

7878
if (callback !== undefined) callback();
@@ -225,7 +225,9 @@ export function each(anchor, flags, get_collection, get_key, render_fn, fallback
225225
*/
226226
function reconcile(array, state, anchor, render_fn, flags, get_key) {
227227
var is_animated = (flags & EACH_IS_ANIMATED) !== 0;
228+
var should_update = (flags & (EACH_ITEM_REACTIVE | EACH_INDEX_REACTIVE)) !== 0;
228229

230+
var length = array.length;
229231
var items = state.items;
230232
var first = state.next;
231233
var current = first;
@@ -255,7 +257,7 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
255257
var item;
256258

257259
if (is_animated) {
258-
for (let i = 0; i < array.length; i += 1) {
260+
for (let i = 0; i < length; i += 1) {
259261
value = array[i];
260262
key = get_key(value, i);
261263
item = items.get(key);
@@ -267,7 +269,7 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
267269
}
268270
}
269271

270-
for (let i = 0; i < array.length; i += 1) {
272+
for (let i = 0; i < length; i += 1) {
271273
value = array[i];
272274
key = get_key(value, i);
273275
item = items.get(key);
@@ -293,7 +295,10 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
293295
continue;
294296
}
295297

296-
update_item(item, value, i, flags);
298+
if (should_update) {
299+
update_item(item, value, i, flags);
300+
}
301+
297302
resume_effect(item.e);
298303

299304
if (item !== current) {
@@ -333,7 +338,7 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
333338
matched = [];
334339
stashed = [];
335340

336-
while (current && current.k !== key) {
341+
while (current !== null && current.k !== key) {
337342
seen.add(current);
338343
stashed.push(current);
339344
current = current.next;
@@ -358,16 +363,15 @@ function reconcile(array, state, anchor, render_fn, flags, get_key) {
358363

359364
const to_destroy = Array.from(seen);
360365

361-
pause_effects(
362-
to_destroy.map((item) => item.e),
363-
null,
364-
() => {
365-
for (const item of to_destroy) {
366-
items.delete(item.k);
367-
link(item.prev, item.next);
368-
}
366+
var controlled_anchor = (flags & EACH_IS_CONTROLLED) !== 0 && length === 0 ? anchor : null;
367+
368+
pause_effects(to_destroy, controlled_anchor, () => {
369+
for (var i = 0; i < to_destroy.length; i += 1) {
370+
var item = to_destroy[i];
371+
items.delete(item.k);
372+
link(item.prev, item.next);
369373
}
370-
);
374+
});
371375

372376
if (is_animated) {
373377
effect(() => {
@@ -448,7 +452,7 @@ function create_item(anchor, prev, next, value, key, index, render_fn, flags) {
448452
};
449453

450454
prev.next = item;
451-
if (next) next.prev = item;
455+
if (next !== null) next.prev = item;
452456

453457
current_each_item = item;
454458
item.e = branch(() => render_fn(anchor, v, i));
@@ -489,5 +493,5 @@ function move(item, prev, anchor) {
489493
*/
490494
function link(prev, next) {
491495
prev.next = next;
492-
if (next) next.prev = prev;
496+
if (next !== null) next.prev = prev;
493497
}

0 commit comments

Comments
 (0)