12

View フレームワークとして Preact を使用しています( Facebook IP の問題により React を使用できません) 。同じチームが構築した Preact Router よりも柔軟性があるため、ロケーション ルーティングに React Router を使用する必要がありました。

React Router が React の代わりに Preact を受け入れるようにすることはできましたが、場所を一致させることはできません。互換性の問題なのか、設定の問題なのかわかりません。1 組のルート ( App と Account ) だけを使用してみましたが、単純化されたセットアップではまだ機能しません。

Q:ここで私が何か間違ったことをしているかどうか、誰にもわかりますか?

私が得るエラーは次のとおりです。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;
};
4

4 に答える 4

15

(OPはすでに彼の問題を解決しましたが、これはGoogleで上位にランクされており、初心者にはあまり役に立たないため、背景情報を提供すると思いました)

Preact と preact-compat

preactは React の最小バージョンで、重さはわずか 3Kb です。React の API のサブセットを実装していますが、あちこちにいくつかの小さな違いがあります。また、欠落している部分を埋め、API の相違点を修正することで、React との互換性を提供するヘルパー ライブラリpreact-compatも付属しています。

反応ルーター

react-routerは、React で動作するように設計されたルーター ライブラリです。ただし、を使用して、Preact でも動作させることができますpreact-compat

preact-compat の設定

npm i --save preact-compat

reactおよびreact-domwebpack / browserify 構成でエイリアスを設定するか、これらのエイリアスを手動で設定するコードを記述してください。

サンプル webpack 構成

{
    // ...
    resolve: {
        alias: {
            'react': 'preact-compat',
            'react-dom': 'preact-compat'
        }
    }
    // ...
}

その後、React コンポーネントをそのまま使用できます。彼らは、Preact iso React によってレンダリングされていることを知りません。このpreact-compat-exampleを見てください。

互換性の問題

Preact Compat を使用しているときは、リスクを冒していることに注意してください。Jason は非常に頭の良い人物ですが、彼のライブラリは Facebook が提供するライブラリのサイズのほんの一部にすぎないため、いくつかの違いがあることは間違いありません。React のあまり知られていない機能を使用するコンポーネントは、正しく動作しない可能性があります。このような問題が発生した場合は、preact-compat イシュー トラッカー(GitHub リポジトリの形で最小限の再現で) に報告して、改善を支援してください。

過去に、React-Router が Preact で正しく動作するのを妨げるような問題がいくつかありましたが、その後修正され、2 つをうまく組み合わせて使用​​できるようになりました。

Preact + React-Router のフィドル

実際の例については、この JS Fiddleをご覧ください。

于 2016-09-12T08:43:04.540 に答える
-1

問題が見つかりました。React との Preact の互換性に関する 2 つの問題でした。

正しく処理されないコンテキスト:

https://github.com/developit/preact/issues/156

props.children正しく処理されない:

https://github.com/developit/preact-compat/issues/47#issuecomment-220128365

于 2016-05-19T15:22:44.960 に答える