--- title: "#[function_component]" description: "The #[function_component] attribute" --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; `#[function_component(_)]` turns a normal Rust function into a function component. Functions with the attribute have to return `Html` and may take a single parameter for the type of props the component should accept. The parameter type needs to be a reference to a `Properties` type (ex. `props: &MyProps`). If the function doesn't have any parameters the resulting component doesn't accept any props. The attribute doesn't replace your original function with a component. You need to provide a name as an input to the attribute which will be the identifier of the component. Assuming you have a function called `chat_container` and you add the attribute `#[function_component(ChatContainer)]` you can use the component like this: ```rust use yew::{function_component, html, Html}; #[function_component(ChatContainer)] pub fn chat_container() -> Html { html! { // chat container impl } } html! { }; ``` ## Example ```rust use yew::{function_component, html, Properties}; #[derive(Properties, PartialEq)] pub struct RenderedAtProps { pub time: String, } #[function_component(RenderedAt)] pub fn rendered_at(props: &RenderedAtProps) -> Html { html! {

{ "Rendered at: " } { &props.time }

} } ```
```rust use yew::{function_component, html, use_state, Callback}; #[function_component(App)] fn app() -> Html { let counter = use_state(|| 0); let onclick = { let counter = counter.clone(); Callback::from(move |_| counter.set(*counter + 1)) }; html! {

{ "Current value: " } { *counter }

} } ```
## Generic function components The `#[function_component(_)]` attribute also works with generic functions for creating generic components. ```rust title=my_generic_component.rs use std::fmt::Display; use yew::{function_component, html, Properties}; #[derive(Properties, PartialEq)] pub struct Props where T: PartialEq, { data: T, } #[function_component(MyGenericComponent)] pub fn my_generic_component(props: &Props) -> Html where T: PartialEq + Display, { html! {

{ &props.data }

} } // used like this html! { data=123 /> }; // or html! { data={"foo".to_string()} /> }; ```