React Router Link不适用于LeafletJS

Vin*_*ert 6 javascript leaflet reactjs react-router react-leaflet

版本:

  • react-router-dom 4.1.1
  • react-router-redux 5.0.0-alpha.4
  • 反应传单1.1.3
  • 传单1.0.3

重现步骤

我创建了一张传单地图.我在其中添加了一些标记.这些标记有弹出窗口.在每个弹出窗口中,我想要一个<Link>

如果它有帮助这是我的路由配置:

ReactDOM.render(
  <Provider store={store}>
    <div>
      <AppContainer />
      <ConnectedRouter history={history}>
        <div>
          <MenuContainer />
          <Switch>
            <Route path='/:area/:sport/list' component={ListContainer} />
            <Route path='/:area/:sport/map' component={MapContainer} />
            <Route path='/:area/:sport/rasp' component={RaspContainer} />
            <Route path='/:shortcode/details' component={StationDetailsContainer} />
            <Redirect exact from='/' to='/wellington/paragliding/list' />
            <Route component={NoMatch} />
          </Switch>
        </div>
      </ConnectedRouter>
    </div>
  </Provider>,
  document.getElementById('root')
)
Run Code Online (Sandbox Code Playgroud)

预期的行为

当弹出窗口打开时,我可以看到我的链接并单击它.

实际行为

实际行为 无法看到链接.它没有生成.

额外细节

在我的内部我<MapMode>使用<Map>传单.如果我<Link><Map>标签上方设置它就可以了.一旦我想在我的内部有一个链接<Map>,它就会以某种方式破坏.这是我的页面的React结构,<Popup>标签只包含null在Javascript中断: 反应结构

这是一个非常复杂的问题,所以请随时向我提问.谢谢.

小智 11

我尝试了Tharaka建议的解决方案,但它对我不起作用.看起来反应传单的Popup正在使用它自己的上下文,从而阻止从更高级别传递的上下文.然而,在这个解决方案的启发下,我想出了另一个,非常简单并且基于组合原理.

我创建了RouterForwarder组件

import React, { Component } from 'react'
import PropTypes from 'prop-types'

class RouterForwarder extends Component {
  getChildContext() {
    return this.props.context
  }

  render() {
    return <span>{this.props.children}</span>
  }
}

RouterForwarder.childContextTypes = {
  router: PropTypes.object.isRequired,
}

RouterForwarder.propTypes = {
  context: PropTypes.object.isRequired,
}

export default RouterForwarder
Run Code Online (Sandbox Code Playgroud)

然后以下列方式在我的组件(呈现Map,Marker,Popup和Link的组件)中使用它:

import RouterForwarder from './RouterForwarder'

class MyComponent extends Component {

  render() {
    return (
    ...
      <Popup>
        <RouterForwarder context={this.context}>
          <Link to={'my destination'}>Go to My Destination</Link>
        </RouterForwarder>
      </Popup>
    ...)
  }
}

MyComponent.contextTypes = {
  router: PropTypes.object,
}
Run Code Online (Sandbox Code Playgroud)


Tha*_*ara 4

我对这个答案不是100%确定。但无论如何我都会尝试,因为我认为至少它可以为将来尝试解决这个问题的任何人带来一些启发。

我在GitHub 存储库中从这个问题中得到了第一个提示react-leaflet。根据该信息和您的错误,问题似乎是 Popup 无法访问,router因为contextcontext没有以它们呈现的方式传递到 Popup 中。因此,如果我们可以显式地将上下文传递给 Popup,我们应该能够解决这个问题。

然后我找到了一种将上下文显式传递到此组件中的方法。这样,我认为您应该能够使用如下的 HoC(高阶组件)来解决您的问题。

这是向组件注入上下文的 HoC:

function withContext(WrappedComponent, context){

  class ContextProvider extends React.Component {
    getChildContext() {
      return context;
    }

    render() {
      return <WrappedComponent {...this.props} />
    }
  }

  ContextProvider.childContextTypes = {};
  Object.keys(context).forEach(key => {
    ContextProvider.childContextTypes[key] = React.PropTypes.any.isRequired; 
  });

  return ContextProvider;
}
Run Code Online (Sandbox Code Playgroud)

假设您在名为 MapMaker 的组件内使用 Popup。router然后您可以使用 HoC将上下文注入到 Popup 中,如下所示。

class MapMaker extends React.Component {

  //......

  // This make sure you have router in you this.context
  // Also you can add any other context that you need to pass into Popup
  static contextTypes = {
    router: React.PropTypes.object.isRequired
  }

  render(){

    const PopupWithContext = withContext(Popup, this.context);

    return (
      //..... your JSX before Popup
      <PopupWithContext/> // with your props
      //..... your JSX after Popup
    );
  }

}
Run Code Online (Sandbox Code Playgroud)