有没有办法从外部函数从 MapView 组件访问 ref 属性?
基本上,我有:
-
一个主组件,它有一个将调用
(<MyMap />)
的渲染方法 -
<MyMap />
是带有地图视图组件的导出函数。 在 MapView 组件中,我做了一个引用(ref=map=>(mapRef=map)
,并希望将该引用传递给生成我的标记的函数(<PinData />
. - 在
<PinData />
中,我想将 onPress 事件用于 要放大并移动到标记的标记,使用 MapView.animateToRegion 方法。
我一直得到未定义的不是对象(评估"mapRef.animateToRegion"(。
我是否必须创建组件类(而不是使用导出的函数(才能使映射引用正常工作才能呈现 MapView 和标记组件?
前任: 主类组件:
render(){
return(
<View>
<MyMap region={this.state.region}
pinData={this.state.pinsData}
myPins={this.state.myPins}
mapRef={this._mapRef} />
</View>
)}
MyMap 函数渲染我的 MapView 组件。
export const MyMap= ({ region, pinsData, myPins}) => {
return (
<View style={styles.container}>
<MapView
provider={PROVIDER_GOOGLE}
ref={map => (mapRef = map)}
style={styles.userMap}
region={region}
>
<PinData pinsData={pinsData} myPins={myPins} />
</MapView>
</View>
);
用于在我的地图上生成标记的 PinData 函数。
export const PinData = ({ pinsData, myPins, mapRef }) => {
return pinsData.map((pin, index) => (
<Marker
key={index}
ref={ref => (markers[index] = ref)}
coordinate={{
longitude: pin.coordinates.lng,
latitude: pin.coordinates.lat
}}
onPress={focusMarker(mapRef, pin, index)}
/>
));
};
onPress 函数,它将使用与 MapView 对象关联的 animateToRegion 方法放大其中一个图钉。
focusMarker = (mapRef, location, index) => {
mapRef.animateToRegion({
latitude: location.coordinates.lat,
longitude: location.coordinates.lng,
latitudeDelta: 0.005,
longitudeDelta: 0.005
});
};
你可以将onPress
道具传递给PinData
export const MyMap= ({ region, pinsData, myPins}) => {
const mapRef = useRef();
focusMarker = (location) => {
mapRef.current.animateToRegion({
latitude: location.coordinates.lat,
longitude: location.coordinates.lng,
latitudeDelta: 0.005,
longitudeDelta: 0.005
});
};
return (
<View style={styles.container}>
<MapView
provider={PROVIDER_GOOGLE}
ref={mapRef}
style={styles.userMap}
region={region}
>
<PinData pinsData={pinsData} myPins={myPins} onPress={focusMarker}/>
</MapView>
</View>
);
}
export const PinData = ({ pinsData, myPins, onPress }) => {
return pinsData.map((pin, index) => (
<Marker
key={index}
ref={ref => (markers[index] = ref)}
coordinate={{
longitude: pin.coordinates.lng,
latitude: pin.coordinates.lat
}}
onPress={() => onPress(pin)}
/>
));
};
我想通了,多亏了Tuan的回答。 上面的代码有效。 我以前不明白的是 onPress 是如何工作的。 基本上,根据我的理解,逻辑如下:
在 MyMap 函数中,我们定义了 focusMarker 函数。
然后在调用的onPress中创建一个道具,并将其设置为等于focusMarker函数。
在 PinData 函数中,我们现在将此 prop(onPress( 作为参数,并将 Marker 组件中的 onPress 道具设置为一个匿名函数,该函数将使用 pin 参数执行 focusMarker 函数。 在这个函数中,作为导出函数的参数传入的onPress实际上是focusMarker函数本身,我们使用pin参数调用它。 希望这对任何可以利用它的人来说都是有意义的。 再次感谢团。 欣赏它。 我被这难住了一段时间。