Fix partially formatted if chains in attributes (#2999)
This commit is contained in:
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" }
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user