connectToContext
The connectToContext
wrapping function that automatically passes a map
, translations
, and/or selectInteraction
prop to its child component.
How does it work?
When the Map
component is constructed, it attaches the OpenLayers map to a context. If this context exists (which means Map
has been constructed), connectToContext
renders its child with a prop of map
from the Map
parent and also spreads the rest of the inline props. If a Map
is not mounted, connectToContext
will just render the child and pass props through without consuming a context. translations
and selectInteraction
will also be passed through from the <Map>
's context. Optimization: if propTypes
are defined on the component passed to connectToContext
, this util will check the against propTypes
and filter out any props mentioned above that are unneeded, if propTypes
is not set, all props mentioned above will be passed.
Automatic Example
All components provided by ol-kit are already wrapped, so a single-line drop-in is all you need to get it working:
import React from 'react'
import { Map, Popup } from '@bayer/ol-kit'
const App = () => {
return (
<Map>
<Popup /> {/* This Popup component was automatically given a map prop when wrapped by connectToContext internally */}
</Map>
)
}
export default App
Manual Example
If you prefer to not use the Map
component you must manually pass the map
prop to all ol-kit components:
import React from 'react'
import { Map, Popup } from '@bayer/ol-kit'
const App = () => {
return (
<div>
<Popup map={yourOlMap} />
</div>
)
}
export default App
Wrapping Your Components
Prebuilt ol-kit components get wrapped by this consumer before they are exported so they can be dropped in and just work. If you want to leverage the same logic, wrap your custom component like so:
import React from 'react'
import PropTypes from 'prop-types'
import { connectToContext } from '@bayer/ol-kit'
const CustomMapComponent = props => {
const { map } = props
// do some logic with the map
return (
<div>This component has map as a prop!</div>
)
}
CustomMapComponent.propTypes = {
map: PropTypes.object.isRequired
}
export default connectToContext(CustomMapComponent)
The above example filtered out translations
& selectInteraction
...but if you do not define propTypes
:
import React from 'react'
import { connectToContext } from '@bayer/ol-kit'
const CustomMapComponent = props => {
const { map, selectInteraction, translations } = props
// access to all context props from <Map> parent
return (
<div>This component has map, selectInteraction, and translations props!</div>
)
}
export default connectToContext(CustomMapComponent)