mirror of https://github.com/sveltejs/svelte
[fix] Local transitions from #key blocks (#7286)
* fix: Local transitions from #key blocks When adding `|local` to a transition inside a {#key} block, only the outro was triggered not the intro. This PR fixes #5950 * add test case Co-authored-by: tanhauhau <lhtan93@gmail.com>pull/7467/head
parent
09b5afc8fe
commit
0b0221de99
@ -0,0 +1,37 @@
|
||||
export default {
|
||||
props: {
|
||||
x: false,
|
||||
y: 1
|
||||
},
|
||||
|
||||
test({ assert, component, target, raf }) {
|
||||
component.x = true;
|
||||
|
||||
let div = target.querySelector('div');
|
||||
assert.equal(div.foo, undefined);
|
||||
|
||||
// play both in and out transition when changed with `{#key}`
|
||||
component.y = 2;
|
||||
assert.htmlEqual(target.innerHTML, '<div></div><div></div>');
|
||||
const [leaving, incoming] = target.querySelectorAll('div');
|
||||
|
||||
raf.tick(50);
|
||||
assert.equal(leaving.foo, 0.5);
|
||||
assert.equal(incoming.foo, 0.5);
|
||||
|
||||
raf.tick(100);
|
||||
assert.htmlEqual(target.innerHTML, '<div></div>');
|
||||
assert.equal(leaving.foo, 0);
|
||||
assert.equal(incoming.foo, 1);
|
||||
|
||||
// do not play out transition when removed by `{#if}`
|
||||
component.x = false;
|
||||
assert.htmlEqual(target.innerHTML, '');
|
||||
|
||||
// do not play in transition when added back with `{#if}`
|
||||
component.x = true;
|
||||
assert.htmlEqual(target.innerHTML, '<div></div>');
|
||||
div = target.querySelector('div');
|
||||
assert.equal(div.foo, undefined);
|
||||
}
|
||||
};
|
@ -0,0 +1,19 @@
|
||||
<script>
|
||||
export let x;
|
||||
export let y;
|
||||
|
||||
function foo(node, _params) {
|
||||
return {
|
||||
duration: 100,
|
||||
tick: t => {
|
||||
node.foo = t;
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if x}
|
||||
{#key y}
|
||||
<div transition:foo|local></div>
|
||||
{/key}
|
||||
{/if}
|
Loading…
Reference in new issue