Skip to main content

HTML doesn't have a way of expressing logic, like conditionals and loops. Svelte does.

To conditionally render some markup, we wrap it in an if block:

{#if user.loggedIn}
	<button on:click={toggle}> Log out </button>
{/if}

{#if !user.loggedIn}
	<button on:click={toggle}> Log in </button>
{/if}

Try it — update the component, and click on the buttons.

App.svelte
<script>
let user = { loggedIn: false };

function toggle() {
user.loggedIn = !user.loggedIn;
}
</script>

<button on:click={toggle}> Log out </button>

<button on:click={toggle}> Log in </button>

/* App.svelte generated by Svelte v4.2.19 */
import {
SvelteComponent,
detach,
element,
init,
insert,
listen,
noop,
run_all,
safe_not_equal,
space
} from "svelte/internal";

import "svelte/internal/disclose-version";

function create_fragment(ctx) {
let button0;
let t1;
let button1;
let mounted;
let dispose;

return {
c() {
button0 = element("button");
button0.textContent = "Log out";
t1 = space();
button1 = element("button");
button1.textContent = "Log in";
},
m(target, anchor) {
insert(target, button0, anchor);
insert(target, t1, anchor);
insert(target, button1, anchor);

if (!mounted) {
dispose = [
listen(button0, "click", /*toggle*/ ctx[0]),
listen(button1, "click", /*toggle*/ ctx[0])
];

mounted = true;
}
},
p: noop,
i: noop,
o: noop,
d(detaching) {
if (detaching) {
detach(button0);
detach(t1);
detach(button1);
}

mounted = false;
run_all(dispose);
}
};
}

function instance($$self) {
let user = { loggedIn: false };

function toggle() {
user.loggedIn = !user.loggedIn;
}

return [toggle];
}

class App extends SvelteComponent {
constructor(options) {
super();
init(this, options, instance, create_fragment, safe_not_equal, {});
}
}

export default App;
result = svelte.compile(source, {
generate:
css:
});
/* Add a <style> tag to see compiled CSS */