成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

美團(tuán)小程序框架mpvue蹲坑指南

AprilJ / 771人閱讀

摘要:這個(gè)是我們約定的額外的配置這個(gè)字段下的數(shù)據(jù)會被填充到頂部欄的統(tǒng)一配置美團(tuán)汽車票同時(shí),這個(gè)時(shí)候,我們會根據(jù)的頁面數(shù)據(jù),自動(dòng)填充到中的字段。

美團(tuán)小程序框架mpvue(花名:沒朋友)蹲坑指南
第一次接觸小程序大概是17年初,當(dāng)時(shí)小程序剛剛內(nèi)側(cè),當(dāng)時(shí)就被各種限制折騰的死去活來的,單向綁定,
沒有promise,請求數(shù)限制,包大小限制,各種反人類,...反正我是感受到了滿滿的惡意.
最近接到一個(gè)工程類的小程序項(xiàng)目,做技術(shù)選型的時(shí)候,又把以前的東西撿起來看了看,重新熟悉了一下,
感覺小程序還是有在努力的,支持大部分es6語法了,還出了一個(gè)類Vue的mvvm框架wepy,還支持redux狀態(tài)管理,
就大致建了個(gè)demo,跑了起來,趕緊雖然沒有vue那么酸爽,但是還是挺ok的,至少比原生的小程序語法親民很多.

然后就開始用wepy搭項(xiàng)目,寫靜態(tài)頁面(由于公司的開發(fā)模式是先寫靜態(tài)頁面,
等待后端的同學(xué)接口出來了再綁定數(shù)據(jù)),雖然wepy用起來比原生的順手,
但是還是有很多坑的,這里就不列舉了.....

就在我們靜態(tài)頁面快寫完的時(shí)候,某天晚上論壇的時(shí)候看到一條消息, 美團(tuán)出了個(gè)小程序框架mpVue
(不知道為什么,每次看到這個(gè)名字,我只想到3個(gè)字,沒朋友,哈哈),
大致看了一下官方的介紹,主要有一下亮點(diǎn):

跟vue一樣的開發(fā)體驗(yàn),包括vuex

H5代碼轉(zhuǎn)換編譯成小程序目標(biāo)代碼的能力

也就是說,不但可以用我們熟悉的vue語法開發(fā),還有可能直接把你的h5頁面編譯成小程序.
該項(xiàng)目到目前位置,開源不到20天,已經(jīng)收到將近7000個(gè)star,可見天下苦秦已久。

建了個(gè)demo,跑了一下,感覺簡直就是開發(fā)界的良心之作啊.順便把之前寫的wepy的靜態(tài)頁面代碼復(fù)制過來看了一下,
發(fā)現(xiàn)只要改動(dòng)一點(diǎn)點(diǎn),就可以順利從wepy切換到mpvue上來(整個(gè)項(xiàng)目的切換時(shí)間在半天左右).
說做就做,當(dāng)天就切到mpvue.一直到現(xiàn)在項(xiàng)目接近尾聲了,整個(gè)開發(fā)過程,真是令人愉悅.

Bug....我今天好像不是來給mpvue做廣告的,我是來找茬的..

下面就盤點(diǎn)一下我最近用mpvue開發(fā),遇到的一些需要需要注意的細(xì)節(jié).(或者說跟vue不同的地方)

一, 這個(gè)個(gè)人感覺是最大的坑,除了缺少文件會報(bào)錯(cuò)外,其他的代碼語法錯(cuò)誤等,
控制臺大部分時(shí)間都是安靜的(偶爾也會報(bào)一個(gè)xxx is undefined)
比較經(jīng)常碰到的是這樣 this.xxx =5 有些情況下會報(bào)錯(cuò),而有些情況下則沒有任何反應(yīng),
具體什么情況下會,什么情況下不會,我現(xiàn)在還沒摸出規(guī)律來..

有一次我把

this.dataObject.map(() => { ...這里省略... })

結(jié)果map前面的 . 不小心給露掉了,實(shí)際代碼變成

this.dataObjectmap(() => { ...這里省略... })

結(jié)果找了半天沒找到問題的原因

二, 這個(gè)也是比較難受的地方,就是模板的數(shù)據(jù)綁定里面,沒辦法在模板語法里面調(diào)用methods方法
(或者說沒辦法調(diào)用computed以外的函數(shù)),有人也許會說,那可以用computed屬性,那如果我想給函數(shù)傳參怎么辦?
看下面代碼:




這個(gè)時(shí)候 {{formatCost(item)}}里面的內(nèi)容,會渲染成空字符串,理由就是因?yàn)椴恢С趾瘮?shù),而且這中情況,
也無法使用computed屬性,除非你想為每個(gè)數(shù)組元素寫一個(gè)computed

這種情況,我的解決方案是在在獲取到數(shù)據(jù)的時(shí)候,就先把數(shù)據(jù)改了.如上面的例子,我們可以在 getData方法里面這樣寫

let arr = [3.255,4.1,5,15]
// 遍歷數(shù)組里面的元素,然后格式化一下,添加到 costList里去
arr.map(item => {
    this.costList.push = this.formatCost(item)
})


三, 所有頁面里面的created生命周期函數(shù) 都會在小程序加載的時(shí)候,
一次性執(zhí)行,而不是每進(jìn)入一個(gè)頁面執(zhí)行一次,如,我有3個(gè)頁面

pageA

...省略一些代碼...
creatted(){
    console.log("pageA 的 created函數(shù)執(zhí)行")
}

pageB

...省略一些代碼...
creatted(){
    console.log("pageB 的 created函數(shù)執(zhí)行")
}

pageC

...省略一些代碼...
creatted(){
    console.log("pageC 的 created函數(shù)執(zhí)行")
}

然后,啟動(dòng)小程序,不進(jìn)入這3個(gè)頁面,假設(shè)我現(xiàn)在有一個(gè)index頁面,我們打開這個(gè)頁面,會有一下輸出

pageA 的 created函數(shù)執(zhí)行
pageB 的 created函數(shù)執(zhí)行
pageC 的 created函數(shù)執(zhí)行

這個(gè)其實(shí)很好解決,用mounted或者onLoad或者onReady代替,說到這幾個(gè)函數(shù),那就順便提一下,
這里的created和mounted是vue(mpvue)的生命周期,而onLoad、onReady是小程序的生命周期,mpvue官方給的說明是:

除了 Vue 本身的生命周期外,mpvue 還兼容了小程序生命周期,這部分生命周期鉤子的來源于微信小程序的
Page, 除特殊情況外,不建議使用小程序的生命周期鉤子。

但是官方給的生命周期圖示里面,也表明了,小程序的onLoad、onReady比created、mounted執(zhí)行的早,
也就是說如果我們在和onLoad onReady里面去請求數(shù)據(jù)的話,會相對的減少白屏?xí)r間(這里說的白屏是指數(shù)據(jù)未渲染的界面),
而且官方?jīng)]說明為什么不建議使用小程序的生命周期,我們也嘗試了,用小程序的生命周期,沒發(fā)現(xiàn)生命問題,
所以我們還是比較傾向優(yōu)先使用小程序的生命周期,畢竟用戶體驗(yàn)才是王道。

四、掛載在Vue.prototype上的屬性,在模板語法里面是undefined,必須經(jīng)過computed計(jì)算過一下才能用。
在用vue的時(shí)候,我喜歡把圖片的服務(wù)器路徑存到vue的原型里面:

import config from "./config"
Vue.prototype.$serverPath = config.serverPath

然后 我們在頁面里面這樣用


這樣 就可以避免在每個(gè)頁面導(dǎo)入config文件,后期如果我們發(fā)布正式版的時(shí)候,只要在這邊修改一下config配置文件就可以了
然額,這樣寫在mpvue里面,實(shí)際渲染出來的會是


要想在每個(gè)頁面里面使用,只能乖乖在每個(gè)頁面里面導(dǎo)入,或者在computed里面返回this.$serverPath

五、用 v-for循環(huán)的時(shí)候,如果要給當(dāng)前項(xiàng)指定一個(gè)索引,在vue下,為了省事,我通常喜歡這樣做

v-for="item,index in list"

因?yàn)槎啻蛞粚ㄌ栒娴氖呛軣┤恕5窃趍pvue下面卻不行,你必須老老實(shí)實(shí)這樣寫,否則會報(bào)錯(cuò)。

v-for="(item,index) in list"

六、多帶帶為每個(gè)頁面的設(shè)置頁面頭部信息,有提供這個(gè)功能,不過文檔不是很詳細(xì),幾經(jīng)嘗試,才試出來。

我們的入口文件main.js(延續(xù)vue的叫法,暫且這么稱呼吧,其實(shí)我覺得應(yīng)該叫配置文件)里面可以這樣配置,
官方文檔大概也是這么說的

這部分內(nèi)容來源于 app 和 page 的 entry 文件,通常習(xí)慣是 main.js,你需要在你的入口文件中
export default { config: {} },這才能被我們的 loader 識別為這是一個(gè)配置,需要寫成 json 文件。
import Vue from "vue";
import App from "./app";

const vueApp = new Vue(App);
vueApp.$mount();

// 這個(gè)是我們約定的額外的配置
export default {
    // 這個(gè)字段下的數(shù)據(jù)會被填充到 app.json / page.json
    config: {
        pages: ["static/calendar/calendar", "^pages/list/list"], // Will be filled in webpack
        window: {  // 頂部欄的統(tǒng)一配置
            backgroundTextStyle: "light",
            navigationBarBackgroundColor: "#455A73",
            navigationBarTitleText: "美團(tuán)汽車票",
            navigationBarTextStyle: "#fff"
        }
    }
};
同時(shí),這個(gè)時(shí)候,我們會根據(jù) entry 的頁面數(shù)據(jù),自動(dòng)填充到 app.json 中的 pages 字段。
pages 字段也是可以自定義的,約定帶有 ^ 符號開頭的頁面,會放到數(shù)組的最前面。

我們看到,可以在config.window下面配置全局的頂部欄樣式,但是如果我們想為每個(gè)頁面指定一個(gè)樣式呢?事實(shí)上,
以上方法只適合配置app.json里面的內(nèi)容,如果你想要為你的每個(gè)頁面都添加一種樣式,那么應(yīng)該這樣做:
在頁面所屬的入口文件(main.js)里面添加以下內(nèi)容,比如我想為 userCenter/index頁面設(shè)置一個(gè)標(biāo)題,
應(yīng)該在userCenter/main.js里面加入

export default {
  config: {
    navigationBarTitleText: "個(gè)人中心",
  }
}

注意 這里跟上面那個(gè)全局配置不同的是,配置內(nèi)容navigationBarTitleText是config的屬性,
而全局配置里,則是config.window的屬性

七、組件的命名問題,有一次,我寫了一個(gè)局部的組件,為什么叫局部的組件呢,因?yàn)槲抑辉谀硞€(gè)頁面里面使用,
所以為了簡單化,我給這個(gè)組件取了個(gè)名字叫list.vue,然后在父組件引用:



組件能正常顯示,樣式也沒問題,一切看上去都是那么的正常,然而組件里面的邏輯就是不會執(zhí)行。
加上本文第一點(diǎn)提到的,不會報(bào)錯(cuò),讓我一頓好找啊...
經(jīng)過排查發(fā)現(xiàn),跟組件的引入名稱有關(guān),應(yīng)該是跟微信的關(guān)鍵字同名了。



這樣就能正常運(yùn)行,出了list,我目前踩到的還有tabbar,搞得我現(xiàn)在命名的時(shí)候,看到一些疑似關(guān)鍵的字眼,心理都有點(diǎn)陰影。。
這個(gè)應(yīng)該是微信的問題吧,總之遇到了,就一塊寫出來。

八、組件第一次加載的時(shí)候不能執(zhí)行onShow里面的內(nèi)容,只有在隱藏又顯示后,才會顯示,而頁面卻每次進(jìn)入都會顯示
例如我們在一個(gè)組件里有一下代碼

onLoad () {
  console.log("onLoad")
},
onShow () {
  console.log("onShow")
},
mounted () {
  console.log("mounted")
},

頁面加載的時(shí)候,我們期望打印出來的是

onLoad
onShow
mounted

然后實(shí)際上,只打印出

onLoad
mounted

這個(gè)問題,我已給官方提Issue,不過目前還沒得到回應(yīng)

說到這里,我們順便看看小程序的頁面跳轉(zhuǎn)方式,小程序在一個(gè)頁面跳轉(zhuǎn)(調(diào)用wx.navigateTo)到另一個(gè)頁面的時(shí)候,
并不會銷毀原來的頁面,而是轉(zhuǎn)到后臺去,并且執(zhí)行原頁面里面的onHide里的代碼,
這也是為什么小程序的頁面路徑最多只能十層,因?yàn)槟阍L問過的頁面,正常都會保存在內(nèi)存里,相當(dāng)于vue里的keep-alive,
如果允許跳轉(zhuǎn)非常多頁面的話,很容易導(dǎo)致內(nèi)存使用過高。

當(dāng)然,我們也可以使用wx.navigateBack wx.redirectTo wx.reLaunch 來銷毀頁面,這3個(gè)方法,會調(diào)用頁面的onUnload函數(shù)

九、canvas放在scroll-view不會隨著頁面滾動(dòng),看起來好像是fixed固定在某個(gè)位置的,但是在普通的view里面卻可以正常滾動(dòng)。
這個(gè)問題其實(shí)是微信的問題,官方文檔里面是有說明這點(diǎn),不過我遇見問題的時(shí)候,沒想到會是微信官方出的問題,各種百度谷歌,
都沒找到這跟這個(gè)問題有關(guān)的,甚至我很懷疑是我自己代碼的問題,于是新建了一個(gè)項(xiàng)目,然后直接考官方的示例代碼,也是一樣的效果。
后面就準(zhǔn)備放棄,想其他解決方案了,沒想到今天在官方文檔 -scroll-view組件的介紹的最底部的 小字 里看到了

tip: 請勿在 scroll-view 中使用 textarea、map、canvas、video 組件

進(jìn)一步查看了canvas組件的文檔,發(fā)現(xiàn)也有類似的提示

tip: 請勿在 scroll-view、swiper、picker-view、movable-view 中使用 canvas 組件。

之所以把這一點(diǎn)也算進(jìn)來,一是為這個(gè)問題坑了我好幾天,我都在想其他方案了,二是這幾天各種百度谷歌,
是有搜到幾個(gè)類似的問題,但是都沒人回答,我就在這邊記錄一下,希望后面踩到這個(gè)坑的童鞋能搜到。

十、同一個(gè)子組件,在2個(gè)不同的地方引用,會導(dǎo)致2個(gè)地方的樣式都加載不了,而如果只在一個(gè)地方引用卻沒問題,
為什么把這個(gè)問題放到最后? 因?yàn)檫@只是前幾個(gè)版本的腳手架有這個(gè)問題,后面的應(yīng)該就沒有這個(gè)問題了。
這個(gè)問題我也給官方提過Issue,官方給的回答是用新版本的腳手架重新生成項(xiàng)目,但是項(xiàng)目都快做完了,
這個(gè)時(shí)候重新生成,然后拷貝代碼,感覺心太累了,所以抱著不折騰不罷休的態(tài)度,終于找到原因,是因?yàn)樵缙诎姹镜哪_手架,
缺少了 webpack-mpvue-asset-plugin 這個(gè)插件,新版的cli里面會自動(dòng)添加這個(gè)插件。具體看Issue #180

還有一些官方明確指出的問題,這里就不一一列舉了,有興趣的童鞋可以直接查看mpvue官方文檔

另外,最近正在做一個(gè)mpvue的基礎(chǔ)教程,有興趣的童鞋請前往我的
github mpvue-tutorials,
您的一個(gè)Star,就是我最大的動(dòng)力了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93977.html

相關(guān)文章

  • 團(tuán)小程序框架mpvue入門教程

    摘要:美團(tuán)小程序框架入門教程自打?qū)懥嗣缊F(tuán)小程序框架蹲坑指南一發(fā)不可收拾,今天趁周末空閑,來寫個(gè)沒朋友的簡單入門教程,本教程只針對新手,老鳥勿噴。 美團(tuán)小程序框架mpvue入門教程 自打?qū)懥?美團(tuán)小程序框架mpvue蹲坑指南,一發(fā)不可收拾,今天趁周末空閑,來寫個(gè)mpvue(沒朋友)的簡單入門教程,本教程只針對新手,老鳥勿噴。 另外,我還專門為本文做了一個(gè)簡單的項(xiàng)目,如果懶得從頭開始搭項(xiàng)目的童鞋...

    YorkChen 評論0 收藏0
  • 微信小程序mpvue框架總結(jié)

    摘要:原理架構(gòu)作為與之間相互通信的橋梁部分在環(huán)境中注入的實(shí)現(xiàn)代碼,包含了協(xié)議的拼裝發(fā)送參數(shù)池回調(diào)池等一些基礎(chǔ)功能。部分在客戶端中的功能映射代碼,實(shí)現(xiàn)了攔截與解析環(huán)境信息的注入通用功能映射等功能。 原理架構(gòu) JSBridge 作為native 與 JS 之間相互通信的橋梁JS部分(bridge): 在JS環(huán)境中注入 bridge 的實(shí)現(xiàn)代碼,包含了協(xié)議的拼裝/發(fā)送/參數(shù)池/回調(diào)池等一些基礎(chǔ)功能...

    microelec 評論0 收藏0
  • mpvue開發(fā)小程序的那點(diǎn)小事

    摘要:是由美團(tuán)點(diǎn)評團(tuán)隊(duì)開發(fā)的,是一個(gè)使用開發(fā)小程序的前端框架。對于擁有開發(fā)經(jīng)驗(yàn)的開發(fā)者,使用開發(fā)小程序那是一種不錯(cuò)的體驗(yàn)。 mpvue mpvue是由美團(tuán)點(diǎn)評團(tuán)隊(duì)開發(fā)的, 是一個(gè)使用 Vue.js 開發(fā)小程序的前端框架??蚣芑?Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 實(shí)現(xiàn)。 對于擁有Vue開發(fā)經(jīng)驗(yàn)的開發(fā)者,使用mpvue開發(fā)小程序那是...

    zorro 評論0 收藏0
  • 程序初踩坑

    摘要:寫在前面一直有在關(guān)注小程序,也做過一些,不過一直沒上正式項(xiàng)目,剛好這次公司有小程序的項(xiàng)目就入坑了。是美團(tuán)剛出的小程序框架,也很不錯(cuò),可以直接用的寫法去進(jìn)行開發(fā),學(xué)習(xí)成本較低,缺點(diǎn)是剛推出,雖然美團(tuán)內(nèi)部有在使用,不過社區(qū)還沒起來。 寫在前面 一直有在關(guān)注小程序,也做過一些demo,不過一直沒上正式項(xiàng)目,剛好這次公司有小程序的項(xiàng)目就入坑了。項(xiàng)目開發(fā)完,記錄一下遇到的一些坑吧。 框架選用 框...

    RyanHoo 評論0 收藏0
  • 詳解 mpvue程序框架 及和原生的差異

    摘要:在這一步,實(shí)例已完成以下的配置數(shù)據(jù)觀測,屬性和方法的運(yùn)算,事件回調(diào)??梢灾苯訉懙葮?biāo)簽的寫法之前會的工程師上手框架的成本較低 簡介 1.美團(tuán)工程師推出的基于Vue.js封裝的用于開發(fā)小程序的框架2.融合了原生小程序和Vue.js的特點(diǎn)3.可完全組件化開發(fā) 特點(diǎn) 1.組件化開發(fā)2.完成的Vue.js開發(fā)體驗(yàn)(前提是熟悉Vue)3.可使用Vuex管理狀態(tài)4.Webpack構(gòu)建項(xiàng)目5.最終H5...

    IamDLY 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<