Skip to content

Commit

Permalink
docs: demonstrate extending both global and element attributes (#3555)
Browse files Browse the repository at this point in the history
Co-authored-by: fabian <[email protected]>
  • Loading branch information
Plebshot and fabian authored Jan 13, 2025
1 parent 1419d9c commit a621cb8
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 10 deletions.
36 changes: 31 additions & 5 deletions packages/core-macro/docs/component.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,23 +301,49 @@ The `extends` attribute lets you extend your props with all the attributes from
```rust, no_run
# use dioxus::prelude::*;
#[component]
fn Button(
fn Card(
// You can use the `extends` attribute on a field with the type `Vec<Attribute>` to extend the props with all the attributes from an element or the global element attributes.
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
) -> Element {
rsx! {
// Instead of copying over every single attribute, we can just spread the attributes from the props into the button.
button { ..attributes, "button" }
// Instead of copying over every single attribute, we can just spread the attributes from the props into the element.
div { ..attributes, "card" }
}
}
rsx! {
// Since we extend global attributes, you can use any attribute that would normally appear on the button element.
Button {
// Since we extend global attributes, you can use any attribute that would normally appear on elements.
Card {
width: "10px",
height: "10px",
color: "red",
}
};
```

To extend the props with both the global attributes and the attributes of a specific element, you can use the `extends` attribute multiple times:

```rust, no_run
# use dioxus::prelude::*;
#[component]
fn Button(
#[props(extends = GlobalAttributes, extends = button)]
attributes: Vec<Attribute>,
) -> Element {
rsx! {
button { ..attributes, "button" }
}
}
rsx! {
Button {
// A global attribute
width: "10px",
// A button specific attribute
disabled: true,
}
};
```

Note that extending from multiple elements will only work if the elements don't have conflicting attributes.
40 changes: 35 additions & 5 deletions packages/core-macro/docs/props.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,26 +314,56 @@ The `extends` attribute lets you extend your props with all the attributes from
```rust, no_run
# use dioxus::prelude::*;
#[derive(Props, PartialEq, Clone)]
struct ButtonProps {
struct CardProps {
/// You can use the `extends` attribute on a field with the type `Vec<Attribute>` to extend the props with all the attributes from an element or the global element attributes.
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
}
#[component]
fn Card(props: CardProps) -> Element {
rsx! {
// Instead of copying over every single attribute, we can just spread the attributes from the props into the element.
div { ..props.attributes, "card" }
}
}
rsx! {
// Since we extend global attributes, you can use any attribute that would normally appear on elements.
Card {
width: "10px",
height: "10px",
color: "red",
}
};
```

To extend the props with both the global attributes and the attributes of a specific element, you can use the `extends` attribute multiple times:

```rust, no_run
# use dioxus::prelude::*;
#[derive(Props, PartialEq, Clone)]
struct ButtonProps {
#[props(extends = GlobalAttributes, extends = button)]
attributes: Vec<Attribute>,
}
#[component]
fn Button(props: ButtonProps) -> Element {
rsx! {
// Instead of copying over every single attribute, we can just spread the attributes from the props into the button.
button { ..props.attributes, "button" }
}
}
rsx! {
// Since we extend global attributes, you can use any attribute that would normally appear on the button element.
Button {
// A global attribute
width: "10px",
height: "10px",
color: "red",
// A button specific attribute
disabled: true,
}
};
```

Note that extending from multiple elements will only work if the elements don't have conflicting attributes.

0 comments on commit a621cb8

Please sign in to comment.