Fix partially formatted if chains in attributes (#2999)

This commit is contained in:
Evan Almloff authored and GitHub committed 2024-10-09 13:48:33 -05:00
1 parent d64df87aba
commit a693ddffa3
2 files changed
+28

No files matched your search

@@ -0,0 +1,13 @@
use dioxus::prelude::*;
/// Make sure that rsx! handles conditional attributes with one formatted branch correctly
/// Regression test for https://github.com/DioxusLabs/dioxus/issues/2997
#[test]
fn partially_formatted_conditional_attribute() {
let width = "1px";
_ = rsx! {
div {
width: if true { "{width}" } else { "100px" }
}
};
}
+15
View File
@@ -615,6 +615,20 @@ impl IfAttributeValue {
then_value,
else_value,
} = self;
// Quote an attribute value and convert the value to a string if it is formatted
// We always quote formatted segments as strings inside if statements so they have a consistent type
// This fixes https://github.com/DioxusLabs/dioxus/issues/2997
fn quote_attribute_value_string(value: &AttributeValue) -> TokenStream2 {
if matches!(value, AttributeValue::AttrLiteral(HotLiteral::Fmted(_))) {
quote! { #value.to_string() }
} else {
value.to_token_stream()
}
}
let then_value = quote_attribute_value_string(then_value);
let then_value = if terminated {
quote! { #then_value }
}
@@ -630,6 +644,7 @@ impl IfAttributeValue {
tokens
}
Some(other) => {
let other = quote_attribute_value_string(other);
if terminated {
quote! { #other }
} else {