当前位置: 代码网 > 移动>腾讯>微信 > 总结分享一些小程序开发中遇到的问题(帮忙避坑)

总结分享一些小程序开发中遇到的问题(帮忙避坑)

2025年03月31日 微信 我要评论
本篇文章给大家总结下之前开发微信小程序的时候遇到过一些问题,并将解决方案分享给大家,希望对大家有所帮助!请以小程序最新文档为准~:https://developers.weixin.qq.com/eb

本篇文章给大家总结下之前开发微信小程序的时候遇到过一些问题,并将解决方案分享给大家,希望对大家有所帮助!

总结分享一些小程序开发中遇到的问题(帮忙避坑)

请以小程序最新文档为准~:https://developers.weixin.qq.com/ebook?action=get_post_info&docid=0008aeea9a8978ab0086a685851c0a&highline=webview

渲染列表时用 block 包裹

<block>
  <view> {{index}}: </view>
  <view> {{item}} </view></block>
登录后复制

block 不会真实渲染到页面上,只作为一个包裹元素,接受控制属性

写一个自定义组件

自定义组件分为 4 部分

  • properties 组件接收的属性

properties: {
  // 输入框的默认提示
  placeholder: {
	type: string,  // 属性值的类型
	value: ''      // 属性默认值
  }
},
登录后复制
  • data 组件数据

  • methods 组件方法,一般内部方法用_开头

  • 组件的生命周期函数,一般使用 ready,在组件布局完成后执行,此时可以获取节点信息(使用 selectorquery

调用父组件传入的方法

// 子组件
var myeventdetail = {value: ''}; // detail对象,提供给事件监听函数,写需要传给外面的数据
var myeventoption = {} // 触发事件的选项
this.triggerevent('onclear', myeventdetail, myeventoption)
登录后复制
<!-- 父组件 -->
<searchbar></searchbar><!-- 像绑定 bindtap 一样绑定自定义函数 -->
登录后复制
// 父组件
onsearch(e){
  console.log(e.detail.value)
}
登录后复制

父组件直接调用子组件的方法

// 父组件,使用 selectcomponent 拿到子组件的实例,直接调用其中的方法
let searchbar = this.selectcomponent('#search-bar');
searchbar.setdata({ value: e.currenttarget.dataset.name })
searchbar.onclicksearch({ detail: {value: e.currenttarget.dataset.name}});
登录后复制

子组件中获取 dom 宽高

// 获取屏幕宽度
let windowwidth = wx.getsysteminfosync().windowwidth
// 在组件内部需要写 this
let query = wx.createselectorquery().in(this);
let that = this;
query.selectall('.tagitem').boundingclientrect()
query.exec(function (res) {
	let allwidth = 0;
	res[0].map(item=&gt;{
		allwidth = allwidth + item.width
		return allwidth
	})
	let length = res[0].length
	let ratiowidth = allwidth / windowwidth
	that.setdata({
		alllength: length,
		iphone: ratiowidth + (length == 1 ? 0 : res[0].length * 0.0533)
	})
})
登录后复制

页面返回时不会调用 onload

之前把调用接口的部分写到了onload里,从文章列表进入详情页,在从详情页点击左上角回退返回列表页,列表页的阅读数应该更新,但是没有更新,因为没有重新调文章列表接口。

所以把调文章列表接口的部分写好了onshow里。

自定义 tabbar 优化

第一次优化,将组件封装的tabbar改成页面的模版形式

1、之前用组件的形式写的,改为了 template;tabbar 上的图标都改成的 iconfont,解决点击 tabbar 时候会闪的问题

<template><view><block><navigator><view><text></text>{{item.text}}<text>{{tabbar.num &gt; 99 ? '99+' : tabbar.num}}</text></view></navigator></block></view></template>
登录后复制

2、点击 tabbar 时,需要销毁之前的页面,在跳到需要跳转的页面,所以在 navigator 组件用了 relaunch

第二次优化,将带有tabbar的页面都封装成组件写在页面,在页面中setdata切换tab

<homepage></homepage><articlelibrarypage></articlelibrarypage><doclistpage></doclistpage><mepage></mepage><tabbar></tabbar>
登录后复制

修改的地方:

  • 带有tabbar的页面都重写为组件形式

  • 因为组件中只有挂载完成后的 ready 方法,所以之前页面中 onshow,onreachbottom,onpulldownrefresh 都放到父页面调用

onpulldownrefresh: function () {
	if (this.data.tabbarid === this.data.tabbarlist.article) {
	  // 使用 selectcomponent 找到组件实例,调用内部方法
	  let articlepage = this.selectcomponent('#article-page');
	  articlepage.onpulldownrefresh();
	} else if (this.data.tabbarid === this.data.tabbarlist.doctor){
	  let doctorpage = this.selectcomponent('#doctor-page');
	  doctorpage.onpulldownrefresh();
	} else {
	  wx.stoppulldownrefresh();
	}
},
登录后复制

带来的问题:

  • 每个tabbar都会有下拉刷新的效果,即使不需要下拉刷新

  • 从其他页面点击按钮,直接跳到首页的某一个tab卡,可能会有问题

使用 iconfont

https://www.jianshu.com/p/1cfc074eeb75

  • 登录 iconfont.cn 下载 zip 包

  • 解压缩,其中的 .ttf 文件在 selectorquery 上面转成 base64 格式

  • 将 style.css 写入新建的 iconfont.wxss 中,上面的字体文件路径用刚刚转好的 base64 替代

  • 在 app.wxss 中 import iconfont.wxss

注意:组件中的样式本身不受 app.wxss 影响,因此,组件中需要使用 iconfont 的时候,需要手动引一下 app.wxss 或者 iconfont.wxss

列表的左滑效果

1、在列表的父元素上绑定事件

<view class="list-container" wx:for="{{doctorlist.list}}" wx:key="{{index}}"><view bindtouchstart="'ontouchstartlistitem'" bindtouchmove="'ontouchmovelistitem'" style="{{item.txtstyle}}">滑动的内容
	</view><view>滑动后显示的按钮</view></view>
登录后复制
.list-container{
	position: relative;
	width:100%;
	height: 224rpx;
	overflow: hidden;
}
.list-item{
	position: absolute;
	left: 0;
	z-index: 5;
	transition: left 0.2s ease-in-out;
	background-color: #fff;
}
.backcover{
	box-sizing: border-box;
	width: 200rpx;
	height: 218rpx;
	position: absolute;
	right: 0;
	top: 0;
	z-index: 4;
}
登录后复制

2、通过判断滑动距离修改列表项的 left 值

ontouchstartlistitem: function (e) {
	// 是单指触碰
	if (e.touches.length === 1) {
		// 记下触碰点距屏幕边缘的x轴位置
		this.setdata({
			startx: e.touches[0].clientx,
		})
	}
},

ontouchmovelistitem: function (e) {
	var that = this
	if (e.touches.length == 1) {
		var disx = that.data.startx - e.touches[0].clientx;
		var deletebtnwidth = that.data.deletebtnwidth;
		var txtstyle = "";
		if (disx  deletebtnwidth / 2 ? "left:-" + deletebtnwidth + "px" : "left:0px";
		var index = e.currenttarget.id
		var list = that.data.doctorlist.list
		list[index].txtstyle = txtstyle;
		that.setdata({
			doctorlist: {
				list: list,
				total: that.data.doctorlist.total
			}
		});
	}
},
登录后复制

【相关学习推荐:selectorquery

以上就是总结分享一些小程序开发中遇到的问题(帮忙避坑)的详细内容,更多请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com