我使用Preact作为我的视图框架(由于Facebook问题,不能使用React )。我需要使用Reactive路由器来进行位置路由,因为它比同一个团队构建的Preact路由器具有更大的灵活性。
我设法让React路由器接受Preact来代替React,但是,我不能让它匹配位置。我不确定这是兼容性问题,还是配置问题。我试过只使用一对路由( App和Account ),但它仍然不能与简化的设置一起工作。
问:,有人看到我是不是做错什么了吗?
我得到的错误是:Location "/account/12345/" did not match any routes
main.js
import { h, render } from 'preact';
import { Router, browserHistory } from 'react-router';
import { Provider } from 'react-redux';
import createStore from './createStore';
import createRoutes from './createRoutes';
process.env.DEBUG && console.log('Hello, developer!');
const history = browserHistory;
const store = createStore( history );
const routes = createRoutes( store );
render((
<Provider store={ store } key="redux-provider">
<Router history={ history } createElement={ h } routes={ routes } />
</Provider>
), document.body );
createRoutes.js
import { h } from 'preact';
import { IndexRoute, Route } from 'react-router';
// App Component
import App from './components/app';
// Sub Components
import Account from './components/account';
import Conversation from './components/conversation';
import Dashboard from './components/dashboard';
// Error Components
import BadAccount from './components/bad-account';
import NotFound from './components/not-found';
// Routes
export default ()=> (
<Route path="/" component={App}>
{/* Get URL parameter */}
<Route path="account/:accountID" component={Account}>
{/* Index Route */}
<IndexRoute component={Dashboard} />
{/* Sub Routes ( Alphabetical Please ) */}
<Route path="chat" component={Conversation} />
{/* Catch-All Route */}
<Route path="*" component={NotFound} />
</Route>
{/* Handle Invalid URIs */}
<Route path="*" component={BadAccount} />
</Route>
);
createStore.js
import { applyMiddleware, combineReducers, compose, createStore } from 'redux';
import thunk from 'redux-thunk';
import { routerMiddleware } from 'react-router-redux';
import messages from './resources/messages/reducer';
import conversation from './resources/conversation/reducer';
import layout from './resources/layout/reducer';
import profile from './resources/profile/reducer';
import contract from './resources/contract/reducer';
/*const { devToolsExtension } = window;*/
export default history => {
// Sync dispatched route actions to the history
const reduxRouterMiddleware = routerMiddleware( history );
// Create single reducer from all modules
const rootReducer = combineReducers({
messages,
conversation,
layout,
profile,
contract
});
// List redux middleware to inject
const middleware = [
thunk,
reduxRouterMiddleware
];
// Compose the createStore function
const createComposedStore = compose(
applyMiddleware( ...middleware )/*, // Figure this out...
( process.env.DEBUG && devToolsExtension ) ? devToolsExtension() : f => f*/
)( createStore );
// Create the store
const store = createComposedStore( rootReducer );
// Hook up Redux Routing middleware
// reduxRouterMiddleware.listenForReplays(store);
// Return store
return store;
};
发布于 2016-09-12 00:43:04
(OP已经解决了他的问题,但这在Google中排名很高,对新手没有多大帮助,所以我想提供一些背景信息)
预紧和预紧
预演是React的最小版本,仅重3Kb。它实现了React的API的一个子集,这里和那里有一些小的区别。它还附带了一个助手库预演-比较,它通过填充缺少的部分和修补API之间的差异来提供与React的兼容性。
反应路由器
反应路由器是一个路由器库,旨在与React一起工作。但是,您也可以使用preact-compat
使它与Preact一起工作。
成立前-公司
npm i --save preact-compat
确保在webpack / browserify配置中为react
和react-dom
设置别名,或者编写一些代码手动设置这些别名。
webpack配置实例
{
// ...
resolve: {
alias: {
'react': 'preact-compat',
'react-dom': 'preact-compat'
}
}
// ...
}
然后,您可以使用React组件作为-is。他们不会知道他们是被Preact i.s.o.渲染的。反应。看看这个预-比较-例子。
兼容性问题
请记住,当您使用Preact Compat时,您正在承担风险。杰森是个非常聪明的人,但他的图书馆只有Facebook提供的图书馆的一小部分,所以肯定会有一些不同。使用不太知名的React特性的组件可能无法正常工作。如果您遇到这样的问题,请向preact compat问题跟踪器报告(以GitHub回购的形式进行最少的复制),以帮助他进行改进。
过去有一些这样的问题阻止了React路由器无法正确地使用Preact,但是它们已经被修复了,现在您应该能够很好地使用这两个问题了。
预先的小提琴+反应-路由器
看看这个JS Fiddle作为一个有用的例子。
发布于 2016-08-29 21:46:21
更新的答案是现在有一个前置路由器包:https://www.npmjs.com/package/preact-router。
import Router from 'preact-router';
import { h } from 'preact';
const Main = () => (
<Router>
<Home path="/" />
<About path="/about" />
<Search path="/search/:query" />
</Router>
);
render(<Main />, document.body);
发布于 2016-05-19 07:22:44
发现的问题,是两个问题与Preact的兼容性反应:
上下文处理不正确:
https://github.com/developit/preact/issues/156
props.children
未正确处理:
https://github.com/developit/preact-compat/issues/47#issuecomment-220128365
https://stackoverflow.com/questions/37306197
复制相似问题