我正在尝试通过javascript API找到使用react-router的示例,但到目前为止无法找到任何内容。
我的目标是使用react-router与试剂和clojurescript。因此,如果有人已经开始工作(即使使用Om),我也会欣赏正确的方向。否则,只有一个没有JSX的简单javascript示例会有所帮助。
感谢@FakeRainBrigand帮助将JSX翻译成普通的JS。
这是React.js 0.11.2版本(这是Reagent当前版本使用的版本 - 0.4.3)。
/** @jsx React.DOM */
Routes({location: "history"},
Route({name: "app", path: "/", handler: App},
Route({name: "inbox", handler: Inbox}),
Route({name: "calendar", handler: "{Calendar}"})))
提示:您可以使用JSXTransformer.js
为您的React版本执行JSX-&gt; JS转换。只需将其包含在您的页面中,然后使用浏览器的开发者控制台执行JSXTransformer.transform('/** @jsx React.DOM */<Route location="history">...</Route>').code
这是Clojurescript版本:
(ns mytest.core
(:require [reagent.core :as reagent :refer [atom]])
(defn home []
[:div [:h1 "Home Component Placeholder"]])
(defn info []
[:div [:h1 "Info Component Placeholder"]])
(defn build-component [comp]
(reagent/as-component (if (fn? comp) (comp) comp)))
(defn react-router []
(js/ReactRouter.Routes #js {:location "history"}
(js/ReactRouter.Route #js {:name "app" :path "/" :handler (build-component home)}
(js/ReactRouter.DefaultRoute #js {:handler (build-component home)})
(js/ReactRouter.Route #js {:name "about" :path "/about" :handler (build-component info)}))))
不幸的是,默认情况下,Reagent创建的组件在React.isValidClass(myReagentComponent) === false
中似乎不是“标准”React组件。所以剩下的就是弄清楚如何以通过该测试的形式生成组件。我发布了Stack Overflow question。
答案 0 :(得分:9)
在JavaScript中的0.12中看起来像这样:
var Router = require('react-router');
var Route = React.createFactory(Router.Route);
var DefaultRoute = React.createFactory(Router.DefaultRoute);
var NotFoundRoute = React.createFactory(Router.NotFoundRoute);
React.render((
React.createElement(Router, {location: "history"},
Route({path: "/", handler: App},
DefaultRoute({handler: Home}),
Route({name: "about", handler: About}),
Route({name: "users", handler: Users},
Route({name: "recent-users", path: "recent", handler: RecentUsers}),
Route({name: "user", path: "/user/:userId", handler: User}),
NotFoundRoute({handler: UserRouteNotFound})
)
),
NotFoundRoute({handler: NotFound})
)
), document.body);
答案 1 :(得分:4)
没有JX而没有使用createElement
的例子(如果是路线则对我没有意义):
// this snippet was tested with react 0.13.1
// and react-router 0.13.2
import Router from 'react-router';
import App from './components/App';
import Inbox from './components/Inbox';
const AppRoute = Router.createRoute({
path: '/',
name: 'app',
handler: App
});
const InboxRoute = Router.createRoute({
name: 'inbox',
handler: Inbox,
parentRoute: AppRoute
});
// Important: you have to export the root route wrapped in array
export default [AppRoute];
答案 2 :(得分:2)
我刚刚完成了一个实验存储库来完成这项工作 https://github.com/ghedamat/reagent-react-router
主要思想是使用Reagent提供的新版apis,因为版本为0.5.0-alpha3,用于与React互操作
reagent/reactify-component
让您在React代码中使用试剂组件(这是路由器要求的)
和reagent/adapt-react-class
反之亦然。
我尝试做的是包装Link
和RouterHandler
之类的组件,并直接在试剂中使用。
即:
[:ul.nav.navbar-nav
[:li
[Link {:to "app"} "home"]]
[:li
[Link {:to "about"} "about page"]]]
相反,您可以将试剂的组件handlers
传递给ReactRouter.Router
对象。
(def routes
(Route {:name "app" :path "/" :handler app-page}
(Route {:name "about" :path "about" :handler about-page}))
(DefaultRoute {:handler default-page-meta})))
实施非常简单(与您更新的问题类似):https://github.com/ghedamat/reagent-react-router/blob/master/src/cljs/reagent_react_router/react_router.cljs 请阅读README以进行更深入的讨论。
它到目前为止工作但绝对可以使用更多输入/帮助。