【开发问题记录】uni bug、踩坑

1. uni样式穿透后不生效

样式穿透后,有可能 微信小程序 端 不显示效果,但是 h5 可能就会显示

解决方案
在methods同级下设置:

options: { styleIsolation: 'shared' },

2. 动态设置 style 的背景图片 属性

		<!--backgroundImage 不能用 - ,要换成驼峰命名法  -->
		<view class="songPlay-bg" :style="{backgroundImage:'url(' + bgPic + ')'}">

3. 控制台报错 length 未定义

当遇到这个 length 未定义的时候,

  • 查找 具体的文件夹下,template 标签里面所有的 用到 length 的地方 看一下在第一次渲染的时候 .length 前面的变量是否有值
<template>
	<view class="">
		<view class="pinglun" v-if="comments.length!== 0">
			<!--省略Xxxxxxxxxxxxxxxxxxxxxxxx -->		
			<uni-popup type='bottom' ref="popup" :mask-click="true" class="uni-popup">
				<!-- 关闭显示层 -->
				<view>
					<view class="uni-popup-top">
						<i class="iconfont icon-cuo" @click="close()"></i>
<!- -->
						<text >回复({{subPl.huifu.length}})</text>
					</view>
					<show-pl :comments="subPl" />
				</view>
			</uni-popup>
		</view>
	</view>
</template>

注意:上面的 subPl.huifu.length,当页面第一次 渲染的时候 subpl 还是空,所以会报错

在 temlate 标签上用 length 属性,一定要先检查前面的变量 是不是数组,是不是有值

4. 使用 uni-forms 标签,自定义校验规则,wx小程序端不生效,h5生效

这是官网的 api 介绍官网api ,,但是 在 onReady生命周期函数里面,调用setRules方法,依旧不生效

解决办法
直接把 return 里面定义的 relus 规则属性和值,一起剪切到 setRules 函数的参数位置,只留下值即可,键删除掉,

		onReady() {
			// 需要在onReady中设置规则

			this.$refs.phoneForm.setRules( {
					phone: {
						rules: [{
							required: true,
							errorMessage: '请输入手机号'
						}, {
							maxLength: 11,
							minLength: 11,
							errorMessage: '手机号位数错误~'
						}, {
							required: true,
							validateFunction: function(rule, value, data, callback) {
								console.log('value',value);
								if (value.length < 20) {
									callback('请至少勾选两个兴趣爱好')
								}
								return true
							}
						}]
					},
					password: {
						rules: [{
							required: true,
							validateFunction: function(rule, value, data, callback) {
								// console.log(value);
								// if (/^1[3-9]\d{9}$/.test(value)) {
								// 	return true
								// } else {
								// 	callback('请输入正确的手机号')
								// 	// return false
								// }
								callback('请输入正确的密码')
							}
						}]
					}
				})
			console.log(this.$refs.phoneForm);
		},

5. 二维码登录 模块 uni框架 开发网易云(使用网易云api)app

按照网易云接口的官方文档是 先 二维码key生成接口 =》 二维码生成接口 =》 二维码检测扫码状态接口 =》 获取账号信息, 这是一套完整的 网易云音乐api 二维码登录的方式

注意:

  • 网易云接口的 获取账号信息(例子是 : /user/account) 这个接口,其实是要跟一个 token为键,值是二维码检测扫码状态接口 返回的数据中,有一个 叫cookie 的 值,里面有 __csrf ,它的等号后面就是 token
  • 在 请求实例中 开启 withCredentials:true
  • 如果用 uni 开发,需要 给 获取账号信息 接口 单独设置一个 请求头的 cookie ,因为 微信小程序端不会自带 cookie

这个表格是 uni 官方的request 的文档的一部分

参数名类型说明平台差异说明
headerobject设置请求的 header,header 中不能设置 Referer。App、H5端会自动带上cookie,且H5端不可手动修改

实例代码,代码比较烂。。

  1. 先给请求设置 withCredentials:true
					uni.$request('get', '/login/qr/key', {
						timestamp: Date.now()
					}).then((res) => {
						if (res.data.data.unikey) {
							unikey = res.data.data.unikey
							// console.log(unikey);
							uni.$request('get', '/login/qr/create', {
								key: unikey,
								qrimg: 'base64'
							}).then(picurl => {
								qrurl = picurl.data.data.qrimg
								// console.log(qrurl);
								this.erweima = qrurl

								this.time = setInterval(() => {
									uni.$request('get', '/login/qr/check?key=' + unikey).then(
										res => {
											let cookie = ''
											console.log('验证是否扫码成功', res.data.message);
											// if (res.data.code === 803) {
											cookie = res.data.cookie
											let arr = res.data.cookie.split(';')
											let token = ''
											arr.forEach((item) => {
												if (item.indexOf('csrf') !== -1) {
													token = item.substr(7)
													console.log('token', token);
												}
											})
											// console.log('数组', arr);
											// console.log('token', arrToken);
											if (res.data.code === 803) {
											this.time2 =	setInterval(() => {
													 console.log('开始获取信息');
													uni.$request('get',
														'/user/account', {
															token: token
														}, {
															'cookie': cookie
														}).then(info => {
															console.log('信息',info);
															if (info.data.profile.userId) {

																// 存储到本地存储
																uni.setStorageSync('profile', info.data.profile)
																uni.showToast({
																	title: '扫码登录成功~',
																	icon: 'success'
																})
																setTimeout(()=>{
																	uni.switchTab({
																		url: '/pages/index/index'
																	})
																		// 清空定时器
																		clearInterval(this.time)
																		clearInterval(this.time2)
																},2000)

															}
														})
												}, 5000)
											}
											// }
										})
								}, 10000)
							})
						}
					})

6. 移除某个 css 中的样式

如果我们用 别人写好的组件、UI,如果需要修改它的样式,会用到样式穿透,但是如果想要删除某个样式呢

	/deep/ .uni-table-scroll{
		// 移除掉某个属性 ,  属性名:unset ; 就表示移除这个属性
		overflow-x: unset !important;
	}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值