前言

那啥,关于小程序整理了几篇笔记,多多少少对个人而言有点作用,下面附上对应的文章链接:

  • 微信小程序 | 开发常用事例(一)
  • 微信小程序 | 开发常用事例(二)
  • 微信小程序 Notes | 开发常用事例(三)

希望多多少少可以帮助到像我一样的前端小白。

这年头,挣钱不易,小作坊生存不易!

且行且珍惜吧。

1、List item 和 button 冲突怎么玩?

这个事情是这样的,由于韩总死乞白赖的非要列表新增转发 PDF 功能,由于微信小程序限制只有 button 才具有开放的一些权限,所以直接采用 button 包裹 image 的方案,如下:

<view class="news"> <block wx:for="{{ newsList }}" wx:for-index="index" wx:key="news"><view class="news-item" bindtap="onNewsItemClick" data-newsID="{{ item.newID }}"><text class="content">{{ item.content }}</text><view class="item_new_bottom"><text class="createTime">{{ item.createTime }}</text><button open-type="share" bindtap="onShareAppMessage" hover-stop-propagation="true"data-shareid="{{ item.newID }}"><image src="/images/ic_share.svg" mode="aspectFit"></image></button></view></view><van-divider wx:if="{{ index != newsList.length -1 }}" /></block>
</view>

效果如下:

有个比较尴尬的问题是,当点击分享图标时,对应的 item 事件也会执行,查阅了官方手册后。

将 button 事件类型调整为:catchtap 即可。

针对这两种方式,这里简单理解下。

  • 使用 catchtap 方式暖男,且只对你一个人暖,也就是说事件不会再次向上传递,自我消费;
  • bindtap 方式则是渣男,挨个宠幸。

2、如何分享页面并携带参数?

这个需求是真恶心,先来看下效果图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dbPW4U6-1607304985403)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/af80ce2169564e93aa6c1c504eb54ded~tplv-k3u1fbpfcp-watermark.image)]

简单说下步骤:

  • button 设置 open-type 为 share;
  • onShareAppMessage() 中设置 title、path 以及 imageUrl;
  • onLoad 中接收到解析即可。

下面附上关键 js 代码:

/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {let sharePDFId = parseInt(options.sharePDFId);if (sharePDFId >= 0) {var newFilePath = wx.env.USER_DATA_PATH + '/' + this.data.newsList[sharePDFId].content + '.pdf';let downloadPDFUrl = this.data.newsList[sharePDFId].pdfUrl;handleLoadPDF(newFilePath, downloadPDFUrl);}
},/*** 用户点击右上角分享*/
onShareAppMessage: function (res) {let that = this;let sharePDFId = parseInt(res.target.dataset.shareid);return {title: that.data.newsList[sharePDFId].content + '.pdf',path: '/pages/index/index?sharePDFId=' + sharePDFId,imageUrl: urlUtils.getComposeUrl('/images/img_share_pdf.png')}
},

3、如何实现列表点击 item title 变色,markers 同时变色?

先来看个效果吧,可能我得描述不是那么准确:

思路都是一样的:

  • 知晓当前 item 点击位置;
  • 更新 markers 中对应的 marker。

给出部分页面代码:

<view class="port_desc"><map id="map" bindmarkertap="onMarkersClick" setting="{{ setting }}" show-location markers="{{ markers }}"/><scroll-view scroll-y><block wx:for="{{ portList }}" wx:key="port"><view class="item_port" bindtap="onPortItemClick" data-portid="{{ item.portId }}" data-index="{{ index }}"></block></scroll-view>
</view>

对应的 js 文件:

Page({/*** 页面的初始数据*/data: { mCurPosititon: 0,  markers: [{iconPath: "/images/icon_prot.png",id: 0,latitude: 19.731021,longitude: 109.205006,width: 30,height: 36}, {iconPath: "/images/icon_prot.png",id: 1,latitude: 20.022159,longitude: 110.283528,width: 30,height: 36}], },/*** 生命周期函数--监听页面显示*/onShow: function () {this.refreshMarkers(0);},/*** 港口 item 点击 - 地图 markers 平移*/onPortItemClick: function (event) {let that = this;let currentId = event.currentTarget.dataset.portid;let portBean = that.data.portList[currentId];// 平移 markers 到地图中心this.mapContext.moveToLocation({longitude: portBean.longitude,latitude: portBean.latitude,success(res) {console.log('---> 平移成功 ', res);},fail(err) {console.log('---> 平移失败 ', err);}});that.refreshMarkers(1);that.setData({mCurPosititon: event.currentTarget.dataset.index,});that.refreshMarkers(0);},/*** 刷新当前选中的 Markers 点*/refreshMarkers: function (type) {let that = this;var tempMarkers = that.data.markers;tempMarkers[that.data.mCurPosititon].iconPath = type == 0 ? '/images/icon_prot_sel.png' : '/images/icon_prot.png';that.setData({markers: tempMarkers,});}})

有时候想想,这东西真的是相通的。遇到问题,静下心来,慢慢梳理,别慌。

4、wxml 中的三元运算符使用

这个比较 easy,直接放上代码:

<text class="title" style="color:{{ mCurPosititon == index ? 'red' : 'black' }}">{{ item.title }}</text>

5、map 如何自定义气泡窗口,支持动态切换,并且支持点击?

先来看个效果图,一目了然:

这块内容相对 easy,直接放上代码咯。

首先是 js 关键代码:

/*** 页面的初始数据*/
data: { portName: '',markerId: 0, markers: [{id: 0, iconPath: "/images/icon_prot.png",latitude: 19.731021, longitude: 109.205006,width: 30, height: 36, customCallout: {anchorX: 0,anchorY: 0,display: "ALWAYS"}}, {id: 1, iconPath: "/images/icon_prot.png",latitude: 20.022159, longitude: 110.283528,width: 30, height: 36, customCallout: {anchorX: 0,anchorY: 0,display: "ALWAYS"}}, ],portList: [{portId: 0, markerId: 0, title: '洋浦港',desc: '洋浦港....',avatar: 'https:/xxxx9e.jpg',latitude: 19.731021, longitude: 109.205006,}, {portId: 1, markerId: 1, title: '海口港',desc: '海口港xxx',avatar: 'https://xxxae.jpeg',latitude: 20.022159, longitude: 110.283528,}, ]
},/*** 生命周期函数--监听页面显示*/
onShow: function () {let that = this; // 初始化数据let portBean = that.data.portList[0];that.setData({portName: portBean.title,markerId: portBean.markerId});
},/*** 港口 item 点击 - 地图 markers 平移*/
onPortItemClick: function (event) {let that = this;let currentId = event.currentTarget.dataset.portid;let portBean = that.data.portList[currentId];// 平移 markers 到地图中心this.mapContext.moveToLocation({longitude: portBean.longitude,latitude: portBean.latitude,success(res) {console.log('---> 平移成功 ', res);},fail(err) {console.log('---> 平移失败 ', err);}});that.refreshMarkers(1);that.setData({mCurPosititon: event.currentTarget.dataset.index,});that.refreshMarkers(0);// 更新气泡数据that.setData({portName: portBean.title,markerId: portBean.markerId});
},/*** Markers 点击查看详情*/
bindcallouttap: function (event) {let markerId = parseInt(event.detail.markerId); // 其实这就是 id,为了实现对应的详情切换wx.navigateTo({url: '/pages/portDetail/portDetail?portId=' + markerId})
},/*** 刷新当前选中的 Markers 点*/
refreshMarkers: function (type) {let that = this;var tempMarkers = that.data.markers;tempMarkers[that.data.mCurPosititon].iconPath = type == 0 ? '/images/icon_prot_sel.png' : '/images/icon_prot.png';that.setData({markers: tempMarkers,});
}

然后就是对应的 wxml 关键代码:

<map bindcallouttap="bindcallouttap" id="map" setting="{{ setting }}" show-location markers="{{ markers }}"><cover-view slot="callout"><cover-view marker-id="{{ markerId }}"><cover-view class="map_custiom_callout"><cover-view class="portName">{{ portName }}</cover-view></cover-view></cover-view></cover-view>
</map>
<scroll-view scroll-y><block wx:for="{{ portList }}" wx:key="port"><view class="item_port" bindtap="onPortItemClick" data-portid="{{ item.portId }}" data-index="{{ index }}"><!-- ... --></block>
</scroll-view>

这块从一开始自己就进入了一个误区。其实很多事情都是循循渐进,太过于急功近利,反而有点得不偿失了。无论身处何地,保持自身冷静,条理分析。

6、关于那些烦人的相对路径处理

相信大家都遇到过如下情况,比如我定义一个 urlUtils 工具类,那么在对应使用的 js 中就需要通过如下方式引用:

  • const urlUtils = require(’…/…/utils/urlUtils.js’)

看到前面的 …/ 就说烦不烦?

咨询大佬,大佬提供了一种使用绝对路径方案,如下:

Step 1: app.js 新增 require 方法:

require: function ($url) { return require($url) },

Step 2: 替换原有很 low 的方式。

//获取应用实例
const app = getApp();
const urlUtils = app.require('utils/urlUtils.js');

ummm,爽多了。哈哈哈。

对了,记得关闭「上传时进行代码保护」

7、如何实现点击图片弹出并播放视频?

还是老规矩,放个效果图,稍等,等我录制,

微信小程序 Notes | 开发常用事例(四)相关推荐

  1. 微信小程序 Notes | 常用开发事例(五)基于云平台导出 Excel

    历史文章回顾: 微信小程序 | 开发常用事例(一) 微信小程序 | 开发常用事例(二) 微信小程序 Notes | 开发常用事例(三) 微信小程序 Notes | 开发常用事例(四) 一.前言 最近一 ...

  2. 微信小程序云开发——常用功能2:操作云数据库一键批量导入数据(导入json文件)

    微信小程序云开发--常用功能2:操作云数据库一键批量导入数据(导入json文件) 今天我们要添加100条数据.下面的过程是先创建一条记录,然后导出这条数据看json文件中是如何编辑字段的,然后仿照这个 ...

  3. 微信小程序 Notes | 开发常用事例(三)

    前言 之前涉足小程序,简短的记录了下开发过程中遇到的点点滴滴: 微信小程序 | 开发常用事例(一) 微信小程序 | 开发常用事例(二) 而今再次负责小程序,时隔许久,真是一片懵逼,多亏了之前的简短记录 ...

  4. 微信小程序从零开始开发步骤(三)底部导航栏

    上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...

  5. 微信小程序从零开始开发步骤(三)

    上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...

  6. 微信小程序从零开始开发步骤(二)创建小程序页面

    上一章注册完小程序,添加新建的项目,大致的准备开发已经完成,本章要分享的是 要创建一个简单的页面了,创建小程序页面的具体几个步骤: 1. 在pages 中添加一个目录 选中page,右击鼠标,从硬盘打 ...

  7. 微信小程序云开发 初学者入门教程二

    微信小程序云开发 初学者入门教程二-前端操作数据库模块 如何操作数据库,作为一名前端,如果对数据的知识不够熟悉也没关系,从现在开始好好学习就行,数据库的操作内容差不多涉及增删改查四大模块,花一些业余的 ...

  8. 微信小程序从零开始开发步骤(一)搭建开发环境

    从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了. 1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: ...

  9. 微信小程序云开发实战:网上商城(四)

    微信小程序云开发实战:网上商城(四) 前言 本节我们来实现商品展示页面.代码下载 服务端代码实现 上节提到要生成上图所示的商品画面,那我们的商品比原来多需要两个属性: 类别 是否属于推荐商品 具体实现 ...

最新文章

  1. 802. 找到最终的安全状态
  2. springboot系列十五、springboot集成PageHelper
  3. C#实现的UDP收发请求工具类实例
  4. Q142:PBRT-V3,交点处各种微分的求解(三角形,3.6章节)
  5. Makefile文件(六)_使用条件判断
  6. 用 Lucene 构建文档数据库
  7. Flash小游戏星空大战SpaceBattleGame 源代码
  8. 163邮箱注册申请入口,申请163的邮箱账号
  9. 消息队列返回错误:Resource temporarily unavailable
  10. three.js 实现露珠滴落动画
  11. adb调试android设备
  12. php mysql bootstart_PHP+MySQL+Bootstrap 美食主题博客项目
  13. Android studio 仿微信朋友圈页面(简单版)
  14. 移动开发者的必知音视频基础知识
  15. Python怎么进行时区的转换
  16. Linux虚拟主机与Windows虚拟主机之间有什么区别
  17. html画布里增添颜色,在HTML5画布中更改笔触颜色
  18. 【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~
  19. NOIP 2016 蚯蚓 题解
  20. 软件测试工程师发展方向,主要有哪些?

热门文章

  1. Wondershare PDFelement for Mac v8.6.1 中文版 – 强大的PDF编辑工具
  2. 软件构造学习笔记ATD
  3. 泛微OA使用笔记-测试
  4. 机动车排放微观控制-汽油机内净化技术
  5. Python爬虫 | 以滑雪为例演示大众点评商铺信息采集(字体反爬)
  6. python 学习笔记(二)数列
  7. java转换2进制_java里怎样把文件转换成二进制
  8. 35岁+做互联网的你该何去何从呢?
  9. 【Python学习】matplotlib学习总结——条形图
  10. 经纬度5位数和6位数差多少_各大在线地图,使用的经纬度坐标为什么都精确到小数点之后第六位...