如何使用vue開發(fā)公眾號(hào)網(wǎng)頁(yè)
項(xiàng)目背景
主要就是一個(gè)h5頁(yè)面,涉及的功能不是很難,主要很久沒有開發(fā)公眾號(hào),對(duì)整個(gè)開發(fā)步驟有些生疏。其中包括對(duì)微信sdk的調(diào)用方式、用戶的微信授權(quán)和sdk的接入等。主要圍繞開發(fā)步驟進(jìn)行梳理。
開始
因?yàn)槭且粋€(gè)h5頁(yè)面,整體而言項(xiàng)目不大,然后在項(xiàng)目技術(shù)選型的時(shí)候確定使用vue框架進(jìn)行開發(fā)。使用vue開發(fā)h5,個(gè)人整體感覺還是效率比較高的。在ui庫(kù)方面選擇的是vant庫(kù),組件整體而言還是不錯(cuò)的,支持自定義主題方便樣式自定義比較適合h5的開發(fā)。
通過(guò)vue-cli創(chuàng)建項(xiàng)目
安裝腳手架工具
npm install -g @vue/cli # OR yarn global add @vue/cli
創(chuàng)建一個(gè)項(xiàng)目
vue create water_project
然后就創(chuàng)建了項(xiàng)目目錄
. ├── README.md ├── babel.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── api │ ├── assets │ ├── components │ ├── global.less │ ├── main.js │ ├── mock │ ├── router │ ├── store │ ├── utils │ └── views └── vue.config.js
關(guān)于移動(dòng)的適配
因?yàn)槭且苿?dòng)端網(wǎng)頁(yè),所以需要做適配。網(wǎng)上有很多適配方案這里就不展開說(shuō)了,主要說(shuō)下本項(xiàng)目使用的方案是amfe-flexible結(jié)合rem來(lái)做的,是淘寶的一種解決方案。關(guān)于設(shè)計(jì)稿的單位px轉(zhuǎn)換為rem使用的是postcss的postcss-pxtorem方案。其實(shí)用webpack的loader來(lái)做也是可以的,具體方案自行百度。
- 安裝amfe-flexible包
npm i amfe-flexible -S
- 安裝postcss-pxtorem插件
npm i postcss-pxtorem -D
- 在main.js中引入amfe-flexible
import "amfe-flexible"
- 在vue.config.js中配置postcss插件
項(xiàng)目中如果沒有vue.config.js文件就手動(dòng)創(chuàng)建一個(gè),這個(gè)是vue cli的配置文件。
css: {
loaderOptions: {
postcss: {
plugins: [
autoprefixer(),
pxtorem({
rootValue: 37.5,
propList: ["*"],
}),
],
},
},
到此樣式適配已經(jīng)完成,至于rootValue為什么是37.5.主要是為了vant的適配,所以設(shè)計(jì)稿以375px為參考。如果沒有使用第三方ui庫(kù)可以設(shè)計(jì)稿以750為參考,此時(shí)rootValue為75。
使用 normalize.css
使用normalize.css來(lái)消除瀏覽器之間的基礎(chǔ)樣式差異
npm i normalize.css -S
在main.js中引入
import "normalize.css"
接入vant庫(kù)
vant是有贊出品的一個(gè)ui庫(kù),站在巨人的肩膀上效率當(dāng)然是要快很多。這種第三方庫(kù)只能作為基礎(chǔ),在有設(shè)計(jì)稿的情況下要對(duì)樣式進(jìn)行定制。簡(jiǎn)單的樣式vant都支持主題定制化還是比較方便的,如果有一些樣式?jīng)]有提供自定義主題,就只能寫樣式進(jìn)行覆蓋了。
- 下載安裝vant
npm i vant -S
- 引入組件有3種方式,官網(wǎng)也有介紹,詳情可以查看官網(wǎng),簡(jiǎn)單說(shuō)下使用方式:
方式一. 自動(dòng)按需引入組件 (推薦)
babel-plugin-import 是一款 babel 插件,它會(huì)在編譯過(guò)程中將 import 的寫法自動(dòng)轉(zhuǎn)換為按需引入的方式。
# 安裝插件
npm i babel-plugin-import -D
// 在.babelrc 中添加配置
// 注意:webpack 1 無(wú)需設(shè)置 libraryDirectory
{
"plugins": [
["import", {
"libraryName": "vant",
"libraryDirectory": "es",
"style": true
}]
]
}
// 對(duì)于使用 babel7 的用戶,可以在 babel.config.js 中配置
module.exports = {
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant']
]
};
// 接著你可以在代碼中直接引入 Vant 組件
// 插件會(huì)自動(dòng)將代碼轉(zhuǎn)化為方式二中的按需引入形式
import { Button } from 'vant';
方式二. 手動(dòng)按需引入組件
在不使用插件的情況下,可以手動(dòng)引入需要的組件。
import Button from 'vant/lib/button'; import 'vant/lib/button/style';
方式三. 導(dǎo)入所有組件
Vant 支持一次性導(dǎo)入所有組件,引入所有組件會(huì)增加代碼包體積,因此不推薦這種做法
import Vue from 'vue'; import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant);
Tips: 配置按需引入后,將不允許直接導(dǎo)入所有組件。
定制vant主題
步驟一 引入樣式源文件
定制主題時(shí),需要引入組件對(duì)應(yīng)的 Less 樣式文件,支持按需引入和手動(dòng)引入兩種方式。
按需引入樣式(推薦)
在 babel.config.js 中配置按需引入樣式源文件,注意 babel6 不支持按需引入樣式,請(qǐng)手動(dòng)引入樣式。
module.exports = {
plugins: [
[
'import',
{
libraryName: 'vant',
libraryDirectory: 'es',
// 指定樣式路徑
style: (name) => `${name}/style/less`,
},
'vant',
],
],
};
手動(dòng)引入樣式
// 引入全部樣式 import 'vant/lib/index.less'; // 引入單個(gè)組件樣式 import 'vant/lib/button/style/less';
步驟二 修改樣式變量
使用 Less 提供的 modifyVars 即可對(duì)變量進(jìn)行修改,下面是參考的 webpack 配置。
// webpack.config.js
module.exports = {
rules: [
{
test: /\.less$/,
use: [
// ...其他 loader 配置
{
loader: 'less-loader',
options: {
// 若 less-loader 版本小于 6.0,請(qǐng)移除 lessOptions 這一級(jí),直接配置選項(xiàng)。
lessOptions: {
modifyVars: {
// 直接覆蓋變量
'text-color': '#111',
'border-color': '#eee',
// 或者可以通過(guò) less 文件覆蓋(文件路徑為絕對(duì)路徑)
hack: `true; @import "your-less-file-path.less";`,
},
},
},
},
],
},
],
};
如果 vue-cli 搭建的項(xiàng)目,可以在 vue.config.js 中進(jìn)行配置。
// vue.config.js
module.exports = {
css: {
loaderOptions: {
less: {
// 若 less-loader 版本小于 6.0,請(qǐng)移除 lessOptions 這一級(jí),直接配置選項(xiàng)。
lessOptions: {
modifyVars: {
// 直接覆蓋變量
'text-color': '#111',
'border-color': '#eee',
// 或者可以通過(guò) less 文件覆蓋(文件路徑為絕對(duì)路徑)
hack: `true; @import "your-less-file-path.less";`,
},
},
},
},
},
};
引入微信jssdk
引入jsssdk有兩種方式,一種是用js鏈接直接引入,寫在index.html中。
<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js "></script>
然后在使用的地方就調(diào)用window.wx.xxx就能使用sdk提供的方法了。
第二種就是使用npm包的方式
- 安裝weixin-js-sdk
npm i weixin-js-sdk -S
- 在main.js中使用
import wx from "weixin-js-sdk" // 掛在vue的原型上方便使用 Vue.prototype.$wx = wx;
這樣引入之后就可以用this.$wx.xx來(lái)使用相應(yīng)的方法了比如:
this.$wx.config({
debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
appId: res.data.appId, // 必填,公眾號(hào)的唯一標(biāo)識(shí)
timestamp: String(res.data.timestamp), // 必填,生成簽名的時(shí)間戳
nonceStr: String(res.data.nonceStr), // 必填,生成簽名的隨機(jī)串
signature: res.data.signature, // 必填,簽名,見附錄1
jsApiList: [
"getNetworkType",
"getLocation",
], // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
注冊(cè)驗(yàn)證sdk才可以使用api
其實(shí)注冊(cè)的重要邏輯都在后端,提供一個(gè)獲取配置信息的接口,前端直接調(diào)用sdk的config方法進(jìn)行注冊(cè)就好了。這里把sdk的注冊(cè)邏輯寫在app.vue文件中
- 封裝一個(gè)注冊(cè)sdk的方法
async getWxJssdkConf() {
const res = await this.$api.getSdkConfig({
url: window.location.href.split("#")[0],
});
if (res.success) {
this.$wx.config({
debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。
appId: res.data.appId, // 必填,公眾號(hào)的唯一標(biāo)識(shí)
timestamp: String(res.data.timestamp), // 必填,生成簽名的時(shí)間戳
nonceStr: String(res.data.nonceStr), // 必填,生成簽名的隨機(jī)串
signature: res.data.signature, // 必填,簽名,見附錄1
jsApiList: [
"getNetworkType",
"getLocation",
], // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
this.$wx.ready(() => {
this.$wx.checkJsApi({
jsApiList: ["getNetworkType", "getLocation"], // 需要檢測(cè)的JS接口列表,所有JS接口列表見附錄2,
success: function (res) {
console.log("checkJsApi", res);
},
});
});
this.$wx.error((res) => {
console.log("wx.error", res);
});
}
},
created() {
this.getWxJssdkConf();
},
其中this.$api.getSdkConfig為調(diào)用后臺(tái)的接口,這里是給api也掛載到了vue的原型上,方便使用不用每個(gè)頁(yè)面都去引入api
Vue.prototype.$api = api
在app.vue中注冊(cè)成功后,就可以使用sdk的api了。
微信的授權(quán)
如果要獲取用戶的信息,就必須讓用戶進(jìn)行授權(quán)。在授權(quán)的時(shí)候使用的是微信提供的接口,詳細(xì)請(qǐng)看這里,如果是只獲取用戶的openid只用靜默授權(quán)就可以了,不用用戶主動(dòng)授權(quán)。具體請(qǐng)看文檔,這里只需要openid就使用靜默授權(quán)如下:
- 在需要授權(quán)的主入口使用,比如這里是主頁(yè)Home,要先調(diào)用微信的接口獲取code,在用code去后端換取openid
/**
* @description: 獲取授權(quán)code
* @param {*}
* @return {*}
*/
getCode() {
// 從 window.location.href 中截取 code 并且賦值
// window.location.href.split('#')[0]
if (window.location.href.indexOf("state") !== -1) {
this.code = qs.parse(
window.location.href.split("#")[0].split("?")[1]
).code;
}
if (this.code) {
// 存在 code 直接調(diào)用接口
this.handGetUserInfo(this.code);
} else {
this.handLogin();
}
},
/**
* @description: 獲取用戶授權(quán)登陸
* @param {*}
* @return {*}
*/
handLogin() {
// 重定向地址重定到當(dāng)前頁(yè)面,在路徑獲取 code
const hrefUrl = window.location.href;
if (this.code === "") {
window.location.replace(`
https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXXX
&redirect_uri=${encodeURIComponent(hrefUrl)}
&response_type=code
&scope=snsapi_base
&state=h5#wechat_redirect`);
}
},
/**
* @description: 獲取用戶信息
* @param {*} code
* @return {*}
*/
handGetUserInfo(code) {
// 調(diào)用后臺(tái)接口
},
這里就是授權(quán)的主要邏輯,沒啥意外就基本走通了。
斷網(wǎng)進(jìn)行提示
如果用戶的網(wǎng)絡(luò)斷了,就跳轉(zhuǎn)到斷網(wǎng)提示頁(yè)。主要使用的是html提供的方法進(jìn)行判斷,判斷邏輯寫在app.vue文件中,因?yàn)槊總€(gè)頁(yè)面都會(huì)提示,就直接在主入口進(jìn)行處理。
mounted() {
window.addEventListener("online", this.updateOnlineStatus);
window.addEventListener("offline", this.updateOnlineStatus);
},
methods: {
updateOnlineStatus(e) {
const { type } = e;
console.log("type==============", type);
this.onLine = type === "online";
},
}
beforeDestroy() {
window.removeEventListener("online", this.updateOnlineStatus);
window.removeEventListener("offline", this.updateOnlineStatus);
},
主要就是這個(gè)方法來(lái)檢查用戶網(wǎng)絡(luò)連接情況
判斷是不是微信打開的網(wǎng)頁(yè)
這里主要使用的是vue-router的導(dǎo)航守衛(wèi)來(lái)做的,在跳轉(zhuǎn)之前對(duì)瀏覽器進(jìn)行判斷,如果不是微信內(nèi)置瀏覽器就直接跳轉(zhuǎn)到異常提示頁(yè)
router.beforeEach((to, from, next) => {
const ua = navigator.userAgent.toLowerCase();
if (
to.path !== "/notwx" &&
!(ua.match(/MicroMessenger/i) == "micromessenger")
) {
next("/notwx");
} else {
next();
}
});
有時(shí)跳轉(zhuǎn)頁(yè)面,頁(yè)面的滾動(dòng)高度會(huì)保留在上個(gè)頁(yè)面的滾動(dòng)高度,這里也是在導(dǎo)航守衛(wèi)中解決的,主動(dòng)給滾動(dòng)到頂部
router.afterEach(() => {
window.scrollTo(0, 0);
});
小結(jié)
到此整個(gè)開發(fā)流程簡(jiǎn)單記錄完畢,也是對(duì)自己開發(fā)的一個(gè)梳理,也方便以后查閱。希望對(duì)看到文章的你有所幫助,個(gè)人見解,如有問題歡迎指正,覺得有幫助,歡迎點(diǎn)個(gè)贊,謝謝。
以上就是如何使用vue開發(fā)公眾號(hào)網(wǎng)頁(yè)的詳細(xì)內(nèi)容,更多關(guān)于vue開發(fā)公眾號(hào)網(wǎng)頁(yè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue3中如何使用v-model高級(jí)用法參數(shù)綁定傳值
本文給大家介紹Vue3中使用v-model高級(jí)用法參數(shù)綁定傳值的相關(guān)知識(shí),包括單個(gè)輸入框傳值和多個(gè)輸入框傳值,一個(gè)組件接受多個(gè)v-model值,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10
VueQuillEditor富文本上傳圖片(非base64)
這篇文章主要介紹了VueQuillEditor富文本上傳圖片(非base64),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
一文帶你簡(jiǎn)單理解Vue的data為何只能是函數(shù)
如果data是一個(gè)函數(shù)的話,這樣每復(fù)用一次組件,就會(huì)返回一份新的data,下面這篇文章主要給大家介紹了關(guān)于簡(jiǎn)單理解Vue的data為啥只能是函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-10-10
vue粘貼復(fù)制功能的實(shí)現(xiàn)過(guò)程記錄
最近在項(xiàng)目中遇到點(diǎn)擊按鈕復(fù)制鏈接功能,所以這篇文章主要給大家介紹了關(guān)于vue粘貼復(fù)制功能的實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Vue Element校驗(yàn)validate的實(shí)例
這篇文章主要介紹了Vue Element校驗(yàn)validate的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
vue-cli3+typescript初體驗(yàn)小結(jié)
這篇文章主要介紹了vue-cli3+typescript初體驗(yàn)小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
vue+elementUI實(shí)現(xiàn)內(nèi)嵌table的方法示例
本文主要介紹了vue+elementUI實(shí)現(xiàn)內(nèi)嵌table的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)無(wú)限消息無(wú)縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

