TbW*_*321 11 javascript reactjs react-router preact
我使用Preact作为我的View框架(由于Facebook IP问题,不能使用React).我需要使用React Router进行位置路由,因为它比同一个团队构建的Preact Router具有更大的灵活性.
我设法让React Router接受Preact代替React,但是,我无法让它匹配位置.我不确定这是兼容性问题还是配置问题.我试过只使用一对路线(应用程序和帐户),它仍然无法使用简化的设置.
问:有谁看到我在这里做错了什么?
我得到的错误是: 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 );
Run Code Online (Sandbox Code Playgroud)
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>
);
Run Code Online (Sandbox Code Playgroud)
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;
};
Run Code Online (Sandbox Code Playgroud)
Sti*_*itt 13
(OP已经解决了他的问题,但这在Google中排名很高,对新手来说不是很有帮助,所以我想我会提供一些背景信息)
preact是React的最小版本,重量仅为3Kb.它实现了React API的一个子集,在这里和那里有一些小的差异.它还附带了一个辅助库,preact-compat,它通过填充缺少的部分和修补API差异来提供与React的兼容性.
react-router是一个设计用于React的路由器库.但你可以使用Preact使它与Preact一起使用preact-compat.
npm i --save preact-compat
Run Code Online (Sandbox Code Playgroud)
请确保您设置别名react,并react-dom在你的WebPack/browserify配置,或编写一些代码来手动设置这些别名.
{
// ...
resolve: {
alias: {
'react': 'preact-compat',
'react-dom': 'preact-compat'
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后您可以按原样使用React组件.他们不会知道它们是由Preact iso React渲染的.看看这个preact-compat-example.
请记住,当您使用Preact Compat时,您将承担风险.杰森是一个非常聪明的人,但他的图书馆只是Facebook提供的图书馆的一小部分,所以肯定会有一些差异.使用React鲜为人知的功能的组件可能无法正常工作.如果您遇到此类问题,请将它们报告给preact-compat问题跟踪器(以GitHub存储库的形式进行最少的复制)以帮助他改进它.
过去有一些这样的问题阻止了React-Router与Preact的正常工作,但是它们已经修复了,你现在应该可以很好地使用这两个了.
看一下这个JS Fiddle的工作实例.
| 归档时间: |
|
| 查看次数: |
4831 次 |
| 最近记录: |