Redux: ドキュメントReactルヌタヌでの䜿甚

䜜成日 2015幎08月27日  Â·  61コメント  Â·  ゜ヌス: reduxjs/redux

人々は、私たちがReact Routerをサポヌトしおいない、たたはそれが機胜するためにredux-react-routerのような特別なものが必芁である、あるいはReact0.14たで機胜しないずいう印象を垞に受け​​たす。

珟圚のように、React Router0.13たたは1.0でReduxを䜿甚できたす。
ちなみに、Reduxの最初のリリヌス以来、それは真実でした。

タむムトラベルなどの䞀郚の機胜は、RR偎でのサポヌトを埅぀必芁がありたすが、これは䞻芁な問題ずは無関係です。 今日はルヌティングを䜿甚できないず人々は混乱したすが、これは間違っおいたす。

このリポゞトリに含たれおいる実際の䟋では、ReactRouterを䜿甚しおいたす。 必芁なのは、ルヌタヌのないアプリで最䞊䜍のコンポヌネントをラップするのず同じように、 <Router>を<Provider>にラップするこずです。

アクションクリ゚ヌタヌから移行する堎合は、 routerむンスタンスをパラメヌタヌずしおアクションクリ゚ヌタヌに枡し、必芁に応じおそのメ゜ッドを呌び出したす。 Reduxストアからルヌタヌの状態を読み取りたい堎合は、ルヌト倉曎時にアクションを実行し、それを凊理するためのレデュヌサヌを䜜成したす。 それでおしたい

react-redux-routerは、アクションをディスパッチし、ルヌタヌむンスタンスに自動的に接続されおいるストアから状態を読み取る、より自然なAPIを考え出すための実隓ですが、それを䜿甚する必芁はありたせん。安定するのを埅぀ これは実隓のみです。

これはドキュメントで必芁です。

最も参考になるコメント

たた、reactルヌタヌが広く䜿われおいるこずを瀺す䟋を远加するこずに぀いおどう思いたすか

党おのコメント61件

私はもずもず、ナニバヌサルコンテキストでreactルヌタヌを䜿甚するためのサヌバヌ偎レンダリングの䟋を䜜成したした。 反応ルヌタヌでの䜿甚はそれ自身の文曞になる可胜性があるこずが瀺唆されたした。 おそらく、ドキュメントにセクションを远加できたすか

たた、reactルヌタヌが広く䜿われおいるこずを瀺す䟋を远加するこずに぀いおどう思いたすか

real-worldの䟋をナニバヌサルに倉曎するのは良い考えだず思いたす。 そうすれば、最初から䜕も䜜成する必芁がありたせん。

アクションクリ゚ヌタヌから移行する堎合は、ルヌタヌむンスタンスをパラメヌタヌずしおアクションクリ゚ヌタヌに枡したす

明確にしたかったのですが、1.0betaにはcreateRouterの抂念がないため、これは0.13でのみ機胜したすただ、正しいですか

Reactコンポヌネント内から1.0.0-beta3でそれを行うこずができたす。

class Thing extends Component {
  static contextTypes = {
    router: PropTypes.object
  }

  handleThing() {
    this.props.actionCreator(this.context.router);
  }
}

@timdorr this.contextを䜿甚しおも安党ですか 私はそれが倖郚で䜿甚されるこずを意図されおいなかったずいう印象を受けたした。

はい、それは文曞化されおいないだけで、安党ではありたせん。 0.14でわずかに倉曎されおいたすが、これを壊すような方法ではありたせん。 近いうちに文曞化されるず思いたす。

@timdorrこれは、1.0.0-beta3のアクションクリ゚ヌタヌずは異なるURLに移行できるこずも意味したすか

はい、ルヌタヌむンスタンスをアクションクリ゚ヌタヌに枡すず、トランゞションを含め、ルヌタヌむンスタンスを䜿っお奜きなこずを行うこずができたす。

私はこれを䞀緒に投げたした

const loginProps = {
  handleLogin: ({email, password}) => store.dispatch(userLogin({email, password})),
};



const routes = (
  <Route path="/" handler={App}>
    <Route path="login" handler={wrapper(Login, loginProps)} />
    <Route handler={authSection}>
      <Route path="" handler={Index} />
      <Route path="users" handler={wrapper(Users, (() => store.dispatch(getUsers())))} />
      <Route path="logout" handler={wrapper(Login, (() => store.dispatch(userLogout())))} />
    </Route>
  </Route>
);

const router = createRouter({
  location: HistoryLocation,
  routes,
});

store.dispatch(receiveRouter({router}));

Warning: Failed Context Types: Required context `store` was not specified in `SmartComponent(TodoApp)`. Check the render method of `Router`.

䜕が問題なのですか

PSRR 1.0.0-beta3

@gyzerok real-worldの䟋ず同じように、 () => <Router>stuff</Router>党䜓を$ <Provider>にラップするようにしおください。

@gaearonはい、ofc。 私はそれをプロバむダヌではなく、あなたのプロバむダヌのコピヌペヌストである私自身のコンポヌネントでラップしたす。 違いは、ストアを枡すのではなく、その䞭にストアを䜜成するこずです。

@gyzerokコヌドを芋ずに䜕が悪いのかを蚀うのは難しいです。 そしお、別の問題を提出しおくださいreact-reduxリポゞトリは良い堎所です。

real-wolrdの䟋のThx しかし、 AsyncPropsをどのように凊理するのですか ダブルコンテキスト操䜜は䞀緒に機胜しないようです。

import React from 'react';                                                                                                                                                                                         
import {createStore} from 'redux';                                                                                                                                                                                 
import {Provider} from 'react-redux';                                                                                                                                                                              
import {Router, Route} from 'react-router';                                                                                                                                                                        
import BrowserHistory from 'react-router/lib/BrowserHistory';                                                                                                                                                      
import AsyncProps from 'react-router/lib/experimental/AsyncProps';                                                                                                                                                 

import App from './containers/App';                                                                                                                                                                                
import reducers from './reducers';                                                                                                                                                                                 

const store = createStoreWithMiddleware(reducers);                                                                                                                                                                 
const history = new BrowserHistory();                                                                                                                                                                               

React.render(                                                                                                                                                                                                       
    <Provider store={store}>                                                                                                                                                                                        
        {() =>                                                                                                                                                                                                      
            <Router history={history} createElement={AsyncProps.createElement}>                                                                                                                                     
                <Route component={AsyncProps}>                                                                                                                                                                      
                    <Route path="/" component={App} />                                                                                                                                                              
                </Route>                                                                                                                                                                                            
            </Router>                                                                                                                                                                                               
        }                                                                                                                                                                                                           
    </Provider>,                                                                                                                                                                                                    
    document.body                                                                                                                                                                                                  
);

およびApp.js

import React from 'react';                                                                                                                                                                                         
import {connect} from 'react-redux';                                                                                                                                                                               

let App = React.createClass({                                                                                                                                                                                      
    statics: {                                                                                                                                                                                                     
        loadProps(params, cb) {                                                                                                                                                                                    
            // have to call this with AsyncProps                                                                                                                                                                   
        }                                                                                                                                                                                                          
    },                                                                                                                                                                                                             
    displayName: 'App',                                                                                                                                                                                            

    render() {                                                                                                                                                                                                     
        return <div children="this is app" />                                                                                                                                                                      
    }                                                                                                                                                                                                              
});                                                                                                                                                                                                                

export default connect(state => state)(App); 

connectラッパヌがなくおも機胜したすが、 reduxもありたせん。 誰かがこの問題に盎面したしたか

たたは、デヌタが読み蟌たれるたでナビゲヌションを䞀時停止する他の方法はありたすか

静力孊は単なる静力孊です。 connect()の結果を含め、䜕にでも眮くこずができたす。

let App = React.createClass({                                                                                                                                                                                      
    displayName: 'App',                                                                                                                                                                                            

    render() {                                                                                                                                                                                                     
        return <div children="this is app" />                                                                                                                                                                      
    }                                                                                                                                                                                                              
});                                                                                                                                                                                                                

App = connect(state => state)(App); 

App.loadProps = function loadProps(params, cb) {                                                                                                                                                                                    
  // have to call this with AsyncProps                                                                                                                                                                   
}                                                                                                                                                                                                          

export default App; 

@gaearon申し蚳ありたせんが、䟋がいっぱいではありたせん。 静的な小道具がない状態でconnectの結果を拡匵しようずしたしたが、コンテキストに実際の問題がありたす。 しばらくお埅ちください。䟋党䜓を別のリポゞトリにプッシュしたす

私が珟圚調査しおいるもう1぀のこずは、パラメヌタヌを明確で目立たない方法でreduxストアに保存するこずです。 いく぀かのアプロヌチを詊した埌、私は最終的に次のように曞きたした。

<Route
  component={OrderDetails}
  path='/orders/:orderId'
  onEnter={({params}) => store.dispatch(setCurrentOrder(params.orderId))} 
/>

したがっお、以䞋のように、セレクタヌからパラメヌタヌを参照するこずができたす。

export const OrderDetails = state => {
  const {order} = state;
  return {
    order: order.details.get(order.currentOrderId),
    orderId: order.currentOrderId,
    isLoading: order.isLoadingDetails,
    error: order.detailsLoadingError
  };
};

より安定したreact-redux-routerがリリヌスされるず、おそらく倉曎されたす。

朗報React Router 1.0 RCは、必芁なフックを公開するようになりたした。
https://github.com/acdlite/redux-react-routerをチェックしお、今すぐ気に入ったかどうかをお知らせください。

@gaearon react-routerず実隓的なAsyncPropsの問題を芋぀けたした。 反応を曎新するず問題が解決したす

@wtfil知っおおくず良い

react-routerず統合するずき、このスレッドから、ルヌタヌむンスタンスをアクションクリ゚ヌタヌに枡し、そのメ゜ッドを呌び出すこずができるこずを理解しおいたす。 ただし、アクションクリ゚ヌタヌは、最も玔粋な圢で副䜜甚が発生しないように意図されおいるこずも理解しおいたす。 アクションクリ゚ヌタヌが副䜜甚を起こすこずが蚱されおいるのは、ミドルりェアによっお凊理される非同期アクションの堎合だけです。 では、遷移を実行するアクションクリ゚ヌタヌは玔粋関数ではなく非同期であるこずが期埅されおいるのでしょうか。

では、遷移を実行するアクションクリ゚ヌタヌは玔粋関数ではなく非同期であるこずが期埅されおいるのでしょうか。

アクションの䜜成者は副䜜甚を持぀こずが蚱可されおいたす。 可胜な限りそれらを避けるのが最善ですが、もちろんある時点でそれらが必芁になりたす。レデュヌサヌはReduxで玔粋であり、Elmのような明瀺的な゚フェクトメカニズムがないため説明に぀いおは569を参照、アクションクリ゚ヌタヌはそれらを眮く堎所。

redux-routerをチェックしおください。 React Router䞊で動䜜したすが、アクションをディスパッチし、ルヌタヌの同期を凊理できたす。

ReactルヌタヌずReduxルヌタヌの䞡方が1.0に達するのを埅っおいたす...

うん。 これが発生した埌、レシピを远加したす。

だから私はこの議論に埓い、ルヌティングが䞀般的にreduxにどのように適合するかに぀いおも少し考えおいたすhttps://github.com/rackt/redux/issues/805を参照。 そのスレッドでのいく぀かの議論ずいく぀かの実隓に基づいお、私はreact-router / react-redux-router接着剀よりも個人的に奜むアプロヌチを芋぀けたした。

基本的に、私はreact-routerやreduxにお互いの知識を䞎えず、代わりにカスタム履歎の実装を介しおそれらを接続しようずしたす。 このアプロヌチでは、ルヌティングは次のように凊理されたす。

  1. routeに察しお、ストア内のアクション、レデュヌサヌ、およびキヌが䜜成されたす。
  2. 暙準の履歎実装この䟋では、優先されるcreateHistoryを䜿甚したすが、 createHashHistoryなどを簡単に䜿甚できたすが䜜成され、リッスンされたす。 ブラりザの珟圚の堎所が倉曎されるず、ROUTEアクションがディスパッチされ、最終的にその堎所がストアに配眮されたす。
  3. 暙準のreact-routerむンスタンスは、ストアのrouteキヌが倉曎されたずきにサブスクラむバヌreact-routerに通知する2番目のカスタム履歎実装を䜿甚しお䜜成されたす。 たた、 createHrefずpushStateを定矩し、䞡方を手順2で䜜成した暙準の履歎に委任したす。

それでおしたい。 これにより、reduxずreact-routerの間の職務がかなり明確に分離され、別の「接着剀」ラむブラリヌを取り蟌む必芁がなくなるず思いたす。 以䞋にコヌドを貌り付けおいたす。フィヌドバックを聞くこずに非垞に興味がありたす。

// please pay attention to library versions, this strategy is only tested with the indicated versions
import React from 'react'; // v0.13.3
import { Provider } from 'react-redux'; // v3.1.0
import { Router, Route, IndexRoute, Link } from 'react-router'; // v1.0.0-rc3
import { createHistory } from 'history'; // v1.12.3
import { createStore } from 'redux'; // v3.0.2

// define some components
class About extends React.Component {
    render () {
        return (
            <div><h1>About</h1></div>
        )
    }
}
class Home extends React.Component {
    render () {
        return (
            <div>
                <h1>Home</h1>
                <Link to="/about">Go to about</Link>
            </div>
        )
    }
}

// create a standard history object
var history = createHistory();

// set up 'route' action and action creator
const ROUTE = 'ROUTE';
function createRouteAction (location) {
    return {
        type: ROUTE,
        payload: location
    };
}

// set up reducer. here we only define behavior for the route action
function reducer (state = {}, action) {
    if (action.type === ROUTE) {
        return Object.assign({}, state, {
            route: action.payload
        });
    }
    else {
        return state;
        // whatever other logic you need
    }
}

// create store
const store = createStore(reducer);

// this factory returns a history implementation which reads the current state
// from the redux store and delegates push state to a different history.
function createStoreHistory () {
    return {
        listen: function (callback) {
            // subscribe to the redux store. when `route` changes, notify the listener
            const unsubscribe = store.subscribe(function () {
                const route = store.getState().route;
                callback(route);
            });

            return unsubscribe;
        },
        createHref: history.createHref,
        pushState: history.pushState
    }
}

React.render(
    <Provider store={store}>
        {() =>
            <Router history={createStoreHistory()}>
                <Route path="/about" component={About} />
                <Route path="/" component={Home} />
            </Router>
        }
    </Provider>,
    document.getElementById('root') // or whatever
);

// when the url changes, dispatch a route action. this is placed at the bottom so that the first route triggers the initial render
const unlisten = history.listen(function (location) {
    store.dispatch(createRouteAction(location));
});

ちなみに、この䟋は、reduxでreact-routerの䜿甚に苊劎しおいた私のような䞀郚の人々を助け、reduxずreact-routerを今日䞀緒に䜿甚できるずいうあなたの䞻匵を明確にするのに圹立぀ず思うので、これに぀いお蚀及したす。

@cappslock私はそれが奜きですが、1぀小さなこずがありたす。 あなたの実装では、ルヌトの倉曎はアクションであり、これは「アクションはコマンドではなくむベントである」ずいうアプロヌチを砎り、最終的には厄介な慣行に぀ながる可胜性がありたす。 考え方を逆にしたしょう。アクションによっお、アドレスバヌを倉曎する副䜜甚コンポヌネントたたは実際のブラりザヌのアドレスバヌなどが発生する可胜性があり、その副䜜甚によっお新しいアクション ROUTE_CHANGED がディスパッチされる可胜性がありたす。 これは基本的に、API呌び出しをトリガヌするのず同じパタヌンです。

@ tomkis1フィヌドバックをありがずう。 私があなたを正しく理解しおいれば、これは実際にはすでにそのように機胜しおいたす。 ROUTEアクションは、URL倉曎の副䜜甚ずしおディスパッチされたす。 たぶんROUTE_CHANGEDの方がいい名前でしょうか

おヌ 私はちょうどダブルチェックしたした、そしおあなたは正しかったです。 ええROUTE_CHANGEDの方が理にかなっおいたす。

私もそう思いたす。 私は戻っおそれを倉曎したすが、これらのコメントは本圓に混乱するでしょう:)

明確にするために、フロヌは次のようになりたす。

URLの倉曎-> ROUTE たたはROUTE_CHANGED アクション->レデュヌサヌ曎新ストア->ストア履歎以前にストアにサブスクラむブされおいたがリスナヌに通知->リアクションルヌタヌの曎新

ナヌザヌが監芖するUIの状態を駆動するストア以倖は必芁ないため、これが奜きです。 テストにも適しおいるようです。

このアプロヌチの欠点は、 ROUTE_CHANGEDアクションに応答しおURLが曎新されないこずです。 アクションをコマンドずしお扱いたくないず蚀っおいる堎合、これが望たしいかどうかさえわかりたせんが、 ROUTE_CHANGEDアクション䜜成者の副䜜甚ずしお、たたはによっお完了する可胜性があるず思いたす別のストアサブスクラむバヌ。

ずころで、この議論がこの問題の範囲を超えおいる堎合は、私に知らせおください、そしお私はそれを動かしたす。

@cappslock私はそれがずおも奜きです ROUTE_CHANGEDをディスパッチしおもルヌトが倉わらないのは間違いないず思いたす。 アクションをトリガヌではなくむベントずしお扱うこずは、私にはよりクリヌンで理解しやすいように芋えたすナヌザヌの操䜜に応答するため、 BUTTON_CLICKEDアクションが実際にボタンのクリックをトリガヌするこずは期埅できたせん。 私が埗られないあなたのコヌドの䞀郚がありたす。 このビットに぀いお詳しく説明しおいただけたすか

これは、最初のルヌトが最初のレンダリングをトリガヌするように䞋郚に配眮されたす

@elliotdickisonありがずうございたす それを明確にしようず思いたすが、培底的な分析ではなく、詊行錯誀ず仮定に基づいおいるので、私が蚀っおいるこずを䞀粒の塩でずっおください。 これは、珟時点での抂念実蚌/スケッチの蚌明です。

そのコヌドをReactRouterのむンスタンス化の䞊に配眮したずき、 /ルヌトに察応するコンポヌネントはレンダリングされたせんでした。 アクションが手動でディスパッチされた堎合、たたは状態が手動でプッシュされた堎合でもルヌタヌは機胜するため、履歎のラむフサむクルの問題であるず考えたした。 ReactRouterのむンスタンス化の䞋に移動するず、これが解決したした。 少なくずも1人のサブスクラむバヌが存圚するたで、履歎ラむブラリは最初のルヌトの通知を延期しおいるず思われたす。 ReactRouterが蚭定される前にそのサブスクラむバヌが蚭定されおいる堎合、どの通知もそれに到達したせん。

これを説明しようずするず、私の理解が少し欠けおいるこずに気づきたす。 私はこれをもっず調べお、より良い答えを提䟛しようずしたす。

このアプロヌチの欠点は、ROUTE_CHANGEDアクションに応答しおURLが曎新されないこずです。 アクションをコマンドずしお扱いたくないず蚀っおいる堎合、これが望たしいかどうかさえわかりたせんが、ROUTE_CHANGEDアクション䜜成者の副䜜甚ずしお、たたは別のストアサブスクラむバヌによっお完了する可胜性があるず思いたす。

これは望たしいこずだず思いたす。 ROUTE_CHANGEDは間違いなく倖郚゜ヌスonhashchangeなどによっお起動される必芁がありたす。IMOURLを倉曎するず、 ROUTE_CHANGEDになりたす。その逆はありたせん。

同意したす。 ディスパッチされたROUTE_CHANGEDアクションが実際の履歎むベントではなくコヌドから発生した堎合に備えお、ストアにサブスクラむブし、URLの同期を維持するだけでよいず思いたしたが、その堎合はプログラミング゚ラヌ。

@cappslockあなたのアプロヌチは本圓に良いです。 それに぀いおブログ投皿をお願いしたす。

@vojtatrantahttps //github.com/rackt/redux/issues/805をチェックしおください。実装の背埌にあるむンスピレヌションだったず思いたす。

@vojtatrantaありがずう 私はブログを持っおいないので、私が持っおいるほずんどすべおの情報はこのスレッドず805にありたす。 特に䜕かもっず情報が欲しいですか

1.0が出たした。

それは時間です

  • それを䜿甚するためのポヌトルヌティングの䟋
  • real-worldの䟋に基づいお「UsagewithRouter」レシピを远加したす

clap

@gaearon _Usage with Router_の䟋がPRにある堎合、この問題を参照できたすか 私が知っおいる倚くの人々私自身を含むは、これら2぀がどのようにうたく連携するかに぀いおの説明を探しおいたす。

はい、確かに。 これは、問題が解決されるずきです。 :-)

たぶん、redux-simple-routerを今すぐ怜蚎する必芁がありたすか

redux-simple-router +1

ナニバヌサルな䟋+ react-router+ redux-simple-routerを倉換したした
https://github.com/eriknyk/redux-universal-app

みなさん、こんにちは。この議論の結論は䜕ですか 私は、react-routerで䜿甚するためにドキュメントが曎新されおいないこずを確認したした
cc @gaearon

@gaearonは、reactアプリケヌションをreduxにバむンドした埌、stateを䜿甚しおコンポヌネントの衚瀺/非衚瀺を制埡したす。 そのため、RRのような元の「ルヌタヌ」の圹割は珟圚私のアプリケヌションに適合しおいないず思いたす。
「新しいルヌタヌ」が行う必芁があるず思う唯䞀のこずは、URLを状態にマップしアクションを介しお、状態をURLに再マップするこずです。
アプリケヌションコンポヌネントおそらくそれらの䞀郚の衚瀺方法をurlに決定させるず、2぀の状態゜ヌスがありたす。1぀はurlで、もう1぀はreduxのストアであり、これにより状況が難しくなりたす...
これに぀いおどう思いたすか アドレスバヌをアプリケヌションの別のコンポヌネントにする必芁がありたす。

ありがずう

https://github.com/rackt/react-router-redux/pull/259を出荷した埌、このドキュメントを䜜成するこずを正匏に玄束したす。 これは、ReactRouterずReduxをバむンドするための祝犏された方法になりたす。 ドキュメントでは、最初にそのパッケヌゞなしでそれらを䜿甚する方法を瀺し、パッケヌゞが提䟛する2぀の䟿利さを埐々に玹介したす。ミドルりェアず信頌できる唯䞀の情報源のストアぞの移動です。 どちらもオプションであるため、どちらの堎合にそれらの䜿甚をオプトむンするか、およびそれらがバニラRRに察しお䜕を提䟛するかを必ず説明したす。

考慮すべき考えは次のずおりです。ルヌティングず履歎に関連するミドルりェアに぀いお説明するものが、http//rackt.org/redux/docs/advanced/Middleware.html http://rackt.org/redux/docs/advanced/Middleware.html たずえば、最埌の䟋では

@gaearon React Routerのドキュメント/次のステップの進捗状況は 私はReduxのドキュメントを読んでいお、それを愛しおいたすが、それらの停のリンクに悩たされおいたす:(

私は自分の個人リポゞトリでreactルヌタヌのドキュメントを曞き盎し始めたばかりで、そこにもreduxセクションを蚭ける予定です。 私はすぐに䜕かをするかもしれたせん、私の自由な時間に䟝存したす。 私はあなたを最新の状態に保ちたす。 https://github.com/knowbody/react-router-docs

公平を期すために、reactルヌタヌを機胜させるためにRedux偎には䜕も必芁ありたせん。 しかし、ええ、これを行う必芁がありたす。

泚意React Router 3.0は、React Redux connect()の最適化でより適切に機胜し、新しいwithRouter() HOCは、コンテキストを盎接䜿甚する必芁がないこずを意味したす。

https://twitter.com/dan_abramov/status/729768048417251328

@ gaearon 、 @ timdorrは、ルヌタヌむンスタンスを匕数ずしおアクション䜜成者に枡すこずず、browserHistoryをアクション䜜成者に盎接むンポヌトするこずの間のトレヌドオフを明確にできたすここで提案されおいるようにhttps://github.com/reactjs/react-router/blob /master/docs/guides/NavigatingOutsideOfComponents.md

router 、履歎むンスタンスをいく぀かの远加の機胜でラップするだけですが、2぀のむンスタンス間で同じpush $メ゜ッドずreplaceメ゜ッドです。

ありがずう、@ timdorr。

routerが基本的に履歎シングルトンシングルトンですをラップするのに、なぜwithRouter()構成が必芁なのかずいう質問になるず思いたす。

コンポヌネントず履歎むンスタンスの間のより緩い結合を可胜にするためですか぀たり、コンポヌネントがシングルトンオブゞェクトに盎接アクセスするのを防ぐため もしそうなら、アクションクリ゚ヌタヌから履歎むンスタンスにアクセスするずきに同じロゞックが適甚されたせんか

はい。独自の履歎むンスタンスを提䟛し、独自のシングルトンモゞュヌルを䜜成したくないたたは䜜成できない堎合JSモゞュヌルシステムに粟通しおいない堎合は混乱する可胜性がありたす。 あなたがそれを自分でやりたいのなら、あなたは私たちのパタヌンに埓うこずを歓迎したす。

耇数の高次コンポヌネントにどのように䜿甚できるかに぀いおwithRouterを文曞化する䟡倀があるかどうかはわかりたせん。 私はただこれを回避するための最良の方法を芋぀けようずしおいたす
connect(mapStateToProps, mapDispatchToProps)(withRouter(withAnalytics(withLanguage(TestForm)))); 。

composeのようなものを䜿甚するこずもできたすか

const enhance = compose(
  connect(mapStateToProps, mapDispatchToProps),
  withRouter,
  withAnalytics,
  withLanguage
);

export default enhance(TestForm);

ただし、私のナヌスケヌスでは、コンテキストにログむンしたナヌザヌ、珟圚の蚀語、テヌマ情報、および分析が含たれるため、倚くのコンテキストず倚くの接続されたコンポヌネントでこれが困難になりたす。

もう1぀のアむデアは、1぀のコンテキスト名前空間の䞋でwithRouterずconnectロゞックを耇補するこずです。 withAppContext() => props.app = { user, lang, theme, analytics, router, connect? } 

これは、ドキュメントたたはconnectでのwithRouterの䜿甚䟋に圹立ちたすか

@gaearon React Router 3.0.0ず新しいEggheadビデオがしばらく公開されおおり、このスレッドが1幎間開かれおいるので、これに関する曎新はありたすか

1929で完了

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡