关键词:demo collections 微信小程序
demo 源码:gitee.com/huakangkane…
Canvas
结合 onShareAppMessage
使用demo:
<style>
/* wxss */
.cantSee {
width: 320px;
height: 256px;
}
</style>
<!-- wxml -->
<canvas class="cantSee" type="2d" ></canvas>
<button open-type="share">分享</button>
<!-- js -->
<script>
Page({
data: {
imgPath: ''
},
onShow() {
this.draw()
},
draw() {
// 获取元素
wx.createSelectorQuery()
.select('.cantSee')
.fields({ node: true, size: true })
.exec(this.initImagePath.bind(this));
},
initImagePath(list) {
const dpr = wx.getSystemInfoSync().pixelRatio;
const item = list[0];
const canvas = item.node;
const context = canvas.getContext('2d');
const { width } = item;
const { height } = item;
canvas.width = width * dpr;
canvas.height = height * dpr;
context.scale(dpr, dpr);
// 设置背景/方块
context.fillStyle = 'green';
context.fillRect(0, 0, width, height);
// 画圆
context.fillStyle = 'blue';
context.beginPath();
context.arc(550, 300, 400, 0, Math.PI * 10);
context.strokeStyle = 'rgba(1,1,1,0)';
context.fill();
context.stroke();
// 设置边框
context.strokeStyle = '#666';
context.strokeRect(0, 0, width, height);
// 写字
context.fillStyle = '#fff';
context.font = '70px "Fira Sans"';
context.textAlign = 'center';
context.fillText('测试', 160, 120);
// 再写一个
context.font = '20px "Fira Sans"';
context.textAlign = 'center';
context.fillText('测试', 160, 190);
context.restore();
const _this = this;
// 保存为图片
wx.canvasToTempFilePath({
x: 0,
y: 0,
width,
height,
canvas,
success: (res) => {
_this.setData({
imgPath: res.tempFilePath
})
},
});
},
// 点击分享
onShareAppMessage() {
const { imgPath } = this.data
return {
title: `自定义标题`,
path: `/pages/index/index`,
imageUrl: imgPath,
success(res) {
// 转发成功之后的回调
if (res.errMsg === 'shareAppMessage:ok') {
// ...
}
},
fail(res) {
// 转发失败之后的回调
if (res.errMsg === 'shareAppMessage:fail cancel') {
// 用户取消转发
} else if (res.errMsg === 'shareAppMessage:fail') {
// 转发失败,其中 detail message 为详细失败信息
}
}
}
},
})
</script>
效果:
上传文件/图片
实现上传功能通常可以直接使用 UI 框架自带的上传组件
如果需求比较简单,或者定制化程度比较高。也可以自己简单实现一个:
Page({
data: {
imgUrl: null
},
// 上传图片
async toModifyImage() {
const _this = this;
try {
const tempFilePath = await new Promise((resolve, reject) => {
wx.chooseMedia({
count: 1,
mediaType: 'image',
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const { tempFilePath, size } = res.tempFiles[0];
if (size <= 10485760) {
resolve(tempFilePath);
} else {
reject({ errMsg: '图片大小超出限制,请重新上传' });
}
},
fail: (err) => reject(err),
});
});
// 上传
wx.uploadFile({
url: `/api/uploadFile`, // 上传接口
filePath: tempFilePath,
header: { Authorization: wx.getStorageSync('token') },
name: 'file',
success({ statusCode, data }) {
if (statusCode === 200) {
const result = JSON.parse(data);
const { imgUrl } = result.data;
_this.setData({ imgUrl });
}
},
});
} catch (error) {
if (error.errMsg === 'chooseImage:fail cancel') return;
console.log('上传图片报错', error);
}
},
})
地图组件/导航
最简单的就是直接把Map组件塞进去,增加功能就添加对应的插件服务,其实没什么难度。按照文档一步步执行就能出效果。下面是基于官方文档写的简单的业务需求:展示位置,点击按钮进行导航。
// app.json
{
// ...
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序定位"
}
},
"requiredPrivateInfos": [
"chooseLocation",
"getLocation"
],
"requiredBackgroundModes": [
"location"
],
"sitemapLocation": "sitemap.json",
// 微信路线规划插件
"plugins": {
"routePlan": {
"version": "1.0.18",
"provider": "wx50b5593e81dd937a"
}
}
}
<view class="map-wrap">
<map
id="mapId"
class="map"
subkey="{{subkey}}"
latitude="{{latitude}}"
longitude="{{longitude}}"
bindmarkertap="onMarkerTap"
></map>
</view>
<view class="btn-wrap">
<button bindtap="onAppNav">微信导航(推荐)</button>
<button bindtap="onPluginNav">小程序导航</button>
</view>
<script>
Page({
data: {
latitude: 23.099994,
longitude: 113.324520,
// 申请的腾讯位置服务key
subkey: ''
},
// 聚合图层示例代码 https://developers.weixin.qq.com/miniprogram/dev/component/map.html
// app导航
onAppNav() {
const { detail, latitude, longitude } = this.data;
wx.openLocation({
name: detail,
latitude: +latitude,
longitude: +longitude,
});
},
// 小程序导航
onPluginNav() {
const { subkey, detail, latitude, longitude } = this.data;
const referer = '小程序'; // 调用插件的app的名称
const endPoint = JSON.stringify({
//终点
name: detail,
latitude: +latitude,
longitude: +longitude,
});
wx.navigateTo({
url: `plugin://routePlan/index?key=${subkey}&referer=${referer}&endPoint=${endPoint}`,
});
},
})
</script>
添加公众号关注
微信提供了在扫二维码的场景下展示的公众号组件<official-account></official-account>
, 所以在业务上主要兼容非扫码进入的场景(scene!==1011
)。我们可以利用 web-view
组件跳转到关联的公众号上,公众号发布一篇关注的文章,就能解决。注意:需要在开发管理->开发设置->服务器域名 中添加 https://mp.weixin.qq.com