Browse Source

handle keys

Evan Almloff 3 years ago
parent
commit
cef2f52058
2 changed files with 25 additions and 9 deletions
  1. 2 1
      examples/hot_reload.rs
  2. 23 8
      packages/rsx_interperter/src/interperter.rs

+ 2 - 1
examples/hot_reload.rs

@@ -22,7 +22,7 @@ fn app(cx: Scope) -> Element {
     cx.render(rsx! {
         div {
             width: "100%",
-            height: "100%",
+            height: "500px",
             onclick: move |_| {
                 count.modify(|count| *count + 10);
             },
@@ -34,6 +34,7 @@ fn app(cx: Scope) -> Element {
                 height: "50%",
                 textarea {
                     width: "90%",
+                    key: "1",
                     value: {
                         if rsx_code.get().is_none() {
                             let rsx_text_index: RsxTextIndex = cx.consume_context().unwrap();

+ 23 - 8
packages/rsx_interperter/src/interperter.rs

@@ -203,14 +203,29 @@ fn build_node<'a>(
             }
             let tag = bump.alloc(el.name.to_string());
             if let Some((tag, ns)) = element_to_static_str(tag) {
-                Some(factory.raw_element(
-                    tag,
-                    ns,
-                    listeners,
-                    attributes.as_slice(),
-                    children.as_slice(),
-                    None,
-                ))
+                match el.key {
+                    None => Some(factory.raw_element(
+                        tag,
+                        ns,
+                        listeners,
+                        attributes.as_slice(),
+                        children.as_slice(),
+                        None,
+                    )),
+                    Some(lit) => {
+                        let ifmt: InterperedIfmt = lit.value().parse().unwrap();
+                        let key = bump.alloc(ifmt.resolve(&ctx.captured));
+
+                        Some(factory.raw_element(
+                            tag,
+                            ns,
+                            listeners,
+                            attributes.as_slice(),
+                            children.as_slice(),
+                            Some(format_args!("{}", key)),
+                        ))
+                    }
+                }
             } else {
                 None
             }