Skip to content

Commit 39ea5e4

Browse files
committed
WIP
1 parent a9ac217 commit 39ea5e4

File tree

4 files changed

+57
-33
lines changed

4 files changed

+57
-33
lines changed

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

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import {
88
import { HYDRATION_START_ELSE } from '../../../../constants.js';
99
import { component_context, set_component_context } from '../../context.js';
1010
import { handle_error, invoke_error_boundary } from '../../error-handling.js';
11-
import { block, branch, destroy_effect, pause_effect } from '../../reactivity/effects.js';
11+
import {
12+
block,
13+
branch,
14+
destroy_effect,
15+
move_effect,
16+
pause_effect
17+
} from '../../reactivity/effects.js';
1218
import {
1319
active_effect,
1420
active_reaction,
@@ -425,24 +431,6 @@ export class Boundary {
425431
}
426432
}
427433

428-
/**
429-
*
430-
* @param {Effect} effect
431-
* @param {DocumentFragment} fragment
432-
*/
433-
function move_effect(effect, fragment) {
434-
var node = effect.nodes_start;
435-
var end = effect.nodes_end;
436-
437-
while (node !== null) {
438-
/** @type {TemplateNode | null} */
439-
var next = node === end ? null : /** @type {TemplateNode} */ (get_next_sibling(node));
440-
441-
fragment.append(node);
442-
node = next;
443-
}
444-
}
445-
446434
export function get_boundary() {
447435
return /** @type {Boundary} */ (/** @type {Effect} */ (active_effect).b);
448436
}

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

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
/** @import { Effect, TemplateNode } from '#client' */
22
import { Batch, current_batch } from '../../reactivity/batch.js';
3-
import { branch, pause_effect, resume_effect } from '../../reactivity/effects.js';
3+
import {
4+
branch,
5+
destroy_effect,
6+
move_effect,
7+
pause_effect,
8+
resume_effect
9+
} from '../../reactivity/effects.js';
410
import { create_text, should_defer_append } from '../operations.js';
511

612
/**
@@ -57,15 +63,30 @@ export class BranchManager {
5763

5864
this.#batches.delete(batch);
5965

60-
for (const [k, e] of this.#onscreen) {
66+
for (const [k, effect] of this.#onscreen) {
6167
if (k === key) continue;
6268

63-
pause_effect(e, () => {
64-
// TODO if this needed by a pending batch, move the effect to
65-
// a fragment and put it on this.#offscreen
69+
pause_effect(
70+
effect,
71+
() => {
72+
const keys = Array.from(this.#batches.values());
6673

67-
this.#onscreen.delete(k);
68-
});
74+
if (keys.includes(k)) {
75+
// keep the effect offscreen, as another batch will need it
76+
var fragment = document.createDocumentFragment();
77+
move_effect(effect, fragment);
78+
79+
fragment.append(create_text()); // TODO can we avoid this?
80+
81+
this.#offscreen.set(k, { effect, fragment });
82+
} else {
83+
destroy_effect(effect);
84+
}
85+
86+
this.#onscreen.delete(k);
87+
},
88+
false
89+
);
6990
}
7091
};
7192

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
/** @import { Effect, TemplateNode } from '#client' */
2-
/** @import { Batch } from '../../reactivity/batch.js'; */
1+
/** @import { TemplateNode } from '#client' */
32
import { EFFECT_TRANSPARENT } from '#client/constants';
43
import {
54
hydrate_next,
@@ -10,10 +9,8 @@ import {
109
set_hydrate_node,
1110
set_hydrating
1211
} from '../hydration.js';
13-
import { block, branch, pause_effect, resume_effect } from '../../reactivity/effects.js';
12+
import { block } from '../../reactivity/effects.js';
1413
import { HYDRATION_START_ELSE, UNINITIALIZED } from '../../../../constants.js';
15-
import { create_text, should_defer_append } from '../operations.js';
16-
import { current_batch } from '../../reactivity/batch.js';
1714
import { BranchManager } from './branches.js';
1815
import { noop } from '../../../shared/utils.js';
1916

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -553,15 +553,16 @@ export function unlink_effect(effect) {
553553
* A paused effect does not update, and the DOM subtree becomes inert.
554554
* @param {Effect} effect
555555
* @param {() => void} [callback]
556+
* @param {boolean} [destroy]
556557
*/
557-
export function pause_effect(effect, callback) {
558+
export function pause_effect(effect, callback, destroy = true) {
558559
/** @type {TransitionManager[]} */
559560
var transitions = [];
560561

561562
pause_children(effect, transitions, true);
562563

563564
run_out_transitions(transitions, () => {
564-
destroy_effect(effect);
565+
if (destroy) destroy_effect(effect);
565566
if (callback) callback();
566567
});
567568
}
@@ -662,3 +663,20 @@ function resume_children(effect, local) {
662663
export function aborted(effect = /** @type {Effect} */ (active_effect)) {
663664
return (effect.f & DESTROYED) !== 0;
664665
}
666+
667+
/**
668+
* @param {Effect} effect
669+
* @param {DocumentFragment} fragment
670+
*/
671+
export function move_effect(effect, fragment) {
672+
var node = effect.nodes_start;
673+
var end = effect.nodes_end;
674+
675+
while (node !== null) {
676+
/** @type {TemplateNode | null} */
677+
var next = node === end ? null : /** @type {TemplateNode} */ (get_next_sibling(node));
678+
679+
fragment.append(node);
680+
node = next;
681+
}
682+
}

0 commit comments

Comments
 (0)