筆記內(nèi)容:小程序的模板化編程
筆記日期:2018-01-08
之前編寫(xiě)的新聞列表頁(yè)面中,我們把示例數(shù)據(jù)都放在了js文件中,但實(shí)際上數(shù)據(jù)是不應(yīng)該寫(xiě)在js文件中的,所以我們得把這些數(shù)據(jù)分離到一個(gè)單獨(dú)的數(shù)據(jù)文件中。然后post.js文件就加載這個(gè)數(shù)據(jù)文件中的數(shù)據(jù)即可,這樣也可以模擬一下加載服務(wù)器數(shù)據(jù)的過(guò)程。
1.新建一個(gè)data目錄,并在該目錄下創(chuàng)建一個(gè).js文件:
2.將數(shù)據(jù)剪切到該新建的文件中:
// 將數(shù)據(jù)整合成數(shù)組類(lèi)型
var local_database = [
{
date: "Jan 06 2018",
title: "正是蝦肥蟹壯時(shí)",
imgSrc: "/images/post/crab.png",
avatar: "/images/avatar/1.png",
content: "“山明水凈夜來(lái)霜,數(shù)樹(shù)深紅出淺黃。試上高樓清入骨,豈如春色嗾人狂?!苯鹎飼r(shí)節(jié),天高云淡,秋風(fēng)送爽,氣候宜人。秋風(fēng)秋陽(yáng)中,碩果墜掛枝頭,玉米撫須含笑,高粱引頸高歌,豆莢飽滿圓潤(rùn)。",
reading: "112",
collection: "96",
},
{
date: "Jan 03 2018",
title: "比利·林恩的中場(chǎng)戰(zhàn)事",
imgSrc: "/images/post/bl.png",
avatar: "/images/avatar/2.png",
content: "伊拉克戰(zhàn)爭(zhēng)時(shí)期,來(lái)自美國(guó)德州的19歲技術(shù)兵比利·林恩(喬·阿爾文 Joe Alwyn 飾)因?yàn)橐欢闻既慌臄z的視頻而家喻戶曉。那是一次規(guī)模不大卻激烈非常的遭遇戰(zhàn),戰(zhàn)斗中林恩所在的B班班長(zhǎng)(范·迪塞爾 Vin Diesel 飾)遭到當(dāng)?shù)匚溲b分子的伏擊和劫持,而林恩為了營(yíng)救班長(zhǎng)不惜鋌而走險(xiǎn)沖鋒陷陣。",
reading: "92",
collection: "65",
},
{
date: "Jan 05 2018",
title: "肖申克的救贖",
imgSrc: "/images/post/xs.jpg",
avatar: "/images/avatar/3.png",
content: "20世紀(jì)40年代末,小有成就的青年銀行家安迪(蒂姆·羅賓斯 Tim Robbins 飾)因涉嫌殺害妻子及她的情人而鋃鐺入獄。在這座名為肖申克的監(jiān)獄內(nèi),希望似乎虛無(wú)縹緲,終身監(jiān)禁的懲罰無(wú)疑注定了安迪接下來(lái)灰暗絕望的人生。",
reading: "92",
collection: "65",
},
{
date: "Jan 01 2018",
title: "霸王別姬",
imgSrc: "/images/post/bj.jpg",
avatar: "/images/avatar/4.png",
content: "段小樓(張豐毅)與程蝶衣(張國(guó)榮)是一對(duì)打小一起長(zhǎng)大的師兄弟,兩人一個(gè)演生,一個(gè)飾旦,一向配合天衣無(wú)縫,尤其一出《霸王別姬》,更是譽(yù)滿京城,為此,兩人約定合演一輩子《霸王別姬》。但兩人對(duì)戲劇與人生關(guān)系的理解有本質(zhì)不同,段小樓深知戲非人生,程蝶衣則是人戲不分。",
reading: "92",
collection: "65",
},
{
date: "Jan 08 2018",
title: "這個(gè)殺手不太冷",
imgSrc: "/images/post/ss.jpg",
avatar: "/images/avatar/5.png",
content: "里昂(讓·雷諾飾)是名孤獨(dú)的×××,受人雇傭。一天,鄰居家小姑娘馬蒂爾達(dá)(納塔麗·波特曼飾)敲開(kāi)他的房門(mén),要求在他那里暫避殺身之禍。原來(lái)鄰居家的主人是警方緝毒組的眼線,只因貪污了一小包×××而遭惡警(加里·奧德曼飾)殺害全家的懲罰。",
reading: "92",
collection: "65",
},
{
date: "Jan 04 2018",
title: "阿甘正傳",
imgSrc: "/images/post/ag.jpg",
avatar: "/images/avatar/1.png",
content: "阿甘(湯姆·漢克斯 飾)于二戰(zhàn)結(jié)束后不久出生在美國(guó)南方阿拉巴馬州一個(gè)閉塞的小鎮(zhèn),他先天弱智,智商只有75,然而他的媽媽是一個(gè)性格堅(jiān)強(qiáng)的女性,她常常鼓勵(lì)阿甘“傻人有傻?!?,要他自強(qiáng)不息。",
reading: "92",
collection: "65",
},
]
這個(gè)文件實(shí)際上充當(dāng)了一個(gè)本地?cái)?shù)據(jù)庫(kù),到時(shí)候腳本文件從這個(gè)文件中加載數(shù)據(jù)即可。注意:我把一些屬性名稱(chēng)更改了,wxml文件中的名稱(chēng)也要跟著更改。
1.在數(shù)據(jù)文件中增加以下代碼,設(shè)置一個(gè)數(shù)據(jù)出口:
// 設(shè)置一個(gè)數(shù)據(jù)出口,當(dāng)前這個(gè)文件相當(dāng)于是一個(gè)js模塊
module.exports = {
// 輸出的是一個(gè)Array對(duì)象
postList: local_database,
}
2.然后在腳本文件中通過(guò)require方法加載js模塊文件:
// 注意:這里只能使用相對(duì)路徑
var postsData = require('../../data/posts-data.js')
Page({
data: {
},
onLoad: function (options) {
this.setData({
// 通過(guò)postsData來(lái)拿到postList對(duì)象
posts_key: postsData.postList
});
},
})
以上就完成了數(shù)據(jù)與邏輯的分離,在我們平時(shí)開(kāi)發(fā)中,應(yīng)盡量避免這種數(shù)據(jù)與邏輯或者邏輯與視圖代碼混雜在一塊的情況。
關(guān)于setData方法的一些問(wèn)題:
1.直接修改 this.data 而不調(diào)用 this.setData 是無(wú)法改變頁(yè)面的狀態(tài)的,還會(huì)造成數(shù)據(jù)不一致。
2.單次設(shè)置的數(shù)據(jù)不能超過(guò)1024kB,請(qǐng)盡量避免一次設(shè)置過(guò)多的數(shù)據(jù)。
3.請(qǐng)不要把 data 中任何一項(xiàng)的 value 設(shè)為 undefined ,否則這一項(xiàng)將不被設(shè)置并可能遺留一些潛在問(wèn)題。
之前我們使用for循環(huán)改寫(xiě)了新聞列表頁(yè)面,解決了重復(fù)代碼的問(wèn)題,但是使用for循環(huán)只能解決當(dāng)前頁(yè)面代碼重復(fù)的問(wèn)題,如果別的頁(yè)面也要使用相同的代碼的話,就無(wú)法使用for循環(huán)來(lái)解決了。不過(guò)小程序給我們提供了一個(gè)template模板,使用template模板就能解決這種問(wèn)題。因?yàn)閠emplate可以讓多個(gè)頁(yè)面共享一個(gè)模板文件中的代碼,如果熟悉23種設(shè)計(jì)模式的話,就應(yīng)該知道這種模式類(lèi)似于模板設(shè)計(jì)模式。
1.在posts目錄下創(chuàng)建一個(gè)目錄,并在該目錄下創(chuàng)建一個(gè)wxml和wxss文件:
注:js文件無(wú)法作為模板文件,即便創(chuàng)建了也不會(huì)運(yùn)行,因?yàn)樾〕绦驔](méi)有模塊化的編程,只有模板化的編程
2.將post.wxml中需要被復(fù)用的代碼剪切到post-item-template.wxml模板文件中:
{{item.date}}
{{item.title}}
{{item.content}}
{{item.reading}}
{{item.collection}}
3.接著在post.wxml中引入模板文件,代碼如下:
4.以上完成了wxml代碼的模板,現(xiàn)在還需要把一些可復(fù)用的wxss代碼也做成模板,首先剪切post.wxss樣式文件中的代碼到模板文件中:
post-item-template.wxss文件內(nèi)容如下:
.post-author-date{
margin: 10rpx 0px 20rpx 10rpx ;
}
.post-author{
width: 30px;
height: 60rpx;
vertical-align: middle;
}
.post-date{
margin-left: 20rpx;
vertical-align: middle;
margin-bottom: 5px;
font-size: 26rpx;
}
.post-title{
font-size: 34rpx;
font-weight: 600;
color: #333;
margin-bottom: 10px;
margin-left: 10px;
}
.post-image{
margin-left: 16px;
width: 100%;
height: 340rpx;
margin: auto 0;
}
.post-content{
color: #666;
font-size: 28rpx;
margin-bottom: 20rpx;
margin-left: 20rpx;
letter-spacing: 2rpx;
line-height: 40rpx;
margin-top: 15px;
}
.post-like{
font-size: 13px;
flex-direction: row;
line-height: 16px;
margin-left: 10px;
}
.post-like-img{
height: 16px;
width: 16px;
margin-right: 8px;
vertical-align: middle;
}
.post-like-font{
vertical-align: middle;
margin-right: 20px;
}
5.然后在post.wxss文件里引用模板樣式:
@import "post-item/post-item-template.wxss";
swiper{
width:100%;
height:600rpx
}
swiper image{
width:100%;
height:600rpx
}
.post-container{
display: flex;
flex-direction: column;
margin-top:20rpx;
margin-bottom: 40rpx;
background-color: #fff;
border-bottom: 1px solid #ededed;
border-top: 1px solid #ededed;
padding-bottom: 5px;
}
完成以上操作后,我們就構(gòu)建了兩個(gè)模板——wxml模板以及wxss模板,在這之后哪個(gè)頁(yè)面文件需要復(fù)用這些樣式或wxml代碼就只需引入相應(yīng)的模板即可。通過(guò)這種模板化的編程就很好的提高了代碼的復(fù)用性,可惜小程序不支持模塊化,不然就可以把一些可復(fù)用的js代碼做成模板,這樣就可以再進(jìn)一步的進(jìn)行代碼的復(fù)用了。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。