不使用JSX使用react-router

8
我正在尝试找到一个通过JavaScript API使用react-router的示例,但迄今为止还没有找到任何东西。
我的目标是将react-router与reagent和clojurescript一起使用。因此,如果有人已经实现了这个目标(即使是在Om中),我将不胜感激地接受指引。否则,一个没有JSX的简单javascript示例也会很有帮助。
第1次编辑--接近解决方案
感谢@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}"})))

提示:您可以使用适用于React的版本的JSXTransformer.js来执行JSX->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组件,因为React.isValidClass(myReagentComponent) === false。所以我们需要找出如何生成该测试通过的形式的组件。我在Stack Overflow上发布了一个问题

3个回答

10

在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);

5

一个没有使用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
我刚刚完成了一个实验仓库,用于执行这项任务。https://github.com/ghedamat/reagent-react-router 主要思路是使用Reagent自版本0.5.0-alpha3提供的新API与React进行交互。 reagent/reactify-component 让您可以在React代码中使用Reagent组件(这是路由器所需的)。
reagent/adapt-react-class 则实现了相反的功能。
我试图包装例如LinkRouterHandler之类的组件,并直接在Reagent中使用它们。
例如:
[:ul.nav.navbar-nav
  [:li
    [Link {:to "app"} "home"]]
  [:li
    [Link {:to "about"} "about page"]]]

反过来,您可以将Reagent的组件作为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以获取更深入的讨论。目前它可以工作,但肯定需要更多的输入/帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接