首頁 > 軟體

微信小程式使用uni-app開發小程式及部分功能實現詳解

2022-08-02 14:02:54

一、uni-app

官網:https://uniapp.dcloud.io/

1、簡介

uni-app 是一個使用 Vue.js (opens new window) 開發所有前端應用的框架,開發者編寫一套程式碼,可釋出到iOS、Android、Web(響應式)、以及各種小程式(微信/支付寶/百度/頭條/飛書/QQ/快手/釘釘/淘寶)、快應用等多個平臺;

2、開發工具

uni-app 推薦使用 Hbuilderx 開發工具來開發專案,下載地址:https://www.dcloud.io/hbuilderx.html或者點選這裡下載,下載 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 設定項,來自定義自己的導覽列樣式;

三、設定網路請求

由於小程式不支援 axios ,並且原生的 wx.request() API 功能比較簡單,且不支援攔截器等全域性客製化的功能;所以建議在 uni-app 專案中使用 @escook/request-miniprogram 第三方包發起網路請求;

官網:https://www.npmjs.com/package/@escook/request-miniprogram

1、依照官網提示安裝、匯入、使用

//引入網路請求
import { $http } from '@escook/request-miniprogram';
uni.$http = $http;
//全域性baseUrl
$http.baseURL = "https://www.uinav.com";
//請求攔截器
$http.beforeRequest = function (options) {
  uni.showLoading({
  	title:"資料載入中..."
  })
}
//相應攔截器
$http.afterRequest = function () {
  uni.hideLoading()
}

在 uni-app 中可以使用 uni.xxx 來呼叫 wx.xxx 的 api;

2、實戰

//home
data() {
	return {
		swiperList:[]
	};
},
onLoad() {
	this.getSwiperList();
},
methods:{
	async getSwiperList(){
		let { data:res } = await uni.$http.get('介面地址')
		if(res.meta.status !== 200){
			return uni.showToast({
				title:"資料請求失敗",
				duration:1500,
				icon:"none"
			})
		}
		this.swiperList = res.message;
	}
}

四、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());
}

八、設定 vuex

1、建立檔案

根目錄建立資料夾 store,在資料夾下建立檔案 store.js ;

2、初始化store

//store.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
import cart from '@/store/cart.js'
const store = new Vuex.Store({
	modules:{
		cart
	}
})
export default store;

3、main.js 中引入

//main.js
import store from './store/store.js'
const app = new Vue({
    ...App,
    //掛載到vue範例上
	store
})
app.$mount()

4、新建模組

新建一個 cart 模組的 js 檔案,然後在 store.js 裡面引入;

//cart.js
export default {
	namespaced:true,
	state:{
		cart:[]
	},
	//修改state 只能通過 mutations 
	mutations:{
		addCart:(state,data)=>{
			state.cartList.push(data)
		}
	},
	getter:{}
}

5、使用

import { mapState, mapActions, mapMutations } from 'vuex';

computed:{
	...mapState({
		cartList:state=>state.cart.cartList
	})
},
methods: {
	...mapMutations(['addCart']),
	addCartInfo(){
		this.addCart(2)
		// this.$store.commit('addCart',2)
	},
	//輸入框事件
	input(e){
		clearTimeout(this.timer)
		this.timer = setTimeout(_=>{
			this.kw = e.value;
		},500)
	}
	}

九、登入

在呼叫登入介面之前,我們需要先獲取使用者的基本資訊以及 code,作為引數;

1、獲取使用者基本資訊

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

這裡直接使用 button 元件提供的 open-type 等於 getUserInfo ,並配合 @getuserinfo 事件繫結的方法中獲取到使用者資訊;這裡是固定寫法;參考官網:https://uniapp.dcloud.io/component/button.html

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 回撥函數監聽支付是否成功,然後調取後臺介面將支付狀態同步給資料庫;

十一、釋出

小程式只有在釋出後才能夠被使用者檢索使用,開發期間為了便於偵錯,小程式會攜帶 sourcemap 等型別的檔案,並且程式碼沒有進行壓縮因此體積比較大,所以需要壓縮釋出;

1、釋出為小程式

1、點選 hbuilderx 工具列 發行 => 小程式-微信,這時候會有一個彈出框,需要填寫小程式的名稱和 AppID;

2、點選發行按鈕,hbuilderx 的控制檯就會顯示打包編譯進度;

3、編譯成功之後會自動發開微信開發者工具,這時候點選上傳按鈕;

4、然後會彈出一些提示資訊,點選確定,彈出 版本號、專案備註彈窗,點選上傳就可以了;

5、然後微信小程式後臺稽核上線就可以了;

2、釋出為安卓APP

1、點選 hbuilderx 左下角未登入,進行賬號登入;

2、登入之後點選專案的 manifest.js 檔案,基礎設定裡面,填寫 uni-app 的 AppID 、應用名稱、描述、版本等;

3、App圖示設定,預覽選擇圖片,然後自動生成設定;

4、點選 hbuilderx 工具列 發行 => 原生App-雲打包,然後彈出彈窗,選擇 安卓apk包,ios需要先購買開發者身份才能打包,使用公共的測試證書,勾選打正式包,然後點選打包;

5、然後在 hbuilderx 控制檯顯示打包進度,成功之後會返回一個下載地址的連線,點選連線就可以下載 apk 的安裝包,這個 apk 包就可以在安卓系統上安裝檢視了;

其他

下面是一些比較常見的元件、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開發小程式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com