关于Uniapp使用UQRCode的案例

使用场景: uniapp + uqrcode,根据内容变化,动态生成二维码。仅在触发时,弹窗显示。

例如,给工厂定制的App能够改变IP地址,为什么能够改IP地址,因为不同厂的内网IP不一样,每次打包成安装包之后,只需要一个用户可以自行配置IP地址,然后生成二维码,其它用户扫一扫就可以了,这样就会相对方便快捷。

流程: 点击按钮 ==> 弹窗显示二维码 ==> 修改配置 ==> 二维码更新 ==> 关闭弹窗

但在实际中,遇到了一些问题。

例如:

写在弹窗中,重复调用make函数为什么会报错,甚至导致App重启;

或者重复调用make函数为什么没有报错也没有重绘,

或者为什么popup弹窗关闭之后,再次make之后就显示空白?

这些坑,我不知道如何去解决,

但是我找到一条可行的路!!!

接下来请跟着我写。仅限uniapp,微信小程序等不知道,自行测试。

第一步:在uniapp插件市场下载UQRcode导入项目,下载完之后就能在项目中使用uqrcode标签。

<uqrcode ref="QRCode" value="12345" :size="100" canvas-id="qrcode"></uqrcode>

如果能看到二维码,就成功了第一步,当然没看到的话,看看是不是没有定义宽度高度,在标签对里增加class就行,class要自己写,定义宽度高度就行,这里宽度高度要和 size=100 的这个100一致,100是二维码大小,可以改。value就是二维码的内容。

第二步:把这个放在popup弹窗里,但是一上来就渲染有点问题,所以就需要在标签上增加start属性,以下仅显示属性增加项

<uqrcode 
    class="uqrcode" 
    :options="{ errorCorrectLevel:1, foregroundColor:'darkseagreen' }" 
    :start="false">
</uqrcode>

增加了class类,定义宽度高度

增加了options第一个定义了纠错等级,1234,纠错等级越高,二维码越大,少量字符用1就行,后面那个是颜色,按需修改就行。

start改为false就是让这个组件一上来不去自动生成二维码。

那么怎么生成二维码呢?需要获取到该组件,然后调用make方法

// Vue 2
this.$refs.QRCode.make();    // 方式1
this.$refs['QRCode'].make(); // 方式2

/**
Vue3 需要先引用
import { ref } from 'vue';
然后在setup函数里写
setup() {
    const QRCode = ref(null);
    return { QRCode }
}
*/

popup.value.open(); // 这里的popup同上写 const...ref(null); 变量名不一样,基本操作
setTimeout(()=>{
  QRCode.value.make();
},1000)


逻辑:点击按钮或者什么触发事件,执行popup.value.open()弹窗打开。

然后界面绘制uqrcode组件,然后一秒之后,QRCode组件实例调用make()绘制二维码

此时:如果value绑定的vue里的响应式的值,那么value改变,二维码会自动重绘。不想重绘就把值定死就行。

第三步,关闭弹窗,在打开弹窗,发现二维码变没了。

重新赋值一边就行。

贴上全部代码!

<template>
	<button @tap="pageFuncs.runOpen">open</button>
	<uni-popup ref="popup" type="center" :isMaskClick="false">
		<div class="model">
			<div class="title">
				<text class="t-font">服务器配置</text>
				<uni-icons class="t-icon" type="closeempty" size="20" @tap="pageFuncs.runClose"></uni-icons>
			</div>
			<div class="under-line"></div>
			<div class="content">
				<div class="con-qr">
					<uqrcode class="uqrcode" ref="QRCode" :options="{ errorCorrectLevel:1, foregroundColor:'darkseagreen' }" :value="data.curl" :size="100" :start="false" canvas-id="qrcode"></uqrcode>
					<div class="qrcode-config">本机配置码</div>
				</div>
				<div></div>
				<div class="config-inputs">
					<div class="one-input">
						<div class="in-mes">MES系统</div>
						<input type="text" v-model="data.url.mes">
					</div>
					<div>
						<div>工具系统</div>
						<input type="text" v-model="data.url.tool">
					</div>
				</div>
			</div>
			<div class="under-line"></div>
			<div class="btns">
				<div class="btn-every" @tap="pageFuncs.runScancode">扫配置码</div>
				<div class="btn-inline"></div>
				<div class="btn-every" :class="{ 'btn-every-fix':data.areUpdate }">手动配置</div>
				<div class="btn-inline"></div>
				<div class="btn-every" :class="{ 'btn-every-fix':!data.areUpdate }">确认修改</div>
			</div>
		</div>
	</uni-popup>
</template>

<script>
import { ref, reactive, onMounted, computed } from "vue";

export default {
	setup() {
		// 变量定义区域
		const QRCode = ref(null);
		const popup = ref(null);
		const data = reactive({
			areUpdate: false,
			curl:'',
			url:{mes:'http://192.168.0.1:8080',tool:'http://192.168.0.1:8080'}
		})
		data.areUpdate = computed(()=>{ 
			let Config = uni.getStorageSync('appConfig');
			if(!Config) Config = JSON.stringify(data.url)
			if(Config == JSON.stringify(data.url)) return false
			else return true
		})
		// 方法区域
		const pageFuncs = {
			// 在界面上点击了扫配置码,进而开启摄像头扫码
			runScancode() {
				uni.scanCode({
					success(res) {
						console.log('扫码结果', res.result)
					}
				})
			},
			// 关闭弹窗
			runClose() {
				popup.value.close();
			},
			// 打开弹窗
			async runOpen() {
				await popup.value.open();
				await new Promise(re=>{ setTimeout(()=>{re()}, 50) })
				QRCode.value.make();
				data.curl = 'null';
				await new Promise(re=>{ setTimeout(()=>{re()}, 50) })
				data.curl = JSON.stringify(data.url);
			},
			// 
		}
		// 挂载区域
		onMounted(()=>{
			pageFuncs.runOpen();
		})
		return { data, QRCode, popup, pageFuncs }
	}
}
</script>

<style lang="scss" scoped>
.model{
	width: 650rpx;
	height: auto;
	min-height: 200rpx;
	padding: 0rpx;
	max-height: 60vh;
	background: #FFFFFF;
	border-radius: 8rpx;
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	justify-content: flex-start;
	align-items: flex-start;
}
.title{
	width: 100%;
	height: 60rpx;
	// background: skyblue;
	font-weight: bold;
	letter-spacing: 2rpx;
	padding: 0rpx 20rpx;
	margin: 6rpx 0rpx;
	display: flex;
	justify-content: space-between;
	align-items: center;
	box-sizing: border-box;
}
.t-font{
	font-size: 28rpx;
}
.t-icon{
	
}
.under-line{
	width: 94%;
	height: 3rpx;
	background: #dddddd;
	margin-left: 3%;
	border-radius: 1rpx;
}
.content{
	width: 100%;
	height: 260rpx;
	display: flex;
	flex-direction: row;
	justify-content: flex-start;
	align-items: center;
	// background: olive;
}
.con-qr{
	display: flex;
	flex-direction: column;
	justify-content: flex-start;
	align-items: center;
}
.uqrcode{
  background: transparent;
	margin: 1rpx 0rpx 0rpx 22rpx;
}
.qrcode-config{
	font-size: 18rpx;
	font-weight: bold;
	letter-spacing: 2rpx;
	background: darkseagreen;
	display: inline-block;
	color: #FFF;
	padding: 2rpx 6rpx;
	border-radius: 4rpx;
	position: relative;
	top: 10rpx;
	left: 4rpx;
}
.config-inputs{
	
}
.one-input{
	width: 400rpx;
	height: 60rpx;
	border: 2rpx solid #ccc;
	border-radius: 16rpx;
	position: relative;
}
.in-mes{
	padding: 0rpx 10rpx;
	font-size: 22rpx;
	background: #FFF;
	position: absolute;
	top: -12rpx;
	left: 20rpx;
}
.btns{
	width: 100%;
	height: 58rpx;
	// background: darkcyan;
	padding: 6rpx 0rpx;
	display: flex;
	flex-direction: row;
	justify-content: flex-start;
	align-items: center;
}
.btn-every{
	width: 33%;
	height: 100%;
	// outline: 1px solid red;
	letter-spacing: 2rpx;
	font-size: 26rpx;
	font-weight: bold;
	display: flex;
	justify-content: center;
	align-items: center;
	color: #3A3F9B ;
}
.btn-every-fix{
	color: #dddddd;
}
.btn-inline{
	width: 3rpx;
	height: 30rpx;
	background: #dddddd;
	border-radius: 1rpx;
}
</style>

复制到uniapp就行!

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Uniapp是一种使用Vue.js开发跨平台应用的前端框架,可以同时为iOS、Android和Web平台提供一致性的用户体验。在搭建一个管理系统时,我们可以使用Uniapp来快速开发出功能强大的应用。 一个Uniapp管理系统的源码通常包含了以下几个主要模块: 1. 登录模块:用户可以通过输入账号和密码进行登录,验证用户身份。登录成功后,会根据用户角色的不同,跳转到相应的系统首页。 2. 系统首页:显示用户的基本信息和系统的各种功能菜单。用户可以通过导航菜单访问不同的功能模块,例如用户管理、订单管理、数据统计等。 3. 用户管理模块:提供对用户进行增删改查的功能,管理员可以对用户的权限进行控制,例如设置用户的角色和权限。 4. 订单管理模块:用来管理系统中的订单数据,包括查看订单、编辑订单、删除订单等操作。管理员可以对订单进行审核和处理,以及生成各种统计报表。 5. 数据统计模块:对系统中的各种数据进行统计和分析,例如销售额统计、用户活跃度统计等。可以展示图表和报表,帮助管理员更好地了解业务状况。 在编写Uniapp管理系统源码时,我们可以使用Vue.js的组件化开发思想,将不同的功能模块拆分成独立的组件,提高代码的复用性和可维护性。同时,可以结合常用的UI框架如Element-UI、Vant等,使用户界面更加美观和易用。 总之,Uniapp管理系统源码可以帮助我们快速搭建功能完善、界面友好的管理系统。无论是对于初学者还是有一定开发经验的开发者来说,Uniapp都是一个值得学习和尝试的技术。 ### 回答2: UniApp是一款基于Vue.js开发的跨平台应用框架,可以用于同时开发iOS、Android和Web应用。管理系统是一种常见的应用场景,可以用来管理企业、学校、医院等机构的人员、资源、数据等。 UniApp管理系统案例源码是指一个已经开发完成的管理系统应用的代码,可以用作学习参考或直接用于实际项目中。这个案例源码通常包含了前端和后端的代码,前端部分使用UniApp框架开发,后端部分可以使用各种技术栈,如Node.js、Java、Python等。 UniApp管理系统案例源码可能包含以下功能和模块: 1. 用户管理:包括用户注册、登录、权限管理、信息修改等功能,用于管理系统的用户。 2. 数据管理:包括对数据库中数据的增删改查操作,用于管理系统中的各类数据。 3. 资源管理:包括对系统资源(如图片、视频、文件等)的上传、存储和管理。 4. 消息推送:包括向用户发送系统通知、消息提醒等功能。 5. 统计分析:对系统中的数据进行统计和分析,生成各类报表和图表。 6. 授权认证:对用户进行身份验证和授权管理,确保系统的安全性。 7. 日志管理:记录用户操作日志和系统日志,方便追踪和排查问题。 8. 界面布局:设计简洁、美观、易用的界面,提升用户体验。 9. 扩展性:考虑系统的可扩展性和可维护性,使其能够适应不同需求和升级迭代。 通过研究和运行UniApp管理系统案例源码,可以学习到UniApp框架的使用方法、前端开发技巧、接口调用、数据处理等方面的知识,也可以了解到管理系统的开发流程和常见功能的实现方式。 ### 回答3: Uniapp(基于Vue.js的跨平台开发框架)是一种非常流行的前端开发技术,其可以帮助开发者快速构建跨平台的应用程序。而Uniapp管理系统案例源码则是指基于Uniapp开发的管理系统的示例代码。 Uniapp管理系统案例源码可以作为开发者学习和参考的资源,通过查看源码,可以获取到实现管理系统所需的各种功能模块、组件、页面和数据处理等操作的具体实现方式。可以说,源码是学习深入理解Uniapp开发框架的一种重要途径。 通过阅读源码,可以帮助我们理解Uniapp开发中一些常见概念和技术,比如使用Vue.js的组件化开发思想、路由管理和数据绑定等。通过对源码的学习,可以更好地掌握Uniapp开发框架的使用方法,提高开发效率和代码质量。 Uniapp管理系统案例源码还可以为我们提供一些实际开发中常见的场景和问题的解决思路,比如权限管理、数据管理和用户交互等。通过阅读源码,我们可以了解到一些最佳实践和常见问题的解决方案,从而快速上手和开发一个高质量的管理系统应用。 综上所述,Uniapp管理系统案例源码是一个非常有价值的学习资源,通过学习源码,可以帮助我们快速入门和深入理解Uniapp开发框架,提高开发效率和代码质量,同时也能帮助我们解决实际开发中遇到的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值