gpt4 book ai didi

javascript - 如何更改 react-google-maps 中 GroundOverlay 的不透明度?

转载 作者:行者123 更新时间:2023-11-30 19:35:37 24 4
gpt4 key购买 nike

使用 react-google-mapsGroundOverlay 为例组件为例(参见 https://github.com/khpeek/beomaps/blob/master/src/App.js ),我想制作一个 slider 来改变叠加层的不透明度。

例如,目前,如果我渲染这个组件,我会得到一个固定不透明度为 0.5 的叠加层:

/* global google */

import React from "react"
import { compose } from "recompose"
import {
withScriptjs,
withGoogleMap,
GoogleMap,
GroundOverlay } from "react-google-maps"

export const MapWithGroundOverlay = compose(
withScriptjs,
withGoogleMap
)(props =>
<GoogleMap
defaultZoom={12}
defaultCenter={{lat: 40.740, lng: -74.18}}
>
<GroundOverlay
defaultUrl="https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"
defaultBounds={new google.maps.LatLngBounds(
new google.maps.LatLng(40.712216, -74.22655),
new google.maps.LatLng(40.773941, -74.12544)
)}
defaultOpacity={.5}
/>
</GoogleMap>
);

看起来像这样:

enter image description here

但是,我正在努力了解如何使用 slider “动态”更改不透明度。最终,我相信我必须调用 setOpacity google.maps.GroundOverlay 实例上的方法类(参见 https://developers.google.com/maps/documentation/javascript/reference/image-overlay#GroundOverlay )。但是,如果我查看 <GroundOverlay> 的源代码组件(参见 https://github.com/tomchentw/react-google-maps/blob/ca5c5c6f5346fb3ee0037893fbca488a408c9938/lib/components/GroundOverlay.js#L59 ),

var GroundOverlay = (exports.GroundOverlay = (function(_React$PureComponent) {
;(0, _inherits3.default)(GroundOverlay, _React$PureComponent)

/*
* @see https://developers.google.com/maps/documentation/javascript/3.exp/reference#GroundOverlay
*/
function GroundOverlay(props, context) {
;(0, _classCallCheck3.default)(this, GroundOverlay)

var _this = (0, _possibleConstructorReturn3.default)(
this,
(
GroundOverlay.__proto__ || (0, _getPrototypeOf2.default)(GroundOverlay)
).call(this, props, context)
)

;(0, _warning2.default)(
!props.url || !props.bounds,
"\nFor GroundOveray, url and bounds are passed in to constructor and are immutable\n after iinstantiated. This is the behavior of Google Maps JavaScript API v3 (\n See https://developers.google.com/maps/documentation/javascript/reference#GroundOverlay)\n Hence, use the corresponding two props provided by `react-google-maps`.\n They're prefixed with _default_ (defaultUrl, defaultBounds).\n\n In some cases, you'll need the GroundOverlay component to reflect the changes\n of url and bounds. You can leverage the React's key property to remount the\n component. Typically, just `key={url}` would serve your need.\n See https://github.com/tomchentw/react-google-maps/issues/655\n"
)
var groundOverlay = new google.maps.GroundOverlay(
props.defaultUrl || props.url,
props.defaultBounds || props.bounds
)
;(0, _MapChildHelper.construct)(
GroundOverlay.propTypes,
updaterMap,
_this.props,
groundOverlay
)
groundOverlay.setMap(_this.context[_constants.MAP])
_this.state = (0, _defineProperty3.default)(
{},
_constants.GROUND_LAYER,
groundOverlay
)
return _this
}

;(0, _createClass3.default)(GroundOverlay, [
{
key: "componentDidMount",
value: function componentDidMount() {
;(0, _MapChildHelper.componentDidMount)(
this,
this.state[_constants.GROUND_LAYER],
eventMap
)
},
},
{
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
;(0, _MapChildHelper.componentDidUpdate)(
this,
this.state[_constants.GROUND_LAYER],
eventMap,
updaterMap,
prevProps
)
},
},
{
key: "componentWillUnmount",
value: function componentWillUnmount() {
;(0, _MapChildHelper.componentWillUnmount)(this)
var GroundOverlay = this.state[_constants.GROUND_LAYER]
if (GroundOverlay) {
GroundOverlay.setMap(null)
}
},
},
{
key: "render",
value: function render() {
return false
},

/**
* Gets the `LatLngBounds` of this overlay.
* @type LatLngBoundsLatLngBounds
* @public
*/
},
{
key: "getBounds",
value: function getBounds() {
return this.state[_constants.GROUND_LAYER].getBounds()
},

/**
* Returns the opacity of this ground overlay.
* @type number
* @public
*/
},
{
key: "getOpacity",
value: function getOpacity() {
return this.state[_constants.GROUND_LAYER].getOpacity()
},

/**
* Gets the url of the projected image.
* @type string
* @public
*/
},
{
key: "getUrl",
value: function getUrl() {
return this.state[_constants.GROUND_LAYER].getUrl()
},
},
])
return GroundOverlay
})(
_react2.default.PureComponent
)) /*

那么它似乎只有一个 getOpacity()方法,但没有 setOpacity()一。此外,groundOverlay变量是 function GroundOverlay(props, context) 的局部变量,所以我不知道如何访问它的 setOpacity方法。

关于如何解决这个问题有什么想法吗?

更新

我注意到 GroundOverlay组件接受 opacity决定其不透明度的 Prop 。使用它,我尝试创建一个组件 AdjustableGroundoverlay包含 <GroundOverlay>和一个 <button> (现在)更改 GroundOverlay的不透明度:

import React from "react"
import { MapWithGroundOverlay } from "./MapWithGroundOverlay"

export class AdjustableGroundoverlay extends React.PureComponent {
constructor(props, context) {
super(props, context)
this.state = {opacity: 0.5}
this.handleClick = this.handleClick.bind(this);
}

handleClick() {
this.setState(state => ({
opacity: 1.0
}));
}

render() {
return (
<div>
<MapWithGroundOverlay
googleMapURL={`https://maps.googleapis.com/maps/api/js?key=${process.env.REACT_APP_GOOGLE_MAPS_API_KEY}&v=3.exp&libraries=geometry,drawing,places`}
loadingElement={<div style={{ height: `100%` }} />}
containerElement={<div style={{ height: `600px` }} />}
mapElement={<div style={{ height: `100%` }} />}
opacity={this.state.opacity}
/>
<button onClick={this.handleClick}>
{`Opacity: ${this.state.opacity}`}
</button>
</div>
);
}
}

但是,我注意到当我单击该按钮时,虽然它的标签从 Opacity: 0.5 变为至 Opacity: 1 ,叠加层的实际不透明度不会改变:

enter image description here

据我了解 https://reactjs.org/docs/handling-events.html , 调用 setState()AdjustableGroundoverlay 上应该让它调用它的 render()方法,从而传递新的 this.state.opacity作为 GroundOverlay 的 Prop 并改变其不透明度。我不明白为什么这不起作用?

最佳答案

react-google-maps 库中,default 属性(例如 defaultOpacity )在组件实例化后是不可变的,所以为了 GroundOverlay 组件来反射(reflect)变化,需要使用 opacity 代替。

现在轮到更改了,而不是访问底层 google.maps.GroundOverlay object , 我建议 React way通过state .因为在你的例子中 recompose library可以引入 opacity 状态,更改其值的处理程序可能如下所示:

withStateHandlers(
() => ({
opacity: 0.1
}),
{
incrementOpacity: ({ opacity }) => () => ({
opacity: opacity >= 1.0 ? 0.0 : opacity + 0.1
})
}
)

For details about withStateHandlers refer official documentation

这是一个“动态”反射(reflect)不透明度变化的示例(为了演示目的,使用按钮而不是 slider ):

export const MapWithGroundOverlay = compose(
withScriptjs,
withGoogleMap,
withStateHandlers(
() => ({
opacity: 0.1
}),
{
incrementOpacity: ({ opacity }) => () => ({
opacity: opacity >= 1.0 ? 0.0 : opacity + 0.1
})
}
)
)(props => (
<div>
<button onClick={props.incrementOpacity}>Increment opacity</button>
<GoogleMap defaultZoom={12} defaultCenter={{ lat: 40.74, lng: -74.18 }}>
<GroundOverlay
defaultUrl="https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"
defaultBounds={
new google.maps.LatLngBounds(
new google.maps.LatLng(40.712216, -74.22655),
new google.maps.LatLng(40.773941, -74.12544)
)
}
defaultOpacity={props.opacity}
/>
</GoogleMap>
</div>
));

Here is a demo

关于javascript - 如何更改 react-google-maps 中 GroundOverlay 的不透明度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com