记录一些uniapp开发小程序遇到的问题【持续更新】

前提:vue3+uniapp+uviewPlus+js

使用工具:hbx

问题:

1、u-input在小程序中会出现聚焦状态无法点击清除输入框内值的情况

看u-input源码,@input和@change方法都是绑定的valueChange方法,清除方法onClear如下,先赋值为空然后在nextTick中改变已有值,但是在小程序中由于某种机制会在点击清除时优先为失焦状态,此时清除按钮被隐藏,或者有时候先触发清除,但是由于又触发了input和change又把原来的值给赋值上去了导致出现问题,所以解决办法就是如下将清空方法修正,,增加一个settimeout延时清空即可

			onClear() {
				// #ifdef MP-WEIXIN
				setTimeout(() => {
					this.innerValue = ''
					this.valueChange()
					this.$emit('clear')
				}, 100)
				// #endif

				// #ifndef MP-WEIXIN
				this.innerValue = ''
				this.$nextTick(() => {
					this.valueChange()
					this.$emit('clear')
				})
				// #endif
			},

2、u-tabs组件在设置itemStyle时切记不要加左右margin,想要改变左右间距请设置paddingLeft和paddingRight,否则会导致滑块定位不对的情况

3、u-swipe-action组件,配合z-paing使用且u-swipe-action-item有多个,要给u-swipe-action-item加marginbottom需要如下代码,原因未知

	:deep(.u-swipe-action-item:not(:last-child)) {
			margin-bottom: 32rpx;
	}

4、u-button 在微信小程序中貌似无法通过deep改变样式 如果ui很花慎用

5、写自定义组件时,如果用到了第三方组件,比如我这在自定义组件中使用到了uviewplus,则在组件代码中应加如下设置

<script>
	export default {
		options: {
			styleIsolation: 'shared', // 解除样式隔离
		},
	}
</script>

6、自定义组件中加slot,在小程序中调用自定义组件且此插槽内有多个view的时候,有时候会莫名其妙多生成一个view套住所有内容导致设置的class失效,所以建议在使用自定义组件的插槽时在使用页面自行先用一个view宽高设置100%,也就是说尽量保持插槽中尽量只有一个子节点

					<template #paging_empty>
						<view class="fill">
							<view class="list-empty-content" v-if="netWorkType !== 'none'">123 </view>
							<view class="list-empty-content" v-else>
								<image
									style="width: 576rpx; height: 224rpx"
									src="xxxxx"></image>
								<text class="list-empty-content-text">暂无数据!</text>
							</view>
						</view>
					</template>
	// 缺省部分通用样式
	.list-empty-content {
		width: 100%;
		height: calc(100% - 40rpx);
		background-color: #fff;
		border-radius: 12rpx;
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		&-text {
			margin-top: 32rpx;
			color: #6d809d;
			font-size: 28rpx;
			line-height: 38rpx;
			font-weight: 600;
		}
	}

7、自定义组件中使用第三方组件时最好在外面套一层view然后在这个view上设置class用来控制宽高定位啥的而不是直接在第三方组件上设置class

8、uniapp在使用getLocation、chooseLocation的时候需要在对应项目的manifext.json的微信小程序中配置位置接口的权限,并且!!!要在源代码视图里加上以下代码

manifext.json

 "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]

当然你也可以直接在源代码视图中加上如下提示代码,微信公众平台也要去配置嗷,具体不说了

	 "permission" : {
            "scope.userLocation" : {
                "desc" : "初始化时获取用户的位置信息用于外出打卡定位"
            }
        },
        "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]

9、UI框架直接下载到uni_modules包里,根据ui直接修改源码的样式(不限于css、props中的基础值),修改了啥写在readme.md里记录清楚,开发的时候方便很多。毕竟,这个ui框架不就是为了项目服务的么。

10、在一个页面中自定义组件挨在一起,直接给组件style设置margin貌似不生效,可以给组件套一层view

在这里插入图片描述

11、项目开始的时候就可以考虑考虑分包,提升性能,tab页面放在主包,然后根据tab或者功能进行分包操作,在进入某个tab的时候就预加载分包,然后本地图片如果只在分包中用到的话,可以在分包目录下建一个static,在static中放图片,uniapp构建的时候会把此图片放到对应分包中。

	"pages": [{
			"path": "pages/main/index",
			"style": {
				"navigationStyle": "custom"
			}
		},
		{
			"path": "pages/main/login",
			"style": {
				"navigationBarTitleText": "login"
			}
		},
		{
			"path": "pages/main/mine",
			"style": {
				"navigationBarTitleText": "mine"
			}
		},
		{
			"path": "pages/main/device",
			"style": {
				"navigationBarTitleText": "",
				"enablePullDownRefresh": false
			}
		}
	],
	// 分包
	"subPackages": [{
			"root": "pages/sub_home",
			"pages": [{
				"path": "test/test",
				"style": {
					"navigationBarTitleText": "",
					"enablePullDownRefresh": false
				}
			}]
		},
		{
			"root": "pages/sub_device",
			"pages": [{
					"path": "add_device_select",
					"style": {
						"navigationBarTitleText": "",
						"enablePullDownRefresh": false
					}
				},
				{
					"path": "add_device_form",
					"style": {
						"navigationBarTitleText": "",
						"enablePullDownRefresh": false
					}
				}
			]
		}
	],
	"tabBar": {
		"color": "transparent",
		"selectedColor": "blue",
		"borderStyle": "white",
		"backgroundColor": "transparent",
		"list": [{
			"pagePath": "pages/main/index",
			"iconPath": "static/images/tab/home.png",
			"selectedIconPath": "static/images/tab/home_active.png",
			"text": "首页"
		}, {
			"pagePath": "pages/main/device",
			"iconPath": "static/images/tab/device.png",
			"selectedIconPath": "static/images/tab/device_active.png",
			"text": "设备管理"
		}, {
			"pagePath": "pages/main/mine",
			"iconPath": "static/images/tab/mine.png",
			"selectedIconPath": "static/images/tab/mine_active.png",
			"text": "我的"
		}]
	},
	// preloadRule   前面为主页面(进入到哪个页面),对象内为你的分包
	"preloadRule": {
		"pages/main/index": {
			"network": "all",
			"packages": ["pages/sub_home"]
		}
	},

在这里插入图片描述

12、如果你的项目要求多端通用,那么一定要注意图片路径和页面路径,本地图片最好使用import导入

13、全局modal弹窗emmmm 我写了一个公用页面,用来放tab、tabbar、modal…留了个slot放内容,每个页面都引入一次即可,有什么全局的功能其实都能放这个组件中。其他挂载全局的方法总有不兼容的情况。。。

14、自定义组件中如果使用到了第三方ui库的某些组件,并且要用到图片,比如u-input的prefixIcon这个属性,图片路径类型是string的,图片不能放在component对应组件的目录下,得放在static静态资源中才能获取,uniapp编译后会把图片放都在assets中,u-input组件内此属性对应的组件是u-icon,会从uviewplus的根目录开始查询图片。

15、写自定义组件的时候记得,小程序不支持v-bind=“$attrs”,所以要调用方法或者传递属性的时候自己暴露方法去传

16、小程序貌似没有持续监听一个盒子高度变化的api或者方法,所以有些组件比如手风琴内容高度发生变化时无法实时改变高度,如果有的话请在评论区指教一下

17、在进行页面跳转后,uni.on和uni.emit无法正常接收数据。解决办法:目前是写在navegateto的success中,如果没用就加个settimeout吧。on要确保在emit创建之后才能接收到数据。还有种方式,假设A->B页面,传值去B,在on中定义另一个emit,在B页面中on和emit一起调用。一定要记得在unload中off掉on的事件!

//A页面
uni.$on('send',()=>{
	uni.$emit('sendData', data)	
})
uni.navigateTo...

//B页面
onReady(()=>{
	uni.$on("sendData",(data)=>{
		...
	})
	uni.$emit('send')
})

onUnload(()=>{
	uni.$off('send')
	uni.$off('sendData')
})

18、uview-plus的form表单验证默认类型是string,如果只是想判空的话一定要记得把type设置为number/array等!因为有可能你赋的值是number类型导致校验失败,你就会像我一样找半天不知道错误在哪 😦

犯浑了,不能设置为any,any的话在小程序里怎么校验都是通过的,蛋疼。应该改成字典中value的对应类型

xxx: [
		{
			type: 'number',
			required: true,
			message: '请选择xxx',
			trigger: ['blur', 'change'],
		},
	],

19、uviewPlus的u-index-list 在小程序中是根据cell离屏幕顶部的距离来计算的scrollView,计算的时候应该还要算上自定义导航栏的高度才对,另外提一嘴,他的prop里得stiky根本没用到,设不设置都会吸顶

			// #ifdef MP-WEIXIN
			// 微信小程序下,scroll-view的scroll-into-view属性无法对slot中的内容的id生效,只能通过设置scrollTop的形式去移动滚动条
			// ps:在加入自定义高度后需要传入customNavHeight以确保列表跳转正确,
			const customNavHeight = this.customNavHeight
			this.scrollTop = this.children[currentIndex].top - uni.$u.getPx(customNavHeight)
			// #endif

20、z-paging这个组件,好用,但是的话,如果项目里面用到的ui框架是uview-plus,则在小程序中可能会出现返回顶部失效的情况,我看了下源码,大致是因为uviewPlus为了兼容vue2的nexttick,在index.js中写了如下代码,将挂载在vue上的this.$nextTick作为回调调用导致,所以我将这三行注释掉了,返回顶部也正常了。233333

	  Vue.config.globalProperties.$nextTick = (cb) => {
          cb();
      }

21、小程序格式字体引入如果字体是静态且用到的字数不多的话,建议用fontmin压缩一下,小程序不支持ttf引入,所以需要再转化成base64编码形式引入

22、小程序不支持view的background图片设置

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
UniApp是一种基于Vue.js框架的跨平台开发框架,可以用于开发小程序、H5、App等多个平台的应用程序。使用UniApp开发小程序具有以下特点和优势: 1. 跨平台开发:使用UniApp可以一次编写代码,同时在多个平台上运行,包括微信小程序、支付宝小程序、百度小程序、字节跳动小程序等。 2. 统一开发语言:UniApp使用Vue.js作为开发语言,开发者可以使用熟悉的Vue语法进行开发,降低学习成本。 3. 丰富的组件库:UniApp提供了丰富的组件库,包括基础组件和扩展组件,可以快速构建界面。 4. 强大的性能优化:UniApp在底层做了很多性能优化,包括渲染层和逻辑层的分离、虚拟DOM等,提升了应用的性能和用户体验。 5. 支持原生能力:UniApp支持调用原生API,可以实现更多的功能和交互效果。 使用UniApp开发小程序的步骤如下: 1. 安装UniApp开发工具:下载并安装HBuilderX,它是一款专门用于UniApp开发的集成开发环境。 2. 创建项目:在HBuilderX中创建一个UniApp项目,选择小程序模板,并填写相关信息。 3. 开发页面:在项目中创建页面,使用Vue语法编写页面的结构和样式,添加交互逻辑。 4. 调试和预览:在HBuilderX中可以进行实时预览和调试,可以在模拟器或真机上查看效果。 5. 发布小程序:完成开发后,可以将项目打包成小程序发布到各个平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值