【问题标题】:switch maptype in react-native-map在 react-native-map 中切换 maptype
【发布时间】:2019-06-07 10:41:22
【问题描述】:

我的 react-native 地图在 google 上运行,适用于 IOS 和 Android。 有没有办法让 mapType 图层切换器像在 react-native expo 应用程序中启用的谷歌地图应用程序一样?这样用户就可以切换地图类型(标准、卫星、....)

代码的简化版本

constructor(props) {
  super(props);
  this.state = {
    mapRegion: null,
    markers: [],
    mapType: null
  };
}

switchMapType() {
  console.log('Changing');
  this.state.mapType = 'satellite'
}

render() {
  return (
    <MapView
      provider="google"
      mapType={this.state.mapType}
    >
      <Icon
        onPress={this.switchMapType} 
      />
    </MapView>
  );
}

state switchMapType() 内部时出现未定义错误。

【问题讨论】:

    标签: android ios react-native react-native-maps


    【解决方案1】:

    查看文档可以很简单地将正确的样式传递给mapType prop

    https://github.com/react-native-community/react-native-maps/blob/master/docs/mapview.md

    要显示的地图类型。

    • 标准:标准路线图(默认)
    • 无:无地图
    • 卫星:卫星视图
    • 混合:覆盖道路和兴趣点的卫星视图
    • 地形:(仅限 Android)地形视图
    • mutedStandard:更微妙,使标记/线条更加突出(仅限 iOS 11.0+)

    绑定你的函数

    您收到该错误是因为可能需要绑定您的函数,以便它知道要使用的 this 的值。您可以通过将以下内容放入构造函数中来在构造函数中执行此操作

    constructor(props) {
      ...
      this.switchMapType = this.switchMapType.bind(this);    
      ...
    }
    

    或者您可以将 switchMapType 转换为箭头函数,方法是将其声明更改为

    switchMapType = () => {
      ...
    }
    

    或者你可以在调用时绑定函数

    <Icon
      onPress={this.switchMapType.bind(this} 
    />
    

    更多详情可以看这篇文章https://medium.freecodecamp.org/react-binding-patterns-5-approaches-for-handling-this-92c651b5af56

    我更喜欢自己使用箭头函数。

    设置状态

    我还注意到您的函数switchMapType 存在错误,您设置状态的方式。你打电话给this.state.mapType = 'satellite' 你应该像这样操纵状态。像这样改变状态不会强制重新渲染(这是你想要的),它可能会导致意想不到的后果。有关设置状态的更多信息,请参阅本文https://medium.com/@baphemot/understanding-reactjs-setstate-a4640451865b

    如果你想改变状态,你应该使用this.setState({ key1: value1, key2, value2 });

    因此,如果您将 switchMapType 函数更新为以下内容,它应该可以工作

    switchMapType = () => {
      console.log('changing');
      this.setState({ mapType: 'satellite' });
    }
    

    如果您希望能够在satellitestandard 版本之间切换,您可以这样做。这使用三元语句来处理if/elsehttps://codeburst.io/javascript-the-conditional-ternary-operator-explained-cac7218beeff

    switchMapType = () => {
      console.log('changing');
      this.setState({ mapType: this.state.mapType === 'satellite' ? 'standard' : 'satellite' });
    }
    

    【讨论】:

    • 我用一些代码和我得到的错误更新了这个问题。这是我的想法,但似乎不起作用。也许需要一个全局状态?
    • 完美我在错误的上下文中使用了“this”。我确实想出了“setSate”。
    • 我很高兴它现在已经为您排序了 :)
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2020-04-29
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多