javascript - 有没有办法改变 react-native-maps无需重新渲染的 API 坐标?
问题描述
参考:如何在不重新渲染地图视图的情况下更新标记位置?反应原生地图
我的目标是防止在用户拖动地图同时更改市场坐标时重新渲染。目前的解决方案是使用useState
钩子。但这会导致组件重新渲染,从而导致应用程序滞后。
我尝试使用let variable
,但它不会移动marker
.
tl:dr
Screen.js
import React from 'react';
import {StyleSheet, View} from 'react-native';
import MapView, {Marker, PROVIDER_GOOGLE} from 'react-native-maps';
const styles = StyleSheet.create({
container: {
...StyleSheet.absoluteFillObject,
height: 400,
width: 400,
justifyContent: 'flex-end',
alignItems: 'center',
},
map: {
...StyleSheet.absoluteFillObject,
},
});
带有 useState 的 Screen.js(昂贵的重新渲染)
export default function GoSendDestinationDetails() {
const [coordinate, setCoordinate] = React.useState({
latitude: -6.1754,
longitude: 106.8272,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
});
const handleRegionChange = (region) => {
setCoordinate(region);
console.log(region);
};
console.log('re-render');
return (
<View style={styles.container}>
<MapView
provider={PROVIDER_GOOGLE} // remove if not using Google Maps
style={styles.map}
initialRegion={coordinate}
onRegionChange={handleRegionChange}>
<MarkerMemo />
</MapView>
</View>
);
}
我试过的:
带有 let 变量的 Screen.js
export default function GoSendDestinationDetails() {
let coordinate = {
latitude: -6.1754,
longitude: 106.8272,
latitudeDelta: 0.015,
longitudeDelta: 0.0121,
};
const handleRegionChange = (region) => {
coordinate = region;
console.log(region);
};
// this does not update the marker when coordinate changes
const MarkerMemo = React.memo(() => <Marker coordinate={coordinate} />)
console.log('re-render');
return (
<View style={styles.container}>
<MapView
provider={PROVIDER_GOOGLE} // remove if not using Google Maps
style={styles.map}
initialRegion={coordinate}
onRegionChange={handleRegionChange}>
<MarkerMemo />
</MapView>
</View>
);
}
解决方案
useState
Hook 给了你两件事:
- 将在渲染中持续存在的值
- 用于更新该值并触发重新渲染的 API 。
如果您有一个不关心重新渲染的用例,但您确实需要在渲染之间保留一个值,那么您需要其中的一半useState
让您在渲染之间保留一个值,而不是另一半触发重新渲染-使成为。
useRef
而这正是
useRef() Hook 不仅适用于 DOM 引用。“ref”对象是一个通用容器,其当前属性是可变的并且可以保存任何值
https://reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables
推荐阅读
- mysql - sql - 查找所有不需要红色部分的作业
- sql - 在 FULL JOIN 中使用 COALESCE,返回重复值
- xml - 如何在 xslt 中添加空格并将记录限制为 300 个字符
- c# - 选择除管理员之外的所有角色。C# ASP.NET MVC
- c - 与结构一起使用时 calloc 的初始值
- java - 春天的远程
- google-cloud-platform - 下载 Google Cloud 存储库的最佳方式
- php - 如何检测除 application/octet-stream 之外的 .docx 正确 MIME
- c++ - 如何在 oc 类中获取私有 c++ 类型字段的值?
- javascript - Loopback 无法在不设置密码的情况下更新扩展模型