Skip to content

Commit 02f60fb

Browse files
magentaqinqinmutanhauhau
authored
[fix]destroy empty component (#7492)
* fix: destroy non-fragment element such as empty components * fix: fragment property of Empty Component is set as true in dev mode, inconsistent with production mode * chore: revert 'removal' of component.compile_options.dev * feat: add test for destroying empty component * chore: update typechecking callback * chore: revert fragment dev checks * chore: remove unnecessary comment * chore: update test for empty-component-destroy * fix: revert back the patching of console.log * use before_test and after_test Co-authored-by: qinmu <magenta2127@mail.com> Co-authored-by: tanhauhau <lhtan93@gmail.com>
1 parent 31e5f8b commit 02f60fb

File tree

5 files changed

+45
-2
lines changed

5 files changed

+45
-2
lines changed

src/compiler/compile/render_dom/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ export default function dom(
333333
// $$props arg is still needed for unknown prop check
334334
args.push(x`$$props`);
335335
}
336-
336+
// has_create_fragment is intentionally to be true in dev mode.
337337
const has_create_fragment = component.compile_options.dev || block.has_content();
338338
if (has_create_fragment) {
339339
body.push(b`

src/runtime/internal/transitions.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ export function transition_out(block: Fragment, local: 0 | 1, detach?: 0 | 1, ca
7979
});
8080

8181
block.o(local);
82+
} else if (callback) {
83+
callback();
8284
}
8385
}
8486

@@ -143,7 +145,7 @@ export function create_in_transition(node: Element & ElementCSSInlineStyle, fn:
143145
return {
144146
start() {
145147
if (started) return;
146-
148+
147149
started = true;
148150
delete_rule(node);
149151

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
<script>
3+
import { onDestroy } from 'svelte';
4+
5+
onDestroy(() => {
6+
console.log('destroy');
7+
});
8+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
let log;
2+
export default {
3+
html: `
4+
<button>destroy component</button>
5+
`,
6+
7+
before_test() {
8+
log = console.log;
9+
},
10+
after_test() {
11+
console.log = log;
12+
},
13+
14+
async test({ assert, target, window }) {
15+
const button = target.querySelector('button');
16+
const event = new window.MouseEvent('click');
17+
const messages = [];
18+
console.log = msg => messages.push(msg);
19+
await button.dispatchEvent(event);
20+
assert.htmlEqual(target.innerHTML, `
21+
<button>destroy component</button>
22+
`);
23+
assert.deepEqual(messages, ['destroy']);
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import Empty from './Empty.svelte';
3+
let active = true;
4+
</script>
5+
6+
<button on:click='{() => active = false }'>destroy component</button>
7+
8+
<svelte:component this={active ? Empty : null} />

0 commit comments

Comments
 (0)