Added support for a :node-disposed callback to be attached to any DOM node and support for passing in DOM nodes themselves as virtual DOM. Some refactoring.
This commit is contained in:
parent
8b82bb96f0
commit
857998aea6
1 changed files with 34 additions and 21 deletions
|
@ -61,11 +61,16 @@
|
||||||
|
|
||||||
(declare set-attr!)
|
(declare set-attr!)
|
||||||
|
|
||||||
|
(declare get-transition)
|
||||||
|
|
||||||
(defn- init-element-state! [dom-node element-spec]
|
(defn- init-element-state! [dom-node element-spec]
|
||||||
(let [node-id (str auto-node-id)
|
(let [node-id (str auto-node-id)
|
||||||
state (ElementState. node-id false element-spec nil)]
|
state (ElementState. node-id false element-spec nil)]
|
||||||
(set! auto-node-id (inc auto-node-id))
|
(set! auto-node-id (inc auto-node-id))
|
||||||
(set-attr! dom-node "data-freactive-id" node-id)
|
(set-attr! dom-node "data-freactive-id" node-id)
|
||||||
|
(when-let [m (-meta element-spec)]
|
||||||
|
(when-let [on-disposed (get m :node-disposed)]
|
||||||
|
(set! (.-disposed-callback state) on-disposed)))
|
||||||
(aset element-state-lookup node-id state)
|
(aset element-state-lookup node-id state)
|
||||||
;;(set! element-state-lookup (assoc element-state-lookup dom-node state))
|
;;(set! element-state-lookup (assoc element-state-lookup dom-node state))
|
||||||
state))
|
state))
|
||||||
|
@ -581,16 +586,20 @@
|
||||||
new-elem)
|
new-elem)
|
||||||
new-elem))
|
new-elem))
|
||||||
|
|
||||||
|
(defn- register-element-with-parent [parent new-elem]
|
||||||
|
(when-not (text-node? new-elem)
|
||||||
|
(when-let [parent-state (get-element-state parent)]
|
||||||
|
(let [state (get-element-state new-elem)]
|
||||||
|
(set! (.-parent-state state) parent-state)
|
||||||
|
(register-with-parent-state parent-state (get-node-id new-elem) state))))
|
||||||
|
)
|
||||||
|
|
||||||
(defn- replace-or-append-child [parent new-elem cur-elem top-level]
|
(defn- replace-or-append-child [parent new-elem cur-elem top-level]
|
||||||
(let [new-elem
|
(let [new-elem
|
||||||
(if cur-elem
|
(if cur-elem
|
||||||
(replace-child parent new-elem cur-elem top-level)
|
(replace-child parent new-elem cur-elem top-level)
|
||||||
(append-child parent new-elem))]
|
(append-child parent new-elem))]
|
||||||
(when-not (text-node? new-elem)
|
(register-element-with-parent parent new-elem)
|
||||||
(when-let [parent-state (get-element-state parent)]
|
|
||||||
(let [state (get-element-state new-elem)]
|
|
||||||
(set! (.-parent-state state) parent-state)
|
|
||||||
(register-with-parent-state parent-state (get-node-id new-elem) state))))
|
|
||||||
new-elem))
|
new-elem))
|
||||||
|
|
||||||
(defn- do-show-element [parent new-elem cur-elem]
|
(defn- do-show-element [parent new-elem cur-elem]
|
||||||
|
@ -732,22 +741,26 @@
|
||||||
(append-child! elem ch))))
|
(append-child! elem ch))))
|
||||||
|
|
||||||
(defn build-element [elem-spec]
|
(defn build-element [elem-spec]
|
||||||
(let [virtual-dom (get-virtual-dom elem-spec)
|
(let [virtual-dom (get-virtual-dom elem-spec)]
|
||||||
node
|
(cond
|
||||||
(if (string? virtual-dom)
|
(string? virtual-dom)
|
||||||
(.createTextNode js/document virtual-dom)
|
(.createTextNode js/document virtual-dom)
|
||||||
(let [virtual-dom (normalize-virtual-element virtual-dom)
|
|
||||||
node (create-dom-node (first virtual-dom))
|
(dom-node? virtual-dom)
|
||||||
state (init-element-state! node elem-spec)
|
virtual-dom
|
||||||
attrs? (second virtual-dom)
|
|
||||||
attrs (when (map? attrs?) attrs?)
|
:default
|
||||||
children (if attrs (nnext virtual-dom) (next virtual-dom))]
|
(let [ ;;virtual-dom (normalize-virtual-element virtual-dom)
|
||||||
(doseq [[k v] attrs]
|
node (create-dom-node (first virtual-dom))
|
||||||
(bind-attr! node k v state))
|
state (init-element-state! node elem-spec)
|
||||||
(when children
|
attrs? (second virtual-dom)
|
||||||
(append-children! node children))
|
attrs (when (map? attrs?) attrs?)
|
||||||
node))]
|
children (if attrs (nnext virtual-dom) (next virtual-dom))]
|
||||||
node))
|
(doseq [[k v] attrs]
|
||||||
|
(bind-attr! node k v state))
|
||||||
|
(when children
|
||||||
|
(append-children! node children))
|
||||||
|
node))))
|
||||||
|
|
||||||
(defn mount! [element child]
|
(defn mount! [element child]
|
||||||
(when-let [last-child (.-lastChild element
|
(when-let [last-child (.-lastChild element
|
||||||
|
|
Loading…
Reference in a new issue