mirror of https://github.com/status-im/reagent.git
Add componentDidCatch support and test (error boundary)
This commit is contained in:
parent
c68f5a88f4
commit
39b0326d22
|
@ -199,6 +199,10 @@
|
||||||
(when-not (nil? f)
|
(when-not (nil? f)
|
||||||
(.call f c c))))
|
(.call f c c))))
|
||||||
|
|
||||||
|
:componentDidCatch
|
||||||
|
(fn componentDidCatch [error info]
|
||||||
|
(this-as c (.call f c c error info)))
|
||||||
|
|
||||||
nil))
|
nil))
|
||||||
|
|
||||||
(defn get-wrapper [key f name]
|
(defn get-wrapper [key f name]
|
||||||
|
@ -268,9 +272,11 @@
|
||||||
create-react-class))
|
create-react-class))
|
||||||
|
|
||||||
(defn component-path [c]
|
(defn component-path [c]
|
||||||
(let [elem (some-> (or (some-> c ($ :_reactInternalInstance))
|
;; Looks like in React 16, reactInternalFiber is the elem
|
||||||
c)
|
(let [elem (or (some-> c ($ :_reactInternalFiber))
|
||||||
($ :_currentElement))
|
(some-> (or (some-> c ($ :_reactInternalInstance))
|
||||||
|
c)
|
||||||
|
($ :_currentElement)))
|
||||||
name (some-> elem
|
name (some-> elem
|
||||||
($ :type)
|
($ :type)
|
||||||
($ :displayName))
|
($ :displayName))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
(ns reagenttest.testreagent
|
(ns reagenttest.testreagent
|
||||||
(:require [cljs.test :as t :refer-macros [is deftest testing]]
|
(:require [cljs.test :as t :refer-macros [is deftest testing]]
|
||||||
|
[react :as react]
|
||||||
[create-react-class :as create-react-class]
|
[create-react-class :as create-react-class]
|
||||||
[reagent.ratom :as rv :refer-macros [reaction]]
|
[reagent.ratom :as rv :refer-macros [reaction]]
|
||||||
[reagent.debug :as debug :refer-macros [dbg println log dev?]]
|
[reagent.debug :as debug :refer-macros [dbg println log dev?]]
|
||||||
|
@ -964,6 +965,26 @@
|
||||||
(is (re-find #"Every element in a seq should have a unique :key"
|
(is (re-find #"Every element in a seq should have a unique :key"
|
||||||
(-> e :warn first))))))))
|
(-> e :warn first))))))))
|
||||||
|
|
||||||
|
(deftest test-error-boundary
|
||||||
|
(when (>= (js/parseInt react/version) 16)
|
||||||
|
(let [error (r/atom nil)
|
||||||
|
error-boundary (fn error-boundary [comp]
|
||||||
|
(r/create-class
|
||||||
|
{:component-did-catch (fn [this e info]
|
||||||
|
(reset! error e))
|
||||||
|
:reagent-render (fn [comp]
|
||||||
|
(if @error
|
||||||
|
[:div "Something went wrong."]
|
||||||
|
comp))}))
|
||||||
|
comp1 (fn comp1 []
|
||||||
|
($ nil :foo)
|
||||||
|
[:div "foo"])]
|
||||||
|
(with-mounted-component [error-boundary [comp1]]
|
||||||
|
(fn [c div]
|
||||||
|
(r/flush)
|
||||||
|
(is (= "Cannot read property 'foo' of null" (.-message @error)))
|
||||||
|
(is (found-in #"Something went wrong\." div)))))))
|
||||||
|
|
||||||
(deftest test-dom-node
|
(deftest test-dom-node
|
||||||
(let [node (atom nil)
|
(let [node (atom nil)
|
||||||
ref (atom nil)
|
ref (atom nil)
|
||||||
|
|
Loading…
Reference in New Issue