使您的React Native地图变得更快,响应更快的四种方法。
为什么这很重要
作为使用React Native或任何平台/语言的移动开发人员,您迟早将不得不处理地图。 而到了那个时候,您需要知道如何有效地对其进行优化,因为如果不这样做,您的用户体验将受到极大的损害。 在本文中,我将以4种可能的方式向您展示如何使您的地图更快,更平滑和响应更快。
由于react-native-maps,将地图放入并在React Native应用程序中使用非常简单。 这是一个简单的API,您只需渲染MapView即可显示空白地图,然后渲染一堆标记,这些标记本质上是地图上的图钉。
如果您不熟悉react-native-map,请确保在继续操作之前先查看其文档 。
问题是什么
问题是,与许多其他组件一样,React Native映射必须处理的数据越多 ,其性能就会越差 。 在公园里散步,为全市最喜欢的咖啡馆显示5个标记; 但是可以说,如果您的应用程序显示了该国的所有麦当劳,那么如果您放大足够大,就会有成百上千个标记! 您肯定会遇到滞后的情况,直到您的应用实际上无法使用。
tracksViewChanges = {false}/>);
}
2. React.memo或shouldComponentUpdate或PureComponent
最小化渲染的另一种方法是仅在Marker
的道具发生实际更改时才重新渲染Marker
(通常它们不会:在地图上查看房屋时,房屋的最后一次移动时间是什么时候?) 。
React为我们提供了React.memo (用于功能组件)和shouldComponentUpdate (用于类组件)。 或者,您也可以使用React.PureComponent来获得与shouldComponentUpdate相同的结果
首先,以React.memo
:
import React from 'react' ;
import { Marker } from 'react-native-maps' ;
function CarPin ( props ) {const {coord} = props;return (coordinate = {coord}tracksViewChanges = {false}/>);
}
export default CarMarker = React.memo(CarPin);
一个shouldComponentUpdate
的例子:
import React from 'react' ;
import { Marker } from 'react-native-maps' ;
export default class CarPin extend React . Component {shouldComponentUpdate(nextProps) {return nextProps.coord !== this .props.coord}render(){return (coordinate = {this.props.coord}tracksViewChanges = {false}/>);}
}
和React.PureComponent
的示例:
import React from 'react' ;
import { Marker } from 'react-native-maps' ;
export default class CarPin extend React . PureComponent {render(){return (coordinate = {this.props.coord}tracksViewChanges = {false}/>);}
}
如果您想进一步自定义组件的行为,请确保查看React.memo , shouldComponentUpdate和React.PureComponent官方文档。
3.使用“图标”代替“图像”来构建自定义标记
在文档中没有明确指出性能差异,而是根据官方源代码 :
/*** A custom image to be used as the marker's icon. Only local image resources are allowed to be used.*/
image: PropTypes.any,
/*** Marker icon to render (equivalent to `icon` property of GMSMarker Class).Using this property has an advantage over `image` in term of performance, battery usage... because it doesn't trigger tracksViewChanges. (tracksViewChanges is set to YES by default if iconView is not nil).*/
icon: PropTypes.any,
4.集群您的标记
让我向您展示我构建的应用程序中的示例,而不是在这种情况下解释集群的含义。 下图显示了具有聚类的地图(左)和没有聚类的地图(右)
使用诸如react-native-map-clustering或@ bam.tech / react-native-component-map-clustering之类的 API可以轻松完成地图聚类
尽管外观上的差异已经令人印象深刻,但性能上的差异却更加惊人。 要了解原因,我们必须查看地图聚类的工作方式:
首先,API将计算MapView
上(相对)较小区域中的标记数。 代替渲染标记,它将在地图上渲染标记的数量。 当用户放大或缩小时,该数字将再次计算。 当用户放大足够时,将显示实际标记。
这意味着,该应用程序将从渲染大量标记中节省大量时间。 取而代之的是,它将仅计算和呈现标记的数量。 这也是您应该注意的地方 -由于应用程序每次用户放大或缩小时都必须计算标记的数量,因此请确保在渲染时间和重新计数时间之间进行权衡是值得的。
结论
优化React Native映射虽然相对简单,但并不是由API自动为您完成的简单操作。 在本文中,我列出了4种不同的方法:
-
trackViewChanges
,请关闭自定义标记中的trackViewChanges
。 - 使用
React.memo
或shouldComponentUpdate
或React.PureComponent
。 - 使用“图标”代替“图像”来构建自定义标记。
- 集群您的标记。
我希望通过使用这些技巧,您将能够构建更快,响应速度更快的应用程序,从而提供出色的用户体验。 祝你好运!
如果您对我的工作感兴趣或想要与我联系,请随时 给我发送电子邮件 , 访问我的Github 并 在LinkedIn上与我联系 。
From: https://hackernoon.com/how-to-optimize-react-native-map-in-your-application-eeo3nib