Skip to content

Commit ad78bcd

Browse files
committed
remove item.d
1 parent 5d8a57a commit ad78bcd

File tree

3 files changed

+56
-59
lines changed

3 files changed

+56
-59
lines changed

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

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { untrack } from '../../runtime.js';
1919
import {
2020
destroy_effect,
2121
pause_effect,
22+
pause_effects,
2223
render_effect,
2324
resume_effect,
2425
user_effect
@@ -272,26 +273,14 @@ function reconcile_indexed_array(array, state, anchor, render_fn, flags) {
272273
state.items = b_items;
273274
} else if (a > b) {
274275
// remove items
275-
var remaining = a - b;
276-
277-
var clear = () => {
278-
for (var i = b; i < a; i += 1) {
279-
item = a_items[i];
280-
if (item.d) remove(item.d);
281-
}
276+
var effects = [];
277+
for (i = b; i < a; i += 1) {
278+
effects.push(a_items[i].e);
279+
}
282280

281+
pause_effects(effects, () => {
283282
state.items.length = b;
284-
};
285-
286-
var check = () => {
287-
if (--remaining === 0) {
288-
clear();
289-
}
290-
};
291-
292-
for (; i < a; i += 1) {
293-
pause_effect(a_items[i].e, check);
294-
}
283+
});
295284
}
296285
}
297286

@@ -322,7 +311,7 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
322311
var start = 0;
323312
var item;
324313

325-
/** @type {Array<import('#client').EachItem>} */
314+
/** @type {import('#client').Effect[]} */
326315
var to_destroy = [];
327316

328317
// Step 1 — trim common suffix
@@ -361,7 +350,7 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
361350
} else if (start === b) {
362351
// remove only
363352
while (start < a) {
364-
to_destroy.push(a_items[start++]);
353+
to_destroy.push(a_items[start++].e);
365354
}
366355
} else {
367356
// reconcile
@@ -403,7 +392,7 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
403392
resume_effect(item.e);
404393

405394
if (index === undefined) {
406-
to_destroy.push(item);
395+
to_destroy.push(item.e);
407396
} else {
408397
moved = true;
409398
sources[index - start] = i;
@@ -459,28 +448,9 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
459448
}
460449
}
461450

462-
var remaining = to_destroy.length;
463-
if (remaining > 0) {
464-
var clear = () => {
465-
for (item of to_destroy) {
466-
if (item.d) remove(item.d);
467-
}
468-
469-
state.items = b_items;
470-
};
471-
472-
var check = () => {
473-
if (--remaining === 0) {
474-
clear();
475-
}
476-
};
477-
478-
for (item of to_destroy) {
479-
pause_effect(item.e, check);
480-
}
481-
} else {
451+
pause_effects(to_destroy, () => {
482452
state.items = b_items;
483-
}
453+
});
484454
}
485455

486456
/**
@@ -629,8 +599,6 @@ function create_item(value, key, index, render_fn, flags) {
629599
var item = {
630600
a: null,
631601
// dom
632-
d: null,
633-
// effect
634602
// @ts-expect-error
635603
e: null,
636604
// index
@@ -652,7 +620,13 @@ function create_item(value, key, index, render_fn, flags) {
652620

653621
item.e = render_effect(
654622
() => {
655-
render_fn(null, item.v, item.i);
623+
var dom = render_fn(null, item.v, item.i);
624+
625+
return () => {
626+
if (dom !== undefined) {
627+
remove(dom);
628+
}
629+
};
656630
},
657631
item,
658632
true

packages/svelte/src/internal/client/reactivity/effects.js

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -271,26 +271,51 @@ export function destroy_effect(effect) {
271271
*/
272272
export function pause_effect(effect, callback = noop) {
273273
/** @type {import('#client').TransitionManager[]} */
274-
const transitions = [];
274+
var transitions = [];
275275

276276
pause_children(effect, transitions, true);
277277

278-
let remaining = transitions.length;
278+
out(transitions, () => {
279+
destroy_effect(effect);
280+
callback();
281+
});
282+
}
279283

280-
if (remaining > 0) {
281-
const check = () => {
282-
if (!--remaining) {
283-
destroy_effect(effect);
284-
callback();
285-
}
286-
};
284+
/**
285+
* Pause multiple effects simultaneously, and coordinate their
286+
* subsequent destruction. Used in each blocks
287+
* @param {import('#client').Effect[]} effects
288+
* @param {() => void} callback
289+
*/
290+
export function pause_effects(effects, callback = noop) {
291+
/** @type {import('#client').TransitionManager[]} */
292+
var transitions = [];
293+
294+
for (var effect of effects) {
295+
pause_children(effect, transitions, true);
296+
}
287297

288-
for (const transition of transitions) {
298+
out(transitions, () => {
299+
for (var effect of effects) {
300+
destroy_effect(effect);
301+
}
302+
callback();
303+
});
304+
}
305+
306+
/**
307+
* @param {import('#client').TransitionManager[]} transitions
308+
* @param {() => void} fn
309+
*/
310+
function out(transitions, fn) {
311+
var remaining = transitions.length;
312+
if (remaining > 0) {
313+
var check = () => --remaining || fn();
314+
for (var transition of transitions) {
289315
transition.out(check);
290316
}
291317
} else {
292-
destroy_effect(effect);
293-
callback();
318+
fn();
294319
}
295320
}
296321

packages/svelte/src/internal/client/types.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ export type EachState = {
6666
export type EachItem = {
6767
/** animation manager */
6868
a: AnimationManager | null;
69-
/** dom */
70-
d: null | Dom;
7169
/** effect */
7270
e: Effect;
7371
/** item */

0 commit comments

Comments
 (0)