如何在clojurescript中使用React Navigation的StackNavigator

时间:2017-04-01 05:10:14

标签: react-native react-navigation clojurescript cljsrn

我是clojurescript和试剂的新手。我尝试在我的react-native应用程序中使用react-navigation,但是我收到此错误

Error rendering component (in env.main.reloader > exp_cljs.core.app_root > reagent2)

这是我的代码

(def react-navigation (js/require "react-navigation"))
(def StackNavigator (aget react-navigation "StackNavigator"))

(defn Home
  []
  [text "Hello Navigator"])

(defn SimpleApp
  []
  (StackNavigator
    (clj->js {:Home {:screen (r/create-class {:reagent-render (Home)})}})))

(defn init []
  (dispatch-sync [:initialize-db])
  (.registerComponent rn/app-registry "main" #(r/reactify-component app-root)))

这是我的app-root

(defn app-root []
  (SimpleApp)); -- error
  ;(r/create-class {:reagent-render SimpleApp}); error
  ;(r/as-element (SimpleApp)); -- error
  ;(r/adapt-react-class SimpleApp)); --  error

2 个答案:

答案 0 :(得分:0)

  (ns same.app
  (:require [reagent.core :as r]
            [same.ui :as ui]
            [same.util :as u]
            [same.screens.auth :refer [AuthScreen]]
          ;  [same.screens.reg :refer [RegScreen]]
         ;  [same.screens.resend :refer [ResendScreen]]
            [same.screens.splash :refer [SplashScreen]]
           ; [same.screens.drawer :refer [Drawer]]
            [same.screens.presentation :refer [Presentation]]))

(def routes #js {;:Drawer #js {:screen (r/reactify-component Drawer)}
                 :AuthScreen #js {:screen (r/reactify-component AuthScreen)}
                 ;:RegScreen #js {:screen (r/reactify-component RegScreen)}
                 ;:ResendScreen #js {:screen (r/reactify-component ResendScreen)}
                 :Presentation #js {:screen (r/reactify-component Presentation)}
                 :Splash #js {:screen (r/reactify-component SplashScreen)}})

(def Routing (ui/StackNavigator.
               routes
               #js {:initialRouteName "Splash"
                    :headerMode "none"
                    :mode "modal"}))

(def routing (r/adapt-react-class Routing))

(defn AppNavigator []
  (fn []
    [routing]))

和android.core:

(ns same.android.core
  (:require [reagent.core :as r :refer [atom]]
            [re-frame.core :refer [dispatch-sync]]
            [same.ui :as ui]
            [same.events]
            [same.subs]
            [same.app :refer [AppNavigator]]))

(aset js/console "disableYellowBox" true)

(defn app-root []
  (fn []
    [AppNavigator]))

(defn init []
  (dispatch-sync [:initialize-db])
  (.registerComponent ui/app-registry "Same" #(r/reactify-component app-root)))

答案 1 :(得分:0)

诀窍是将React Native组件转换为Reagent组件,并在需要时将其转换回去。在以下示例中,省略了login-screenmain-screen的定义,它们只是常规的Reagent组件。

(def react-navigation (js/require "react-navigation"))
(def stack-navigator (.-createStackNavigator react-navigation))
(def switch-navigator (.-createSwitchNavigator react-navigation))
; ...
; ...
; ...
(defn application-nav-stack []
  (stack-navigator (clj->js { "MainApp" (r/reactify-component main-screen) })))

(defn authentication-nav-stack []
  (stack-navigator (clj->js { "Login" (r/reactify-component login-screen) })))

(defn app-navigation-switch []
  (switch-navigator
    (clj->js { :Auth (authentication-nav-stack)  :MainApp (application-nav-stack)  })
    (clj->js { :initialRouteName :Auth } )))

(defn app-root []
  [ (r/adapt-react-class (app-navigation-switch)) ] )

(defn init []
  (dispatch-sync [:initialize-db])
  (.registerComponent app-registry "MyApp" #(r/reactify-component app-root)))

每当将Reagent组件传递给ReactNavigation函数时,都需要使用reactify-component将其转换为本地JS形式;每当需要将ReactNavigation组件用作Reagent组件的一部分时,就需要使用adapt-react-class将其转换回去。