From bdb9ab10a92cc488b636742235f95988c535c605 Mon Sep 17 00:00:00 2001 From: Bruce <850611576@qq.com> Date: Thu, 4 May 2023 20:39:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=AB=AF=E7=BD=91=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/resources/navigation/data.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/resources/navigation/data.js b/docs/resources/navigation/data.js index 5584a53..4c1d585 100644 --- a/docs/resources/navigation/data.js +++ b/docs/resources/navigation/data.js @@ -298,6 +298,23 @@ export default [ }, ] }, + { + title: '小程序', + items: [ + { + icon: 'https://storage.360buyimg.com/pubfree-bucket/taro-docs/c07c6984de/img/logo-taro.png', + title: 'Taro', + desc: '开放式跨端跨框架解决方案,支持使用 React/Vue/Nerv 等框架来开发微信/京东/百度/支付宝小程序/H5等应用', + link: 'https://taro-docs.jd.com/docs/' + }, + { + icon: 'https://res.wx.qq.com/a/wx_fed/assets/res/NTI4MWU5.ico', + title: '微信官方文档-小程序', + desc: '微信小程序官方文档', + link: 'https://developers.weixin.qq.com/miniprogram/dev/framework/' + }, + ] + }, { title: '可视化', items: [ -- Gitee From c6dacc9135020c191f86cd0cfd18163468537a74 Mon Sep 17 00:00:00 2001 From: Bruce <850611576@qq.com> Date: Fri, 5 May 2023 21:45:04 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E5=BC=80=E5=8F=91=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vitepress/nav.js | 6 ++ docs/work/maps/wx_map.md | 196 +++++++++++++++++++++++++++++++++++++++ docs/work/sidebar.js | 9 +- 3 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 docs/work/maps/wx_map.md diff --git a/docs/.vitepress/nav.js b/docs/.vitepress/nav.js index eb30431..e024c63 100644 --- a/docs/.vitepress/nav.js +++ b/docs/.vitepress/nav.js @@ -57,6 +57,12 @@ export default [ items: [ { text: 'Antd 虐我千百遍', link: '/work/antd' }, { text: '第三方工具', link: '/work/tools' }, + { + text: '地图开发', + items: [ + { text: '微信小程序地图开发', link: '/work/maps/wx_map' }, + ] + }, ] }, ] \ No newline at end of file diff --git a/docs/work/maps/wx_map.md b/docs/work/maps/wx_map.md new file mode 100644 index 0000000..4ad0332 --- /dev/null +++ b/docs/work/maps/wx_map.md @@ -0,0 +1,196 @@ +## 前言 + +最近接了个跟微信小程序地图有关的开发任务,第一次在小程序上开发地图,既兴奋又忐忑。还好,虽然小程序地图的 API 功能有些少,但是基本的需求都能覆盖到。 + +在这里,对微信小程序地图开发的基本功能进行总结归纳。官方文档对地图属性、方法的归纳比较到位,但缺乏示例代码,第一次搞还是有点迷糊的。网上的文章又写得七零八落,没见到有人专门总结归纳。 + +本人使用 **React + Taro** 开发的微信小程序,因此使用的是 Taro 提供的地图 API,但是和微信官方的是一样的,Taro 不过是二次封装而已。 + +相关链接: + +[Taro Map 组件](https://taro-docs.jd.com/docs/components/maps/map){link=card} +[Taro Map 实例方法](https://taro-docs.jd.com/docs/apis/media/map/MapContext){link=card} +[微信官方文档 map](https://developers.weixin.qq.com/miniprogram/dev/component/map.html){link=card} + +## 创建地图 + +引入 `Map` 组件,再像普通组件使用即可。可以添加很多属性,各个属性的作用详见 [Taro 文档](https://taro-docs.jd.com/docs/components/maps/map)。 + +```js +import { Map } from '@tarojs/components' + +class TaroMap extends Component { + render() { + return + } +} +``` + +## 在地图画标记点 + +通过设置 `Map` 组件的 `markers` 属性,在地图上设置标记点。 + +标记点一般都需要设置这几个属性: + +- `id`:设置标记点的 id +- `longitude`:设置标记点经度 +- `latitude`:设置标记点纬度 +- `iconPath`:设置标记点图标 +- `width`:设置宽度 +- `height`:设置高度 + +```js +import { Map } from '@tarojs/components' +import markerImg from './example.svg' + +class TaroMap extends Component { + markers = [ + { + id: 0, + iconPath: markerImg, + longitude: 100, + latitude: 20, + width: 50, + height: 50, + }, + { + id: 1, + iconPath: markerImg, + longitude: 100, + latitude: 20, + width: 50, + height: 50, + }, + ] + + render() { + return + } +} +``` + +## 在地图画圆圈 + +通过设置 `Map` 组件的 `circles` 属性,在地图上画圈。 + +圆圈一般都需要设置这几个属性: + +- `longitude`:设置圆圈中心经度 +- `latitude`:设置圆圈中心纬度 +- `color`:设置圆圈边缘颜色 +- `fillColor`:设置圆圈填充颜色 +- `radius`:设置圆圈半径,单位是米,这里是实际的半径大小 + +```js +import { Map } from '@tarojs/components' + +class TaroMap extends Component { + circles = [ + { + longitude: 100, + latitude: 20, + color: '#30BC6B', + fillColor: 'blue', + radius: 500, + }, + ] + + render() { + return + } +} +``` + +## 初始化地图中心为当前位置,并画圈 + +大部分地图都会在进入页面时把中心移动到当前位置,同时会以当前位置为中心画一个圆圈。 + +该需求主要利用 [`getLocation()`](https://taro-docs.jd.com/docs/apis/location/getLocation) 方法来实现,`getLocation()` 方法可以获取当前的地理位置、速度等信息。 + +```js +import { Map } from '@tarojs/components' + +class TaroMap extends Component { + state = { + longitude: 100, + latitude: 90, + circles: [], + } + + componentDidMount() { + this.getCurrentLocation() + } + + getCurrentLocation = async () => { + const res = await Taro.getLocation({ type: 'gcj02' }) + const { longitude, latitude } = res + this.setState({ + longitude, + latitude, + circles: [ + { + longitude, + latitude, + color: 'red', + fillColor: 'green', + radius: 500, + }, + ], + }) + } + + render() { + const { longitude, latitude } = this.state + + return + } +} +``` + +## 始终固定图标在地图中心 + +平时常见的地图,往往都会有一个图标固定在地图的中心,并且无论如何拖动地图,位置都始终不变。 + +在旧版的微信小程序地图中,这个功能需要使用 `control` 控件实现,但官方已经明确说明即将废弃该方式。后来又通过利用视图容器 `cover-view` 来实现,但是 2023 年的现在连 `cover-view` 也不需要了,直接使用普通的 `view` 容器组件即可。 + +这样一来,就是很普通的设置元素水平垂直居中的问题了。 + +:::tip 官方说明 +目前原生组件均已支持同层渲染,建议使用 view 替代 +::: + +```js +import { Map, View, Image } from '@tarojs/components' + +class TaroMap extends Component { + render() { + return ( + + + + + + ) + } +} +``` + +```scss +.map { + width: 100vw; + height: 100vh; + position: relative; +} + +.center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.center--image { + width: 70px; + height: 70px; +} +``` diff --git a/docs/work/sidebar.js b/docs/work/sidebar.js index 1f57603..697b9c5 100644 --- a/docs/work/sidebar.js +++ b/docs/work/sidebar.js @@ -6,5 +6,12 @@ export default [ { text: '那些年, Antd 坑我的地方', link: '/work/antd' }, { text: '第三方工具', link: '/work/tools' }, ] - } + }, + { + text: '地图开发', + collapsed: true, + items: [ + { text: '微信小程序地图开发教程', link: '/work/maps/wx_map' }, + ] + }, ] \ No newline at end of file -- Gitee From 469eaef329a1530985bcd58a717695cdec958935 Mon Sep 17 00:00:00 2001 From: Bruce <850611576@qq.com> Date: Sun, 7 May 2023 21:00:25 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E5=BC=80=E5=8F=91=E5=89=A9=E4=BD=99=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/work/maps/wx_map.md | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/docs/work/maps/wx_map.md b/docs/work/maps/wx_map.md index 4ad0332..fceea65 100644 --- a/docs/work/maps/wx_map.md +++ b/docs/work/maps/wx_map.md @@ -194,3 +194,59 @@ class TaroMap extends Component { height: 70px; } ``` + +## 返回当前位置 + +点击返回图标,让地图回到当前位置,几乎是每个地图都必备的功能。而这个功能实现起来其实非常简单。 + +首先调用 `createMapContext()` 创建一个地图实例对象,再调用地图实例的 `moveToLocation()` 方法将地图中心移动到当前定位点即可。 + +```js +handleBackCurrenLocation = () => { + // 需要把地图的id传入 + const wxMap = Taro.createMapContext(mapId) + wxMap.moveToLocation({}) +} +``` + +## 地图拖动展示不同的标记点 + +由于地图上的标记点可能会非常多,所以一般都不会一口气把所有的点都画到地图上,而是展示地图中心某个范围之内的点。 + +拖动地图,再展示新的地图中心附近的标记点。 + +该功能的实现需要用到 `onRegionChange` 事件,当地图视野发生变化时会触发该事件,也就是拖动地图。像这种频繁触发的事件,最好防抖。 + +```js +import _ from 'lodash' + +class TaroMap extends Component { + // 防抖500毫秒 + onRegionChange = _.debounce(async (e) => { + const { type, detail } = e; + // 拖动地图会触发两次onRegionChange事件,我们只需要拖动结束时的事件 + if (type === 'end') { + const { centerLocation: { longitude, latitude } } = detail; + // ...获取新的标记点 + const markers = []; + this.setState({ markers }); + } + } + }, 500) + + render() { + + + + + + } +} +``` -- Gitee