项目作者: flexsurfer

项目描述 :
React Native with shadow-cljs on steroids
高级语言: Clojure
项目地址: git://github.com/flexsurfer/rn-shadow-steroid.git
创建时间: 2020-02-22T15:00:06Z
项目社区:https://github.com/flexsurfer/rn-shadow-steroid

开源协议:

下载


rn-shadow-steroid

A Clojure library with a few functions-steroids for react native app, can be used only with shadow-cljs

IMG

Clojars

Usage

  1. {:dependencies [[rn-shadow-steroid "0.2.8"]]}

Register root reagent component in app registry

  1. (:require [steroid.rn.core :as rn])
  2. (defn root-comp []
  3. [rn/view
  4. [rn/text "HELLO WORLD"]])
  5. (defn init []
  6. (rn/register-comp "app-name" root-comp))

Register root component with HOT RELOAD

  1. (:require [steroid.rn.core :as rn])
  2. (defn root-comp []
  3. [rn/view
  4. [rn/text "HELLO WORLD"]])
  5. (defn init []
  6. (rn/register-reload-comp "app-name" root-comp))

shadow-cljs.edn

  1. {:source-paths ["src"]
  2. :dependencies [[rn-shadow-steroid "0.2.6"]]
  3. :builds {:dev
  4. {:target :react-native
  5. :init-fn app.core/init
  6. :output-dir "app"
  7. :devtools {:after-load steroid.rn.core/reload
  8. :build-notify steroid.rn.core/build-notify}}}}

Now each time you change your code it will be hot reloaded keeping an app state. NOTE react native fast refresh should be turned off

React Native components

Basic components

  1. [steroid.rn.core :as rn]
  2. rn/app-registry rn/view rn/text rn/image rn/text-input rn/scroll-view
  3. rn/touchable-highlight rn/touchable-native-feedback rn/touchable-opacity rn/touchable-without-feedback

UI components

  1. [steroid.rn.components.ui :as ui]
  2. ui/button ui/switch

List components

  1. [steroid.rn.components.list :as list]
  2. list/flat-list list/section-list

Platform

  1. [steroid.rn.components.platform :as platform]
  2. platform/platform platform/os platform/version platform/android? platform/ios?

Other components

  1. [steroid.rn.components.other :as other]
  2. other/activity-indicator other/alert other/dimensions other/keyboard-avoiding-view other/modal other/refresh-control

StatusBar components

  1. [steroid.rn.components.status-bar :as status-bar]
  2. (status-bar/set-bar-style bar-style)
  3. (status-bar/set-background-color background-color)
  4. (status-bar/set-hidden hidden)
  5. (status-bar/set-network-activity-indicator-visible network-activity-indicator-visible)
  6. (status-bar/set-translucent translucent)

Picker component

  1. yarn add @react-native-picker/picker
  1. [steroid.rn.components.picker :as picker]
  2. picker/picker picker/item

DateTimePicker component

  1. yarn add @react-native-community/datetimepicker
  1. [steroid.rn.components.datetimepicker :as datetimepicker]
  2. datetimepicker/date-time-picker

Async storage component

  1. yarn add @react-native-async-storage/async-storage
  1. [steroid.rn.components.async-storage :as async-storage]
  2. (async-storage/set-item "key" {:my-value "value"})
  3. (async-storage/get-item "key" #(println "value" %))
  4. (async-storage/remove-item "key")
  5. (async-storage/get-all-keys #(println "keys" %))
  6. (async-storage/clear)

EXAMPLE

  1. (:require [steroid.rn.core :as rn]
  2. [steroid.rn.components.list :as list])
  3. (defn item-render [{:keys [title image-url description]}]
  4. [rn/touchable-opacity {:on-press #(do "smth")}
  5. [rn/view {:style {:padding 5 :flex-direction :row :align-items :center}}
  6. [rn/image {:style {:width 50 :height 50 :margin 5 :border-radius 25 :margin-right 10}
  7. :source {:uri image-url}}]
  8. [rn/view {:style {:flex 1}}
  9. [rn/text {:style {:font-size 18 :font-family "Inter" :flex-shrink 1}} title]
  10. [rn/text {:style {:font-family "Inter" :flex-shrink 1 :color :gray :margin-top 5}
  11. :number-of-lines 2}
  12. description]]]])
  13. (defn myapp []
  14. [rn/view {:style {:flex 1 :background-color :white}}
  15. [rn/text {:style {:font-size 22 :align-self :center :margin 10 :font-family "Inter"}}
  16. "MyApp"]
  17. [list/flat-list {:data data-vector :render-fn item-render}]])

React Navigation with HOT RELOAD

Navigation container component

  1. yarn add @react-navigation/native
  1. [steroid.rn.navigation.core :as rnn]
  2. rnn/navigation-container
  3. rnn/create-navigation-container-reload

Stack components

  1. yarn add @react-navigation/stack
  1. [steroid.rn.navigation.stack :as stack]
  2. stack/stack

Bottom tabs components

  1. yarn add @react-navigation/bottom-tabs
  1. [steroid.rn.navigation.bottom-tabs :as bottom-tabs]
  2. bottom-tabs/bottom-tab

Safe area components

  1. yarn add react-native-safe-area-context
  1. [steroid.rn.navigation.safe-area :as safe-area]
  2. safe-area/safe-area-provider safe-area/safe-area-consumer safe-area/safe-area-view

EXAMPLE

  1. `yarn add @react-navigation/native @react-navigation/stack @react-navigation/bottom-tab react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-masked-view/masked-view`
  2. `cd ios; pod install; cd ..`
  1. (:require [steroid.rn.core :as rn]
  2. [re-frame.core :as re-frame]
  3. [steroid.rn.navigation.core :as rnn]
  4. [steroid.rn.navigation.stack :as stack]
  5. [steroid.rn.navigation.bottom-tabs :as bottom-tabs]
  6. [clojurernproject.views :as screens]
  7. [steroid.rn.navigation.safe-area :as safe-area]
  8. steroid.rn.navigation.events))
  9. (defn main-screens []
  10. [bottom-tabs/bottom-tab
  11. [{:name :home
  12. :component screens/home-screen}
  13. {:name :basic
  14. :component screens/basic-screen}]])
  15. (defn root-stack []
  16. [safe-area/safe-area-provider
  17. [(rnn/create-navigation-container-reload
  18. {:on-ready #(re-frame/dispatch [:init-app-db])}
  19. [stack/stack {:mode :modal :header-mode :none}
  20. [{:name :main
  21. :component main-screens}
  22. {:name :modal
  23. :component screens/modal-screen}]])]])
  24. (defn init []
  25. (rn/register-comp "ClojureRNProject" root-stack))

Notice that we register root-stack without hot reload but create navigation-container-reload.

re-frame navigation events steroid.rn.navigation.events

After steroid.rn.navigation.events has been required once, re-frame events are registered and you can use them for navigation

(re-frame/dispatch [:navigate-to :modal])

(re-frame/dispatch [:navigate-to :basic])

(re-frame/dispatch [:navigate-back])

ENJOY!