     (assoc fn-map :get-initial-state wrapped)))
 
 
+(defn- wrap-component-will-receive-props [fn-map call-fn]
+  (let [{:keys [component-will-receive-props]} fn-map
+        wrapped (fn [next-props]
+                  (let [next-props (aget next-props "cljs")]
+                    (this-as
+                     this
+                     (when-let [bound-props (aget this "cljsBoundProps")]
+                       (doseq [[prop-key state-key] bound-props]
+                         (let [a (get next-props prop-key)]
+                           (swap! (state this) assoc state-key @a)
+                           (add-watch a this (fn [_ _ old-value new-value]
+                                               (swap! (state this) assoc state-key new-value))))))
+                     (when component-will-receive-props
+                       (call-fn :component-will-receive-props component-will-receive-props
+                                (assoc (default-arg-map this)
+                                       :next-props next-props))))))]
+    (assoc fn-map :component-will-receive-props wrapped)))
+
+
 (defn- wrap-render [fn-map call-fn]
   (let [{:keys [render]} fn-map
         wrapped (fn []

    (.apply m instance (to-array args))))


(defn- default-arg-map [this]
  {:this this :props (props this) :state (state this) :refs (refs this) :locals (locals this)
   :after-update (fn [callback] (.setState this #js{} callback))})


(defn- arg-map->js [arg-map]

             #js{:cljsDefault (call-fn k f {})})))
        (wrap-if-present :component-will-mount (create-default-wrapper call-fn))
        (wrap-if-present :component-did-mount (create-default-wrapper call-fn))
        (wrap-component-will-receive-props call-fn)
        (wrap-if-present
         :should-component-update
         (fn [k f]
