Bläddra i källkod

Fix partially formatted if chains in attributes (#2999)

Evan Almloff 8 månader sedan
förälder
incheckning
a693ddffa3
2 ändrade filer med 28 tillägg och 0 borttagningar
  1. 13 0
      packages/core/tests/conditional_formatted_attributes.rs
  2. 15 0
      packages/rsx/src/attribute.rs

+ 13 - 0
packages/core/tests/conditional_formatted_attributes.rs

@@ -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 - 0
packages/rsx/src/attribute.rs

@@ -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 {