--- title: 'Function Components' slug: /concepts/function-components --- Lets revisit this previous statement: > Yew mostly operates on the idea of keeping everything that a reusable piece of > UI may need, in one place - rust files. It is only partially correct, "rust files" should be replaced with "components". ## What are Components? Components are the building blocks of Yew. They: - Take arguments in form of [Props](./properties.mdx) - Can have their own state - Get computed into HTML visible to the user (DOM) ## Two flavours of Yew Components You are currently reading about function components - the recommended way to write components when starting with Yew. But we have to note that there is a more advanced, but less recommended way to write them - [Struct components](advanced-topics/struct-components/introduction.mdx) ## Creating function components To create a function component add the `#[function_component]` attribute to a function. Also name the function in PascalCase as it is the convention for naming components. ```rust use yew::{function_component, html, Html}; #[function_component] fn HelloWorld() -> Html { html! { "Hello world" } } // Then somewhere else you can use the component inside the `html!` #[function_component] fn App() -> Html { html! {} } ``` ## What happens to components Yew will build a tree of these components that from the previous example would look like this: ```md | ``` It will call those functions / function components to compute a virtual version of the DOM (VDOM) that you as the library user see as the `Html` type. Yew will compare current DOM with VDOM and only update the new/changed/necessary parts. This is what we call **rendering**. :::note Behind the scenes `Html` type is just an alias for `VNode` - virtual node. :::