首页 > 编程语言 >微信小程序 Notes | 开发常用事例(四)

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

时间:2022-11-11 22:34:49浏览次数:41  
标签:function 事例 微信 Notes markers item let data event


微信小程序 Notes | 开发常用事例(四)_git

前言


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

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

且行且珍惜吧。

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>

效果如下:

微信小程序 Notes | 开发常用事例(四)_ide_02

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

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

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

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

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

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


简单说下步骤:

  • 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 同时变色?

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

微信小程序 Notes | 开发常用事例(四)_小程序_03

思路都是一样的:

  • 知晓当前 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 如何自定义气泡窗口,支持动态切换,并且支持点击?

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

微信小程序 Notes | 开发常用事例(四)_git_04

这块内容相对 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、如何实现点击图片弹出并播放视频?

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

标签:function,事例,微信,Notes,markers,item,let,data,event
From: https://blog.51cto.com/u_13346181/5845497

相关文章

  • 微信小程序经纬度转化为具体位置(逆地址解析)
    小程序wx.getLocation只能获取经纬度,这时候想要具体地址就需要借助第三方sdk(逆地址解析)我这边第三方以腾讯位置服务举例一.首先小程序需要申请wx.getLocation接口权......
  • 淘宝客微信机器人API接口,淘客机器人API,微信机器人API
    淘宝客微信机器人API接口,淘客机器人API,微信机器人API微信二次开发完整API功能文档地址:wkteam.gitbook.io**首先了解一下微信机器人API是什么?**E云API是一个能将个人......
  • 微信小程序 页面跳转
    //关闭当前页面,返回上一页面或多级页面。可通过getCurrentPages()获取当前的页面栈,决定需要返回几层wx.navigateTo({url:'page/home/home?user_id=111'})wx.navi......
  • 微信DAT文件解密(dat转图像)
    微信电脑版现在已经是日常工作生活必不可少的工具,有时候删除了聊天记录或者被系统清理软件清理了,但还想查看曾经的微信聊天图片。这个时候辛辛苦苦找到了文件,却发现无法查......
  • 微信小程序
    小程序小程序的模块语法文本渲染{{msg}}条件渲染wx:if=""wx:elif=""wx:else列表渲染wx:for="{{list}}"{{item}}{{index}}wx:key="index"自定义列表渲染定义i......
  • 「微信小程序」|开发常用事例(六)
    历史文章回顾:​​微信小程序|开发常用事例(一)​​​​微信小程序|开发常用事例(二)​​​​微信小程序Notes|开发常用事例(三)​​​​微信小程序Notes|开发常用事例(四)​​......
  • 微信小游戏开发:demo 学习
    最近入坑了微信小游戏开发,官方有一个很经典的飞机大战的项目作为demo,虽然有不少的注释,对于游戏开发新手来说还缺少整体上的认知和把握。正好找到一个系列文章介绍这个dem......
  • Study Notes 之 回顾 HTML 基础
    LZ-Says:终于明白了鸡大说的,技术,沉淀,所谓的孤寂以及背后的坚持。比心,祝好~前言搞前段也搞了有一段日子,感觉嘛,还好。还是有很多的属性,有点蒙,写起来还是不能行云流水。大佬说......
  • 玩转微信小程序 之 初步了解微信小程序(2019/04/05)
    LZ-Says:现在能做的,就是踏踏实实,走好每一步~不去想未来会如何,安心做好自己应该做的事儿即可。前言前几日,集团官网开发暂时告一段落,回顾这段经历,感觉自己各方面还是有很多不足......
  • 玩转微信小程序 之 获取用户信息以及玩转基本列表渲染(2019/04/14)
    LZ-Says:总是要各种颠沛流离,才能换得片刻安宁。努力让自己变得更好,加油~前言前几天,完成了微信小程序的首章,学习起来,还是多多少少有点坑,不舒服。今天我们继续开启微信小程序......