使用vue完成微信公眾號網(wǎng)頁小記(推薦)
前言:
公司最近有一個(gè)H5頁面的功能,比較簡單的一個(gè)調(diào)查表功能,嵌套在我們微信公眾號里面。選用的技術(shù)棧是Vue。同時(shí)用到了微信的登錄和分享接口。ps:本人小白,如果有問題希望大家能指出來,寫文章不止是為了記錄,還是為了發(fā)現(xiàn)自己的問題。謝謝大噶!??!
主要功能以及遇到的問題:
- 左右切換動畫
- 路由帶參數(shù)跳轉(zhuǎn)
- 移動端引入外部字體樣式
- 使用htmtl2canvas截圖功能
- 使用微信接口(前端部分)
- 移動端屏幕適配
- 移動端點(diǎn)擊一個(gè)頁面點(diǎn)擊多次只執(zhí)行一次問題
- ios使用輸入框的時(shí)鍵盤彈起來掩蓋住按鈕問題
- 打包項(xiàng)目遇到靜態(tài)資源加載問題
1.左右切換動畫
--首先我考慮到用vue的移動端動畫庫,看了好久,但是項(xiàng)目非常小,就放棄了這個(gè)選擇自己開始手寫。首先我考慮到的是過渡效果。并且找到了相關(guān)的文章參考。代碼如下:
`<template>
<div id="app">
<transition :name="'fade-'+(direction==='forward'?'last':'next')">
<router-view></router-view>
</transition>
</div>
</template>
<script>
export default {
name: "app",
data: () => {
return {
direction: ""
};
},
watch: {
$route(to, from) {
let toName = to.name;
const toIndex = to.meta.index;
const fromIndex = from.meta.index;
this.direction = toIndex < fromIndex ? "forward" : "";
}
}
}
</script>
<style scoped>
.fade-last-enter-active {
animation: bounce-in 0.6s;
}
.fade-next-enter-active {
animation: bounce-out 0.6s;
}
@keyframes bounce-in {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(0rem);
}
}
@keyframes bounce-out {
0% {
transform: translateX(100%);
}
100% {
transform: translateX(0rem);
}
}
</style>
2.路由帶參數(shù)跳轉(zhuǎn)
這個(gè)就是記錄一下,有三種方法。
1.直接在route-link:to 中帶參數(shù):
<router-link :to="{name:'home', query: {id:1}}">
2.在this.$router.push中帶參數(shù):
使用query帶參數(shù): 類似于get傳參 參數(shù)會拼接到url上面
this.$router.push({name:'home',query: {id:'1'}})
this.$router.push({path:'/home',query: {id:'1'}})
使用params帶參數(shù): 只能用name 類似于post 參數(shù)不會拼接
this.$router.push({name:'home',params: {id:'1'}})
參考鏈接:http://www.dhdzp.com/article/160401.htm
3.移動端引入外部字體樣式
移動端引入外部樣式,我用的是直接把字體庫的字體下載下來,一般后綴為 .ttf/.otf等。在asset文件下創(chuàng)建 fonts文件,將字體文件全部放入。
再新建一個(gè).css文件,相當(dāng)于注冊你下載的字體,可以自定義給字體們命名,不過一般還是按照以前的名字。src是文件所在的路徑。

在需要的地方使用就可以了:font-family:"PingFang"
4.使用htmtl2canvas截圖功能,轉(zhuǎn)換成圖片
先下載html2canvas包: cnpm i html2canvas -S / import html2canvas from 'html2canvas';
查看文檔 : 點(diǎn)擊進(jìn)來直接生成圖片 利用微信長按保存圖片功能來保存
setTimeout(() => { //這里用定時(shí)器是因?yàn)轫撁嬉患虞d出來我就展示的是圖片 為了防止圖片還未生成 給點(diǎn)時(shí)間
html2canvas(document.querySelector("#top"), {
useCORS: true, //是否嘗試使用CORS從服務(wù)器加載圖像
logging: false,//刪除打印的日志
allowTaint: false //這個(gè)和第一個(gè)很像 但是不能同時(shí)使用 同時(shí)使用toDataURL會失效
}).then(canvas => {
let imageSrc = canvas.toDataURL("image/jpg"); // 轉(zhuǎn)行img的路徑
this.imageSrc = imageSrc; //定義一個(gè)動態(tài)的 :src 現(xiàn)在是賦值給src 圖片就會展現(xiàn)
this.$refs.top.style.display = "none"; // 讓頁面上其他元素消失 只顯示圖片
});
}, 1000);
題外話: 當(dāng)時(shí)做這個(gè)的時(shí)候真的有點(diǎn)懵。官網(wǎng)文檔太少了,當(dāng)時(shí)遇到圖片跨域問題,找了好久,可能是我沒有仔細(xì)Jan官網(wǎng)的參數(shù)配置文件。浪費(fèi)了很多時(shí)間,哭哭。
5.使用微信接口(前端部分)
我們用微信SDK接口主要是做的登錄和分享功能,首先是上微信公眾平臺上邊看看,把權(quán)限搞好之后后端配置。前端只需請求得到數(shù)據(jù),在進(jìn)行一些配置就可以。這里主要介紹分享給朋友和分享到朋友圈功能:
this.code = location.href; //首先獲取code
if (this.code.lastIndexOf("code=") != -1) {
(this.code = this.code.substring(
this.code.lastIndexOf("code=") + 5,
this.code.lastIndexOf("&state")
)),
this.$axios
.get("*******8?code=".concat(this.code))
.then(function(t) { //獲取后端傳會來的參數(shù)
localStorage.setItem("unionid", t.data.unionid);
localStorage.setItem("openid", t.data.openid);
localStorage.setItem("nickname", t.data.nickname);
localStorage.setItem("headimgurl", t.data.headimgurl);
});
}
this.url = encodeURIComponent(location.href.split("#/")[0]);//獲取配置的路徑
this.$axios.get(`*********?url=${this.url}`).then(res => {
this.res = res.data;
wx.config({
debug: false, // 開啟調(diào)試模式,
appId: res.data.appId, // 必填,企業(yè)號的唯一標(biāo)識,此處填寫企業(yè)號corpid
timestamp: res.data.timestamp, // 必填,生成簽名的時(shí)間戳
nonceStr: res.data.nonceStr, // 必填,生成簽名的隨機(jī)串
signature: res.data.signature, // 必填,簽名,見附錄1
jsApiList: [
"updateAppMessageShareData",
"updateTimelineShareData",
"showMenuItems",
"hideAllNonBaseMenuItem"
] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
//參考公眾平臺寫的:
wx.ready(function() {
wx.hideAllNonBaseMenuItem();
wx.showMenuItems({
menuList: [
"menuItem:share:appMessage",
"menuItem:share:timeline",
"menuItem:favorite"
] // 要顯示的菜單項(xiàng),所有menu項(xiàng)見附錄3
});
wx.updateTimelineShareData({
title: "******", // 分享標(biāo)題
desc: "*********", // 分享描述
link: "**********", // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對應(yīng)的公眾號JS安全域名一致
imgUrl: "******", // 分享圖標(biāo)
success: function() {
***** 執(zhí)行結(jié)束后執(zhí)行的回調(diào)
}
});
wx.updateAppMessageShareData({
title: "*******", // 分享標(biāo)題
desc: "*********", // 分享描述
link: "*********", // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對應(yīng)的公眾號JS安全域名一致
imgUrl: "********, // 分享圖標(biāo)
success: function() {
*******
}
});
});
}
6.移動端屏幕適配
現(xiàn)在我們移動端屏幕適配,我用的是rem,之前也有看到說有一個(gè)felxable.js的庫,后來去查,說是有更好的作者放棄了,并且給我們提供了鏈接,哈哈哈哈真的太可愛了。準(zhǔn)備抽時(shí)間去仔細(xì)看看,公司下一個(gè)項(xiàng)目又來了,真的加班了好久,為了如期完成項(xiàng)目,完成之后立馬就新開項(xiàng)目,有點(diǎn)心累,這把應(yīng)該是APP了,完全沒有任何經(jīng)驗(yàn),嗷嗷只能硬著頭皮做,還是要恰飯的,可憐的應(yīng)屆狗不敢造次。
下面分享一下rem適配的代碼:
//默認(rèn)調(diào)用一次設(shè)置
setHtmlFontSize();
function setHtmlFontSize() {
// 1. 獲取當(dāng)前屏幕的寬度
var windowWidth = document.documentElement.offsetWidth;
// console.log(windowWidth);
// 2. 定義標(biāo)準(zhǔn)屏幕寬度 假設(shè)375
var standardWidth = 375;
// 3. 定義標(biāo)準(zhǔn)屏幕的根元素字體大小 假設(shè)100px 1rem=100px 10px = 0.1rem 1px 0.01rem
var standardFontSize = 100;
// 4. 計(jì)算當(dāng)前屏幕對應(yīng)的根元素字體大小
var nowFontSize = windowWidth / standardWidth * standardFontSize + 'px';
// console.log(nowFontSize);
// 5. 把當(dāng)前計(jì)算的根元素的字體大小設(shè)置到html上
document.querySelector('html').style.fontSize = nowFontSize;
}
// 6. 添加一個(gè)屏幕寬度變化的事件 屏幕變化就觸發(fā)變化根元素字體大小計(jì)算的js
window.addEventListener('resize', setHtmlFontSize);
把這段代碼引入到main.js里面,然后使用轉(zhuǎn)換器把px轉(zhuǎn)成rem 就可以了。
7.其他問題匯總
點(diǎn)擊事件點(diǎn)擊多次只執(zhí)行一次:
可以使用.once修飾符 還有很多有用的修飾符,大家有時(shí)間可以去看看~~
使用ios輸入框的時(shí)候,鍵盤彈起來回遮擋下面的按鈕等元素的事件:
我們可以給input注冊一個(gè)失去焦點(diǎn)事件,當(dāng)失去焦點(diǎn)的時(shí)候設(shè)置document.body.scroolTop = 0;
打包項(xiàng)目遇到靜態(tài)資源不展示的現(xiàn)象或者是路徑錯誤:
我用的是vue-cil3,他把配置文件都放在了node_modules中,官方文檔上面有介紹,如果需要修改配置,
就新建一個(gè)vue.config.js文件,他會自動的覆蓋之前的文件。主要是修改成: publicPath: "./",
文檔已經(jīng)沒有baseUrl,現(xiàn)在全部使用publicPath,跟著文檔配置就ok了。
結(jié)尾:
我遇到的問題大致就這些,因?yàn)轫?xiàng)目比較小,所以沒有遇到太多問題。過程真的有點(diǎn)心酸,我獨(dú)立解決問題的能力真的很一般,不知道是不是沒有做程序員的潛質(zhì),出現(xiàn)問題就很焦慮,解決了一段時(shí)間以后,還是沒有辦法,就會更加焦慮。在上家公司實(shí)習(xí)的時(shí)候,我們組長指出來這個(gè)問題以后,我真的反省了好久?,F(xiàn)在這家公司還是在實(shí)習(xí),但是前端就一個(gè)人,小姐姐人很好,但是不用vue框架,所以遇到問題還是得單獨(dú)解決。前端小姐姐是很堅(jiān)韌的人,遇到問題,真的是一個(gè)一個(gè)線索的去找,不放棄那種,一開始我們要用flutter,我環(huán)境搭建搞了好久,最后是小姐姐陪我搞好的。真的走到那里都是學(xué)習(xí)的過程。我覺得堅(jiān)毅真的是世界上特別珍貴的品質(zhì),渴望擁有!!!
- Vue微信公眾號網(wǎng)頁分享的示例代碼
- 使用vue編寫h5公眾號跳轉(zhuǎn)小程序的實(shí)現(xiàn)代碼
- Vue開發(fā)Html5微信公眾號的步驟
- vue中使用微信公眾號js-sdk踩坑記錄
- vue項(xiàng)目使用微信公眾號支付總結(jié)及遇到的坑
- Vue.js 實(shí)現(xiàn)微信公眾號菜單編輯器功能(二)
- Vue.js 實(shí)現(xiàn)微信公眾號菜單編輯器功能(一)
- vue 做移動端微信公眾號采坑經(jīng)驗(yàn)記錄
- 詳解Vue微信公眾號開發(fā)踩坑全記錄
- 巧用Vue.js+Vuex制作專門收藏微信公眾號的app
- 如何使用vue開發(fā)公眾號網(wǎng)頁
相關(guān)文章
Vue實(shí)現(xiàn)模糊查詢filter()實(shí)例詳解
因?yàn)榻赵趯W(xué)習(xí)并使用VUE,客戶有一個(gè)要求,要輸入框可模糊查詢并帶有下拉提示的應(yīng)用,數(shù)據(jù)從接口取,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)模糊查詢filter()的相關(guān)資料,需要的朋友可以參考下2023-04-04
Vue2為何能通過this訪問到data與methods的屬性
這篇文章主要介紹了Vue2為何能通過this訪問到data與methods的屬性,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
vuex?mutation?action同級調(diào)用方式
這篇文章主要介紹了vuex?mutation?action同級調(diào)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Nuxt.js SSR與權(quán)限驗(yàn)證的實(shí)現(xiàn)
這篇文章主要介紹了Nuxt.js SSR與權(quán)限驗(yàn)證的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Vue實(shí)現(xiàn)數(shù)值型輸入框并限制長度
這篇文章主要介紹了Vue實(shí)現(xiàn)數(shù)值型輸入框并限制長度,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

