--- title: Component directives --- ## on:_eventname_ ```svelte <!--- copy: false ---> on:eventname={handler} ``` Components can emit events using [`createEventDispatcher`](/docs/svelte#createeventdispatcher) or by forwarding DOM events. ```svelte <script> import { createEventDispatcher } from 'svelte'; const dispatch = createEventDispatcher(); </script> <!-- programmatic dispatching --> <button on:click={() => dispatch('hello')}> one </button> <!-- declarative event forwarding --> <button on:click> two </button> ``` Listening for component events looks the same as listening for DOM events: ```svelte <SomeComponent on:whatever={handler} /> ``` As with DOM events, if the `on:` directive is used without a value, the event will be forwarded, meaning that a consumer can listen for it. ```svelte <SomeComponent on:whatever /> ``` ## --style-props ```svelte <!--- copy: false ---> --style-props="anycssvalue" ``` You can also pass styles as props to components for the purposes of theming, using CSS custom properties. Svelte's implementation is essentially syntactic sugar for adding a wrapper element. This example: ```svelte <Slider bind:value min={0} --rail-color="black" --track-color="rgb(0, 0, 255)" /> ``` Desugars to this: ```svelte <div style="display: contents; --rail-color: black; --track-color: rgb(0, 0, 255)"> <Slider bind:value min={0} max={100} /> </div> ``` **Note**: Since this is an extra `<div>`, beware that your CSS structure might accidentally target this. Be mindful of this added wrapper element when using this feature. For SVG namespace, the example above desugars into using `<g>` instead: ```svelte <g style="--rail-color: black; --track-color: rgb(0, 0, 255)"> <Slider bind:value min={0} max={100} /> </g> ``` **Note**: Since this is an extra `<g>`, beware that your CSS structure might accidentally target this. Be mindful of this added wrapper element when using this feature. Svelte's CSS Variables support allows for easily themeable components: ```svelte <style> .potato-slider-rail { background-color: var(--rail-color, var(--theme-color, 'purple')); } </style> ``` So you can set a high-level theme color: ```css /* global.css */ html { --theme-color: black; } ``` Or override it at the consumer level: ```svelte <Slider --rail-color="goldenrod" /> ``` ## bind:_property_ ```svelte bind:property={variable} ``` You can bind to component props using the same syntax as for elements. ```svelte <Keypad bind:value={pin} /> ``` While Svelte props are reactive without binding, that reactivity only flows downward into the component by default. Using `bind:property` allows changes to the property from within the component to flow back up out of the component. ## bind:this ```svelte <!--- copy: false ---> bind:this={component_instance} ``` Components also support `bind:this`, allowing you to interact with component instances programmatically. ```svelte <ShoppingCart bind:this={cart} /> <button on:click={() => cart.empty()}> Empty shopping cart </button> ``` > Note that we can't do `{cart.empty}` since `cart` is `undefined` when the button is first rendered and throws an error.