---
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()} />
};
```