微信小程序使用uni-app开发小程序及部分功能实现详解心得_微信小程序创建uni-app-程序员宅基地

技术标签: 微信小程序  小程序  uni-app  

目录

一、uni-app

1、简介

2、开发工具

3、新建 uni-app项目

4、把项目运行到微信开发者工具

二、实现tabBar效果

1、创建tabBar页面

2、配置tabBar

1、创建分包目录

2、在 pages.json 文件中配置

3、创建分包页面

四、公用方法封装

五、搜索功能

1、搜索组件

2、搜索建议实现

3、本地存储

4、过滤器

六、上拉加载、下拉刷新

1、上拉加载

2、下拉刷新

七、登录

1、获取用户基本信息

2、获取用户登录凭证 code

八、支付

1、请求头添加 token

2、微信支付流程

其他

总结


一、uni-app

官网:uni-app官网

1、简介

uni-app 是一个使用 Vue.js (opens new window) 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台;

2、开发工具

uni-app 推荐使用 Hbuilderx 开发工具来开发项目,下载地址:HBuilderX-高效极客技巧或者点击这里下载,下载 App开发版;

1、安装 sass 插件

点击 工具 => 插件安装 => 安装新插件 => 前往插件市场安装 ,在这里你可以搜索自己需要的插件,我们以 sass 为例;找到需要的插件之后点击下载 => 使用Hbuilderx 导入插件,这里需要登录 sass 的网站,如果登录成功则会打开 Hbuilderx 编译器,然后点击确定就可以安装了;

3、新建 uni-app项目

Hbuilderx 点击 文件=>新增=>项目 ,本文新建一个小程序项目:uni-app => 填写项目名称、选择项目存放路径 => 模板 uni-ui 项目=>创建,然后就可以生成一个小程序项目;

components:组件文件
pages:页面文件
static:静态文件
uni_modules:依赖包
App.vue:应用配置,配置小程序全局样式、生命周期
main.js:Vue 初始化入口文件
manifest.json:配置应用名称 appid、logo、版本等打包信息
pages.json:配置页面路径、页面样式、tabBar等信息
uni,scss:全局样式

4、把项目运行到微信开发者工具

1、配置 appid

在 manifest.json 文件 => 微信小程序配置 填写微信小程序 appID;

2、在 Hbuilderx 配置微信开发者工具的安装路径:这样可以在 Hbuilderx 里面运行的时候自动打开微信开发者工具查看项目

工具 => 设置 => 运行配置 => 小程序运行配置 配置微信开发者工具的安装路径,如:C:\Program Files (x86)\Tencent\微信web开发者工具

3、在微信开发者工具开启服务端口

设置 => 安全设置 => 安全 开启服务端口

4、运行

Hbuilderx 点击 运行=>运行到小程序模拟器 点击第一个就可以在 Hbuilderx 自动编译,成功之后会自动打开微信开发者工具;

注意:这个时候我们想修改项目里面的内容,需要在 Hbuilderx 里面修改,例如修改配置:manifest.json 文件 => 源码视图

二、实现tabBar效果

1、创建tabBar页面

在 pages 下面创建,右键新建页面,这里创建的是 tanBar 对应的几个页面;记住这里要勾选"创建同名目录、在pages.json 中注册"两个选项,默认是选中的;(home、cate、cart、my)

2、配置tabBar

在 pages.json 文件中在 pages 平级新增 tabBar 的配置:

"tabBar":{
	"selectedColor":"#C00000",
	"list":[
		{
			"pagePath":"pages/home/home",
			"text":"首页",
			"iconPath":"static/c1.png",
			"selectedIconPath":"static/c2.png"
		},
		{
			"pagePath":"pages/cate/cate",
			"text":"分类",
			"iconPath":"static/c3.png",
			"selectedIconPath":"static/c4.png"
		},
		{
			"pagePath":"pages/cart/cart",
			"text":"购物车",
			"iconPath":"static/c5.png",
			"selectedIconPath":"static/c6.png"
		},
		{
			"pagePath":"pages/my/my",
			"text":"我的",
			"iconPath":"static/c7.png",
			"selectedIconPath":"static/c8.png"
		}
	]
}

注意:home 也必须在 pages 数组的第一位;还可以在 pages.json 文件修改 globalStyle 配置项,来自定义自己的导航条样式;

三、uni-app 里面小程序分包

1、创建分包目录

在根目录下创建分包目录,subpackage;

2、在 pages.json 文件中配置

在 pages 节点同级,声明 subpackages 节点用来配置分包结构;

"subPackages":[
	{
		"root":"subpackage",
		"pages":[]
	}
]

3、创建分包页面

在 sunpackage 目录上右键点击新建文件,填写页面名称、选择分包 sunpackage ,然后创建就可以了,编译器会自动在代码中将配置信息填充到 sunpackage 分包下面;

"subPackages":[
		{
			"root":"subpackage",
			"pages":[{
                    "path" : "goods_detail/goods_detail",
                    "style" :{
	                    "navigationBarTitleText": "",
	                    "enablePullDownRefresh": false
	                }
                }
            ]
		}
	]

注意:这里提一下,页面跳转传参跟小程序原生跳转传参是一样的:1、navigator 配合 url 跳转、路径拼接传参;2、点击事件通过 uni.redirectTo ;

四、公用方法封装

这里以 错误提示信息为例,在 main.js 中;

uni.$showMsg = function(titie="请求失败",duration=1000){
	uni.showToast({
		title,
		duration,
		icon:"none"
	})
}

五、搜索功能

1、搜索组件

1、自定义搜索组件:在 components 文件夹右键,选择 新建组件 ,在这里可以编写组件的内容;

2、小程序自定义组件自定义事件:由于小程序提供的组件已经帮助我们封装了 click 事件,所以我们可以直接使用,但是我们自定义的组件没有封装所以不能直接在自定义的组件上使用 click 事件;

我们可以在父组件绑定一个自定义事件,然后子组件绑定 click 事件,在触发 click 的时候通过 $emit 来触发父组件绑定的自定义事件,这样就可以完成自定义组件的事件传递;

3、吸顶:主要是利用 position:sticky ,把组件定位到页面的顶部;

最后使用组件:直接在页面使用就可以了,组件名是自定义组件的文件名称;

//自定义组件
<template>
	<view class="my-search-container" :style="{'background-color':bgColor}">
		<view class="my-search-box" :style="{'border-radius':radius}">
			<uni-icons type="search" size="18"></uni-icons>
			<text class="placeholder">搜索</text>
		</view>
	</view>
</template>
<script>
	export default {
		name:"my-search",
		props:{
			bgColor:{
				type:String,
				default:"#c00000"
			},
			radius:{
				type:String,
				default:"18px"
			}
		},
		methods:{
			//通过 $emit 来触发父组件上绑定的自定义事件
			searchEvent(){
				this.$emit('myclick')
			}
		}
	}
</script>
<style lang="scss">
.my-search-container{
	height: 50px;
	// background-color: #c00000;
	display:flex;
	align-items: center;
	padding: 0 10px;
	.my-search-box{
		height: 36px;
		background-color: #FFF;
		// border-radius: 18px;
		width: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
		.placeholder{
			font-size: 15px;
			margin-left: 5px;
		}
	}
}
</style>
//父组件
<template>
	<view>
		<view class="suckTop">
			<my-search @myclick="goSearch" :radius="'0px'" :bgColor="'pink'"></my-search>
		</view>
	</view>
</template>
<script>
	export default {
		methods:{
			goSearch(){
				uni.navigateTo({
					url:"/subpackage/search/search"
				})
			}
		}
	}
</script>
<style lang="scss">
.suckTop{
	position: sticky;
	top: 0;
	z-index: 999;
}
</style>

2、搜索建议实现

<template>
	<view>
		<view class="suckTop">
			<uni-search-bar @input="input" :radius="18" :focus="true" cancelButton="none"></uni-search-bar>
		</view>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				timer:null,
				kw:''
			}
		},
		methods: {
			//输入框事件
			input(e){
				clearTimeout(this.timer)
				this.timer = setTimeout(_=>{
					this.kw = e.value;
				},500)
			},
		}
	}
</script>
<style lang="scss">
.suckTop{
	position: sticky;
	top: 0;
	z-index: 999;
	.uni-searchbar {
		background-color: #c00000
	}
}
</style>

使用 uni-app 提供的组件,添加 focus 让界面自动锁定输入框, input 事件添加节流,然后就可以在节流方法里面调用接口来获取并渲染搜索出来的结果;

3、本地存储

//存
uni.setStorageSync('kw',JSON.stringify(this.kw));

//onLoad 声明周期中 取
let list = JSON.parse(uni.getStorageSync('kw') || '');

//删除
uni.setStorageSync('kw',[]);

4、过滤器

跟 data 平级声明 filters

filters:{
	toFixed(num){
		return Number(num).toFixed(2);
	}
}

使用的时候直接在界面上

<view>{
  {num | toFixed}}</view>

六、上拉加载、下拉刷新

1、上拉加载

在 pages.json 中找到当前页面在 pages 数组中的路径,在 style 中新增 onReachBottomDistance 设置为 150;

在页面中 methods 平级声明一个 onReachBottom 方法来监听页面上拉事件;

data() {
	return {
		isLoading:false
	};
},
methods:{
	getList(){
		//打开节流阀
		this.isLoading = true;
		//获取数据
		let res = .....
		//关闭节流阀
		this.isLoading = false;
	}
},
//监听上拉事件
onReachBottom() {
	//没有更多数据
	if(this.pagenum*this.pagesize >= this.total) return uni.$showMsg('没有更多数据了')
	//限流 防止频繁请求
	if(this.isLoading) return;
	//页面自增加一
	this.pagenum++;
	//获取列表数据的方法
	this.getList();
}

2、下拉刷新

在 pages.json 中找到当前页面在 pages 数组中的路径,在 style 中新增 enablePullDownRefresh设置为 true;

在页面中 methods 平级声明一个 onPullDownRefresh方法来监听页面上拉事件;

methods:{
	getList(cb){
		//打开节流阀
		this.isLoading = true;
		//调用回调函数
		cb && cb();
		//获取数据
		let res = .....
		//关闭节流阀
		this.isLoading = false;
	}
},
onPullDownRefresh() {
	this.total = 0;
	this.pagenum = 1;
	this.list = [];
	this.isLoading = false;
	//传入回调函数,停止下拉刷新效果
	this.getList(()=> uni.stopPullDownRefresh());
}

七、登录

在调用登录接口之前,我们需要先获取用户的基本信息以及 code,作为参数;

1、获取用户基本信息

<button open-type="getUserInfo" @getuserinfo="getInfo">一键登录</button>
methods:{
	//自定义方法
	getInfo(e){
		console.log(e)
	}
}

这里直接使用 button 组件提供的 open-type 等于 getUserInfo ,并配合 @getuserinfo 事件绑定的方法中获取到用户信息;这里是固定写法;参考官网:button | uni-app官网

2、获取用户登录凭证 code

这个可以直接调用 uni.login() API ;

async getCode(){
	let [err,res] = await uni.login().catch(err=>err)
	console.log(res)
}

八、支付

1、请求头添加 token

只有登录成功之后才能调用支付相关的接口,我们需要将登录后获取的 token 设置在有权限的接口请求字段里;一般在请求拦截里面为接口统一配置 header;

$http.beforeRequest = function (options) {
  uni.showLoading({
  	title:"数据加载中..."
  })
  options.header = {
	  Authorization: token
  }
}

2、微信支付流程

1、创建订单

将订单信息提交给后台服务器,创建订单,获取订单号;

2、订单预支付

将订单号发送给后台服务器,获取到支付相关的参数;

3、调用微信支付

调用 uni.requestPayment(OBJECT) API,发起支付请求;通过 fail、 success 回调函数监听支付是否成功,然后调取后台接口将支付状态同步给数据库;

其他

下面是一些比较常见的组件、API、问题:

1、API:uni.previewImage(OBJECT)

预览图片,可以将轮播图方法查看;

2、API:uni.chooseAddress(OBJECT)

获取用户收货地址。调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址,需要用户授权 scope.address;

3、组件:rich-text

渲染富文本;

4、组件:uni-goods-nav

商品加入购物车,立即购买组件;

5、问题:.webp 后缀图片在 ios 不展示问题

ios 上图片 .webp 格式支持不怎么友好,可以只要正则表达式将图片后缀名替换成 .jpg ;

6、问题:商品价格闪烁问题

数据在请求到页面之前, data 里面的数据初始为 {} ,因此初次渲染会导致一些数据闪烁,可以先利用 v-if 判断这个数据是否存在,来控制整体界面的显示隐藏;

7、问题:收获地址授权失败问题

判断是否是授权失败问题,是则直接调用 uni.openSetting(OBJECT) API 开启地址权限;注意兼容 ios 和 安卓;

总结

到此这篇关于微信小程序使用uni-app开发小程序及部分功能实现的文章就介绍到这了,更多相关微信小程序用uni-app开发小程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Fang2001131919/article/details/131296090

智能推荐

蓝桥杯实战应用【算法知识篇】-快速排序算法(附Java、Python和C++代码)_蓝桥杯快速排序蓝桥杯java-程序员宅基地

文章浏览阅读189次。快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应用。_蓝桥杯快速排序蓝桥杯java

SQLAlchemy关联表一对多关系的详解_sqlalchemy 一对多-程序员宅基地

文章浏览阅读695次。SQLAlchemy关联表一对多关系的详解_sqlalchemy 一对多

“反向传播算法”过程及公式推导(超直观好懂的Backpropagation)_反向传播算法(过程及公式推导)-程序员宅基地

文章浏览阅读10w+次,点赞1.7k次,收藏4.9k次。自己学习机器学习,深度学习也有好长一段时间了,一直以来都想写点有价值的技术博客,以达到技术分享及记录自己成长的目的,奈何之前一直拖着,近来算是醒悟,打算以后不定时写一写博客,也算是作为自己不断学习,不断进步的记录。既然是写博客,希望自己的博客以后要做到“准确、生动、简洁、易懂”的水平,做到对自己、对读者负责,希望大家多交流,共同进步!言归正传,想起当时自己刚入门深度学习的时候,当时对神经网络的“..._反向传播算法(过程及公式推导)

Unity Shader - 水体交互_unity 水体-程序员宅基地

文章浏览阅读6.4k次,点赞10次,收藏87次。水体交互效果在游戏中是一个很常见的需求,这里简单实现一个可交互的水体。本篇文章主要是介绍水体交互的实现思路,水体的渲染这里就不再详细介绍,网上很多关于水体的渲染方法很多,可以自己百度、Google了解一下,这里不会过多提及。效果图。先放一张最终的GIF效果图!实现思路原理其实非常简单,就是通过粒子系统不断发射带有波纹法线贴图的面片,然后把这些法线渲染一张RenderTexture传输到Water Shader中,然后和Water Normal 叠加即可形成水波效果。实现步骤可以简单分为:简_unity 水体

SQL Server性能调教的小实验(2)-程序员宅基地

文章浏览阅读585次。上次说到当数据量提高之后,查询效率急剧下降,经过分析后,得到这个查询语句的效率是最低的。SELECT IDFROM Specimen_admin_specimen_TWHERE (Species_ID IN (SELECT DISTINCT (Species_ID) FROM View_All_Tree WHERE...

最少砝码—省赛java_两边砝码选择规律1 3 9 27-程序员宅基地

文章浏览阅读267次。十二届蓝桥杯省赛真题G题—砝码称重【问题描述】你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。那么这套砝码最少需要包含多少个砝码?注意砝码可以放在天平两边。【输入格式】输入包含一个正整数 N。【输出格式】输出一个整数代表答案。【样例输入】7【样例输出】3【样例说明】3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。1 = 1;2 = 6 − 4 (天平一边放 6,另一边放 4);3 = 4 − 1;4 = 4;5_两边砝码选择规律1 3 9 27

随便推点

用linux脚本插入10w级的数据数据库为mysql-程序员宅基地

文章浏览阅读177次。插入大量数据到MySQL数据库可以使用以下步骤:准备数据:你需要一个数据文件,包含需要插入的所有数据。每行都是一条记录,字段之间使用适当的分隔符分开。创建数据库:如果没有相应的数据库,请先创建一个。创建表:创建一个表来存储数据。导入数据:使用MySQL的"LOAD DATA INFILE"命令导入数据。该命令可以从文件中快速加载大量数据到MySQL表中。以下是使用bash脚本..._linux sql插入大量数据

腾讯云域名免费SSL证书怎么获取?HTTPS免费配置_腾讯 域名证书-程序员宅基地

文章浏览阅读316次,点赞5次,收藏4次。总之,通过腾讯云免费SSL证书申请教程,您可以轻松为自己的域名获取免费SSL证书,并实现HTTPS的安全配置。同时,结合腾讯云的服务器购买优惠政策,您还可以以更经济的成本搭建起安全、高效的网站环境。腾讯云将为您的域名生成免费的SSL证书,并通过您提供的邮箱发送相关通知。这样,您就成功获取了免费的SSL证书,为您的网站加上了一把安全锁。那么,如何在腾讯云上为自己的域名免费获取SSL证书,并实现HTTPS的安全配置呢?此外,如果您在配置SSL证书的过程中需要购买服务器,不妨关注腾讯云的促销活动。_腾讯 域名证书

R语言ggplot2包绘制双坐标轴图(双Y轴图)实战:两个Y轴分别使用不同的刻度范围_ggplot双侧轴,两侧轴起始高度不一样,数值刻度也不一样-程序员宅基地

文章浏览阅读146次。R语言ggplot2包绘制双坐标轴图(双Y轴图)实战:两个Y轴分别使用不同的刻度范围_ggplot双侧轴,两侧轴起始高度不一样,数值刻度也不一样

优化图像处理中均值和方差计算_图像方差-程序员宅基地

文章浏览阅读7.2k次。图像处理中均值和方差计算优化一、均值和方差的普通优化图像处理中,有时候会需要计算图像某区域的均值和方差。在我之前的博客中《图像比较之模板匹配》,对计算方差有做简化计算的介绍。详细介绍可以参考我之前的博文。在此,我简单的介绍下计算方差的简化方法:按照上述方式计算均值和方差,很多应用场景下都比较合适。但是有两个缺陷:如果均值远大于标准差,意味着方差计算中相减的两个数非常接近,将引入过度舍入的问题; 对于新增加一个统计变量重新计算其均值和方差的时候,需要对所有统计变量再重新计算,做了大量的重_图像方差

openwrt单线多拨_家庭宽带单线多拨VS多线多拨,有啥区别,100M变1000M-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏23次。经常折腾网络的人可能都知道多拨,今天就主要来说说多拨这个话题,以及结合自己的一些尝试,给大家做一些分享。喜欢的朋友们、小伙伴们可以关注我,不定时更新家庭网络相关技术,有疑问或者问题都可以评论留言,看到就回复;多拨也就是我们的宽带账号多次PPPOE拨号,拿到多个IP地址。相当于一条宽带变成了很多条。作用:1、可以实现多外网IP,上行和下行网速叠加,使我们的上网更加快速。100M变1000M网。2、使..._单线多拨

Unity常见框架探索-ET框架探索-程序员宅基地

文章浏览阅读6.7k次,点赞5次,收藏20次。本文简单介绍一下ET框架入口,UI系统和网络模块,可以对基础使用有一个简单认识_et框架

推荐文章

热门文章

相关标签