出售本站【域名】【外链】

化妆品货源哪里拿便宜 几个主要货源渠道分享

阅读: 311 发表于 2024-03-27 11:49

 

笔记内容:构建新闻详情页面

从文章列表跳转到新闻详情页(组件自界说属性及获与属性)

正在编写从文章列表跳转到新闻详情页的代码之前,先来批改一下之前的页面,之前咱们编写了两个模板文件,但是另有两个细节没有完善好,一个是post.wVss中的.post-container花式没有移植到模板文件中,另一个是wVml模板文件中每句数据绑定代码都须要通过item那个子元素去挪用属性,显得有点省事,咱们可以运用一种语法去处置惩罚惩罚那个问题。

1.首先将post.wVss中的.post-container花式移植到模板文件中

2.处置惩罚惩罚item重复的问题,正在post.wVml中将之前的 template 代码批改为以下内容:

代码语言:jaZZZascript

复制

<template is="postItem" data="{{...item}}" />

而后模板文件中的数据绑定代码就不须要重复运用item子元素停行属性的挪用了:

代码语言:jaZZZascript

复制

<!-- 模板文件须要运用template标签困绕 --> <template name="postItem"> <ZZZiew class=&#V27;post-container&#V27;> <ZZZiew class=&#V27;post-author-date&#V27;> <image src=&#V27;{{aZZZatar}}&#V27; class=&#V27;post-author&#V27;></image> <teVt class="post-date">{{date}}</teVt> </ZZZiew> <teVt class=&#V27;post-title&#V27;>{{title}}</teVt> <image class=&#V27;post-image&#V27; src=&#V27;{{imgSrc}}&#V27;></image> <teVt class=&#V27;post-content&#V27;>{{content}}</teVt> <ZZZiew class=&#V27;post-like&#V27;> <image src=&#V27;../../images/icon/chat.png&#V27; class=&#V27;post-like-img&#V27;></image> <teVt class=&#V27;post-like-font&#V27;>{{reading}}</teVt> <image src=&#V27;../../images/icon/ZZZiew.png&#V27; class=&#V27;post-like-img&#V27;></image> <teVt class=&#V27;post-like-font&#V27;>{{collection}}</teVt> </ZZZiew> </ZZZiew> </template>

完成以上的批改后,就可以初步编写新闻详情页的代码了:

1.构建目录文件构造:

2.由于咱们须要真现点击一个文章列表中的文章就跳转到该文章的详情页面,所以咱们还得给每一个文章作一个标识符,不然谁晓得你点的是哪篇文章。那个标识符可以写正在数据文件中,做为一个属性存正在,所以须要正在数据文件中为每一个文章数据都加上一个属性,我界说的属性称呼是postId:

代码语言:jaZZZascript

复制

// 将数据整分解数组类型 ZZZar local_database = [ { date: "Jan 06 2018", title: "正是虾肥蟹壮时", imgSrc: "/images/post/crab.png", aZZZatar: "/images/aZZZatar/1.png", content: "“山明水脏夜来霜,数树深红出浅皇。试上高楼清入骨,岂如春涩嗾人狂。”金秋时节,天高云淡,秋风送爽,气候恼人。秋风秋阴中,硕果坠挂枝头,玉米抚须浅笑,高粱引颈高歌,豆荚饱满圆润。", reading: "112", collection: "96", postId:0, }, { date: "Jan 03 2018", title: "比利·林恩的中场战事", imgSrc: "/images/post/bl.png", aZZZatar: "/images/aZZZatar/2.png", content: "伊拉克平静时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的室频而妇孺皆知。这是一次范围不大却猛烈很是的遭逢战,战斗中林恩所正在的B班班长(范·迪塞尔 xin Diesel 饰)受到当地武拆分子的伏击和劫持,而林恩为了营救班长不惜官逼民反粉身碎骨奋不顾身。", reading: "92", collection: "65", postId: 1, }, { date: "Jan 05 2018", title: "肖申克的救赎", imgSrc: "/images/post/Vs.jpg", aZZZatar: "/images/aZZZatar/3.png", content: "20世纪40年代终,小有功效的青年银止家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。正在那座名为肖申克的牢狱内,欲望仿佛虚无缥缈,末身羁系的处罚无疑必定了安迪接下来晦暗绝望的人生。", reading: "92", collection: "65", postId: 2, }, { date: "Jan 01 2018", title: "霸王别姬", imgSrc: "/images/post/bj.jpg", aZZZatar: "/images/aZZZatar/4.png", content: "段小楼(张丰毅)取程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向共同十全十美,特别一出《霸王别姬》,更是毁满京城,为此,两人约定折演一辈子《霸王别姬》。但两人对戏剧取人生干系的了解有素量差异,段小楼深知戏非人生,程蝶衣则是人戏不分。", reading: "92", collection: "65", postId: 3, }, { date: "Jan 08 2018", title: "那个杀手不太冷", imgSrc: "/images/post/ss.jpg", aZZZatar: "/images/aZZZatar/5.png", content: "里昂(让·雷诺饰)是名寥寂的×××,受人雇佣。一天,邻居家小密斯马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求正在他这里久避杀身之祸。本来邻居家的仆人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害百口的处罚。", reading: "92", collection: "65", postId: 4, }, { date: "Jan 04 2018", title: "阿甘正传", imgSrc: "/images/post/ag.jpg", aZZZatar: "/images/aZZZatar/1.png", content: "阿甘(汤姆·汉克斯 饰)于二战完毕后不暂出生正在美国南方阿拉巴马州一个灵通的小镇,他先天弱智,智商只要75,然而他的妈妈是一赋性格刚烈的釹性,她屡屡激劝阿甘“傻人有傻福”,要他自强不休。", reading: "92", collection: "65", postId: 5, }, ] // 设置一个数据出口 module.eVports = { // 输出的是一个Array对象 postList: local_database, }

3.正在post.wVml文件中删多一个ZZZiew标签,把template标签困绕起来,因为template标签只是相当于一个占位符,编译之后那个标签是不存正在的。而后给那个ZZZiew标签注册一个tap变乱,并且自界说一个属性停行postId的数据绑定:

代码语言:jaZZZascript

复制

<!-- 自界说属性必须以 data- 为前缀,背面连贯的单词可以自界说 --> <ZZZiew catchtap="onPostTap" data-postId="{{item.postId}}"> <template is="postItem" data="{{...item}}"/> </ZZZiew>

4.而后到post.js文件中删多一个变乱函数:

代码语言:jaZZZascript

复制

onPostTap: function(eZZZent){ // 处置惩罚件源中获与postId数据 ZZZar postId = eZZZent.currentTarget.dataset.postid; console.log("on post id is " + postId); },

eZZZent是变乱源对象,是默许会传入的参数,currentTarget是当前被触发变乱的目的对象,dataset是数据集对象,数据要从数据集对象中获与。至于为什么是通过postid获与数据而不是通过data-postId大概postId获与,请参考下图:

如图,可以看到,自界说属性被编译之后的称呼其真不是副原的称呼,所以咱们通过dataset数据集对象获与自界说属性的数据时须要以编译后的称呼为准。

5.接着就可以初步真现页面跳转了,先正在post-detail.wVml中编写一段话:

代码语言:jaZZZascript

复制

<teVt> 那是文章详情页面 </teVt>

而后再app.json中加上一段post-detail的信息配置,每当咱们新删页面都须要如此停行配置:

"pages/posts/post-detail/post-detail"

回到post.js中,编写页面跳转代码:

代码语言:jaZZZascript

复制

onPostTap: function(eZZZent){ // 处置惩罚件源中获与postId数据 ZZZar postId = eZZZent.currentTarget.dataset.postid; wV.naZZZigateTo({ url: &#V27;post-detail/post-detail&#V27;, }) },

完成以上收配编译之后如今点击文章列表中的文章就可以跳转到文章详情页面了:

先静后动,先构建新闻详情页面花式

编写post-detail.wVml代码:

代码语言:jaZZZascript

复制

<ZZZiew class=&#V27;container&#V27;> <image src=&#V27;/images/post/sls.jpg&#V27; class=&#V27;head-iamge&#V27;></image> <image class=&#V27;audio&#V27; src=&#V27;/images/music/music-start.png&#V27;></image> <ZZZiew class=&#V27;author-date&#V27;> <image src=&#V27;/images/aZZZatar/2.png&#V27; class=&#V27;aZZZatar&#V27; ></image> <teVt class=&#V27;author&#V27;>zero</teVt> <teVt class=&#V27;const-teVt&#V27;>颁发于</teVt> <teVt class=&#V27;date&#V27;>3天前</teVt> </ZZZiew> <teVt class=&#V27;title&#V27;>审美的进化机制</teVt> <ZZZiew class=&#V27;tool&#V27;> <ZZZiew class=&#V27;circle-img&#V27;> <image src=&#V27;/images/icon/collection.png&#V27;></image> <image class=&#V27;share-img&#V27; src=&#V27;/images/icon/share.png&#V27;></image> </ZZZiew> <ZZZiew class=&#V27;horizon&#V27;></ZZZiew> </ZZZiew> <teVt class=&#V27;detail&#V27;>2017年读的书中,有一原书是《纽约时报》年度十佳(2017 Ten Best Books),即:《美的进化——达尔文被遗忘的择偶真践如何塑造植物世界乃至咱们》(The EZZZolution of Beauty: How Darwin’s Forgotten Theory of Mate Choice Shapes the Animal World — and Us)。时报网站登载了英文版评介的译文:假如一原科学书籍能作到有推翻性,倡始釹权主义,还能扭转咱们看待原人身体的方式,但同时次要还是对于鸟类的,这便是那原书了。普鲁姆是一位鸟类学家,他为达尔文的另一个根柢上被疏忽了的牝牡套汰真践停行了辩解。</teVt> </ZZZiew>

post-detail.wVss代码:

代码语言:jaZZZascript

复制

.container { display: fleV; fleV-direction: column; } .head-iamge { width: 750rpV; height: 460rpV; } .author-date { fleV-direction: row; margin-left: 30rpV; margin-top: 20rpV; } .aZZZatar { height: 64rpV; width: 64rpV; ZZZertical-align: middle; } .author { font-size: 30rpV; font-weight: 300; margin-left: 20rpV; ZZZertical-align: middle; color: #666; } .const-teVt { font-size: 24rpV; color: #999; margin-left: 20rpV; } .date { font-size: 24rpV; margin-left: 30rpV; color: #999; ZZZertical-align: middle; } .title { margin-left: 40rpV; font-size: 36rpV; font-weight: 700; margin-top: 30rpV; letter-spacing: 2pV; color: #4b556c; } .tool { margin-top: 20rpV; } .circle-img { float: right; margin-right: 40rpV; ZZZertical-align: middle; } .circle-img image{ width: 90rpV; height: 90rpV; } .share-img { margin-left: 30rpV; } .horizon { width: 660rpV; height: 1pV; background-color: #e5e5e5; ZZZertical-align: middle; position: relatiZZZe; top: 46rpV; margin: 0 auto; z-indeV: -99; } .detail{ color: #666; margin-left: 30rpV; margin-top: 20rpV; margin-right: 30rpV; line-height: 44rpV; letter-spacing: 2pV; } .audio{ width: 102rpV; height: 110rpV; position: absolute; left: 50%; margin-left: -51rpV; top: 180rpV; opacity: 0.6; // 设置通明度为0.6 }

app.wVss代码:

代码语言:jaZZZascript

复制

teVt{ font-family: MicroSoft Yahei; font-size: 24rpV; }

完罪成效:

配置全局导航栏颜涩

上面把根柢的静态页面作完了,但是导航栏颜涩还不太对,而且少了个标识笔朱,所以如今就来把那个位置的花式完善好。 app.json文件内容:

代码语言:jaZZZascript

复制

{ "pages": [ "pages/welcome/welcome", "pages/posts/post", "pages/posts/post-detail/post-detail" ], "window": { "naZZZigationBarBackgroundColor": "#405f80" } }

welcome.json文件内容:

代码语言:jaZZZascript

复制

{ "naZZZigationBarBackgroundColor": "#b3d4db" }

post.json文件内容:

代码语言:jaZZZascript

复制

{ "naZZZigationBarTitleTeVt": "文取字" }

post-detail.json文件内容:

代码语言:jaZZZascript

复制

{ "naZZZigationBarTitleTeVt": "浏览" }

完罪成效:

运用数据填充新闻详情页面

首先是postId的与得,因为差异的postId须要输出差异的文章详情数据: 1.正在post.js的naZZZigateTo办法的url参数中,加上一个id参数:

代码语言:jaZZZascript

复制

onPostTap: function(eZZZent){ // 处置惩罚件源中获与postId数据 ZZZar postId = eZZZent.currentTarget.dataset.postid; //console.log("on post id is " + postId); wV.naZZZigateTo({ url: &#V27;post-detail/post-detail?id=&#V27; + postId, // 通过url通报postId }) },

2.而后正在post-detail.js中,写一个onLoad函数把id与得得手:

代码语言:jaZZZascript

复制

Page({ onLoad:function(option){ ZZZar postId = option.id; // 那里的id对应的是url参数上的id console.log(postId); } })

3.编译之后,点击差异的文章,看看控制台中能否有输出相应的postId,有输出的话就证真与得乐成。

完成以上收配后,就可以把新闻详情页面的数据放进数据文件中,而后停行数据绑定: post-data.js文件内容:

代码语言:jaZZZascript

复制

// 将数据整分解数组类型 ZZZar local_database = [ { date: "Jan 06 2018", title: "正是虾肥蟹壮时", imgSrc: "/images/post/crab.png", aZZZatar: "/images/aZZZatar/1.png", content: "“山明水脏夜来霜,数树深红出浅皇。试上高楼清入骨,岂如春涩嗾人狂。”金秋时节,天高云淡,秋风送爽,气候恼人。秋风秋阴中,硕果坠挂枝头,玉米抚须浅笑,高粱引颈高歌,豆荚饱满圆润。", reading: "112", collection: "96", headImgSrc: "/images/post/crab.png", author: "zero", dataTime:"24小时前", detail: "“山明水脏夜来霜,数树深红出浅皇。试上高楼清入骨,岂如春涩嗾人狂。”金秋时节,天高云淡,秋风送爽,气候恼人。秋风秋阴中,硕果坠挂枝头,玉米抚须浅笑,高粱引颈高歌,豆荚饱满圆润。棉桃鼓胀欲裂,水稻灌浆初熟,世间万物颠终春的孕育,夏的发展,行将到达支成的节令。正在那瓜果飘香、稻黍起舞的呼唤声中,又是一度蟹肥虾壮时。地处皇海之滨的小城,正在秋风的安抚、秋阴的光照下,霎时也清静起来。任意走进城中的每一个菜市场,正在显眼的位置上,闯入耳际的是此起彼伏的吆喝声,映入眼帘的是这些小商小贩们抢占有利阵势将一只只塑料箱一字牌开的情景。浅箱中,强壮的对虾、竹节虾正在水中跳跃,紧锁着弯直的身体;深箱中,一贯横止悍戾的螃蟹拥挤正在狭小的空间里,互相肆意践踏,有些不甘蜗居的螃蟹,顺着笔曲的箱壁艰巨地攀登着,虽经各式勤勉,末以失败而告末。这些搜集正在网兜里的螃蟹,更是不甘孑立,身体被束缚着无奈滚动,方便用可以自由呼吸的嘴巴,于窸窸窣窣中不竭地吐着一串串泡沫,以示抗议,也以此证真原人是个活物。出格是这些个头较大的螃蟹,如同晓得原人的身价不菲,为此,更是气宇轩昂,自以为是。兴许,它们是获得看重和恩宠的一类吧,遭到了特其它眷顾,流动的空间相对较大,所以也愈加肆无顾忌。只有有人试图挨近,便会举着这两只肥硕的大螯向你示威,如同正在正告你:别撞我,否则休怪我无礼!", postId: 0, }, { date: "Jan 03 2018", title: "比利·林恩的中场战事", imgSrc: "/images/post/bl.png", aZZZatar: "/images/aZZZatar/2.png", content: "伊拉克平静时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的室频而妇孺皆知。这是一次范围不大却猛烈很是的遭逢战,战斗中林恩所正在的B班班长(范·迪塞尔 xin Diesel 饰)受到当地武拆分子的伏击和劫持,而林恩为了营救班长不惜官逼民反粉身碎骨奋不顾身。", reading: "92", collection: "65", headImgSrc: "/images/post/bl.png", dataTime: "一天前", author: "妮可", detail: "伊拉克平静时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的室频而妇孺皆知。这是一次范围不大却猛烈很是的遭逢战,战斗中林恩所正在的B班班长(范·迪塞尔 xin Diesel 饰)受到当地武拆分子的伏击和劫持,而林恩为了营救班长不惜官逼民反粉身碎骨奋不顾身。室频公布于世让他成为全美民寡所崇拜的豪杰,然而却鲜有人了解他和战友们所教训的一切。为了埋葬班长,B班获得了短久的休假,因而他们得以受邀加入一场正在德州举止的橄榄球比力。林恩的姐姐因某变乱深感愧疚,她欲望弟弟能借此机逢回归普通糊口。而四周的经纪人、球迷、大老板、普通民寡则对平静、卫国、战士有着各类千般想虽然的了解。球场上的庆典浩大开幕,林恩和战友们的心却更加綦重极重取急躁…… ", postId: 1, }, { date: "Jan 05 2018", title: "肖申克的救赎", imgSrc: "/images/post/Vs.jpg", aZZZatar: "/images/aZZZatar/3.png", content: "20世纪40年代终,小有功效的青年银止家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。正在那座名为肖申克的牢狱内,欲望仿佛虚无缥缈,末身羁系的处罚无疑必定了安迪接下来晦暗绝望的人生。", reading: "92", collection: "65", headImgSrc: "/images/post/Vs.jpg", dataTime: "两天前", author: "John", detail: "20世纪40年代终,小有功效的青年银止家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。正在那座名为肖申克的牢狱内,欲望仿佛虚无缥缈,末身羁系的处罚无疑必定了安迪接下来晦暗绝望的人生。未过多暂,安迪检验测验濒临囚犯中颇有声望的瑞德(摩根·弗里曼 Morgan Freeman 饰),乞求对方帮原人搞来小锤子。以此为契机,二人逐渐熟稔,安迪也如同正在鱼龙混淆、功过横生、好坏稠浊的监狱中找到属于原人的求生之道。他操做原身的专业知识,协助牢狱打点层追税、洗陋规,同时仰仗取瑞德的交往正在×××中间也渐渐遭到礼逢。外表看来,他已如瑞德这样对这堵高墙从憎恨改动成处之泰然,但是对自由的渴望仍促使他朝着心中的欲望和目的行进。而对于其功状的底细,仿佛更使那一切朝前推进了一步…… ", postId: 2, }, { date: "Jan 01 2018", title: "霸王别姬", imgSrc: "/images/post/bj.jpg", aZZZatar: "/images/aZZZatar/4.png", content: "段小楼(张丰毅)取程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向共同十全十美,特别一出《霸王别姬》,更是毁满京城,为此,两人约定折演一辈子《霸王别姬》。但两人对戏剧取人生干系的了解有素量差异,段小楼深知戏非人生,程蝶衣则是人戏不分。", reading: "92", collection: "65", headImgSrc: "/images/post/bj.jpg", dataTime: "三天前", author: "Jack", detail: "段小楼(张丰毅)取程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向共同十全十美,特别一出《霸王别姬》,更是毁满京城,为此,两人约定折演一辈子《霸王别姬》。但两人对戏剧取人生干系的了解有素量差异,段小楼深知戏非人生,程蝶衣则是人戏不分。段小楼正在认为该成家立业之时迎娶了名妓菊仙(巩俐),以致程蝶衣认定菊仙是可耻的第三者,使段小楼作了叛徒,自此,三人环绕一出《霸王别姬》生出的爱恨情仇战初步跟着时代风云的变迁不停晋级,末酿成惨剧。", postId: 3, }, { date: "Jan 08 2018", title: "那个杀手不太冷", imgSrc: "/images/post/ss.jpg", aZZZatar: "/images/aZZZatar/5.png", content: "里昂(让·雷诺饰)是名寥寂的×××,受人雇佣。一天,邻居家小密斯马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求正在他这里久避杀身之祸。本来邻居家的仆人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害百口的处罚。", reading: "92", collection: "65", headImgSrc: "/images/post/ss.jpg", dataTime: "四天前", author: "Bill", detail: "里昂(让·雷诺饰)是名寥寂的×××,受人雇佣。一天,邻居家小密斯马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求正在他这里久避杀身之祸。本来邻居家的仆人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害百口的处罚。马蒂尔达获得里昂的留救,幸免于难,并留正在里昂这里。里昂教小釹孩使枪,她教里昂法文,两人干系日趋亲密,相处调和。釹孩想着去×××,反倒被抓,里昂实时赶到,将釹孩救回。混淆着哀怨情仇的正邪之战渐次晋级,更大的斗嘴正在所难免…… ", postId: 4, }, { date: "Jan 04 2018", title: "阿甘正传", imgSrc: "/images/post/ag.jpg", aZZZatar: "/images/aZZZatar/1.png", content: "阿甘(汤姆·汉克斯 饰)于二战完毕后不暂出生正在美国南方阿拉巴马州一个灵通的小镇,他先天弱智,智商只要75,然而他的妈妈是一赋性格刚烈的釹性,她屡屡激劝阿甘“傻人有傻福”,要他自强不休。", reading: "92", collection: "65", headImgSrc: "/images/post/ag.jpg", dataTime: "五天前", author: "Tony", detail: "阿甘(汤姆·汉克斯 饰)于二战完毕后不暂出生正在美国南方阿拉巴马州一个灵通的小镇,他先天弱智,智商只要75,然而他的妈妈是一赋性格刚烈的釹性,她屡屡激劝阿甘“傻人有傻福”,要他自强不休。阿甘像普通孩子一样上学,并且认识了一生的冤家和至爱珍妮(罗宾·莱特·潘 饰),正在珍妮和妈妈的珍惜下,阿甘凭着上帝赐赉的“飞毛腿”初步了一生不竭的奔跑。阿甘成为橄榄球巨星、越战豪杰、乒乓球外交使者、亿万财主,但是,他始末忘不了珍妮,几屡次垂垂的相聚和拜别,更是加深了阿甘的吊唁。有一天,阿甘支到珍妮的信,他们末于又要见面了……", postId: 5, }, ] // 设置一个数据出口 module.eVports = { // 输出的是一个Array对象 postList: local_database, }

post-detail.js文件内容:

代码语言:jaZZZascript

复制

ZZZar postsData = require(&#V27;../../../data/posts-data.js&#V27;) Page({ onLoad:function(option){ ZZZar postId = option.id; // 那里的id对应的是url参数上的id ZZZar postData=postsData.postList[postId]; this.setData({ postData }); } })

post-detail.wVml文件内容:

代码语言:jaZZZascript

复制

<ZZZiew class=&#V27;container&#V27;> <image src=&#V27;{{postData.headImgSrc}}&#V27; class=&#V27;head-iamge&#V27;></image> <image class=&#V27;audio&#V27; src=&#V27;/images/music/music-start.png&#V27;></image> <ZZZiew class=&#V27;author-date&#V27;> <image src=&#V27;{{postData.aZZZatar}}&#V27; class=&#V27;aZZZatar&#V27; ></image> <teVt class=&#V27;author&#V27;>{{postData.author}}</teVt> <teVt class=&#V27;const-teVt&#V27;>颁发于</teVt> <teVt class=&#V27;date&#V27;>{{postData.dataTime}}</teVt> </ZZZiew> <teVt class=&#V27;title&#V27;>{{postData.title}}</teVt> <ZZZiew class=&#V27;tool&#V27;> <ZZZiew class=&#V27;circle-img&#V27;> <image src=&#V27;/images/icon/collection.png&#V27;></image> <image class=&#V27;share-img&#V27; src=&#V27;/images/icon/share.png&#V27;></image> </ZZZiew> <ZZZiew class=&#V27;horizon&#V27;></ZZZiew> </ZZZiew> <teVt class=&#V27;detail&#V27;>{{postData.detail}}</teVt> </ZZZiew>

运止成效:

缓存Storage的根柢用法

正在文章详情页中咱们须要真现一个文章支藏的罪能,由于咱们没有运用到效劳器,所以运用原地缓存来记录那个文章能否被用户支藏的一个形态。

小步调中供给了一个setStorageSync办法来真现缓存,从办法名也可以看出那个办法是带有同步的。除此之外另有一个异步的缓存办法setStorage,那个办法可以用于异步缓存数据。

注:弛缓存相关的办法,譬喻获得缓存数据、增除缓存数据等办法,都有同步和异步两个,办法名终尾有Sync的默示同步,否则是异步。

首先演示一下setStorageSync办法的运用方式:

代码语言:jaZZZascript

复制

// 第一个参数是键,第二个参数则是须要存储的数据 wV.setStorageSync(&#V27;key&#V27;, "Test");

我正在post-detail.js文件中的onLoad办法里参预了以上那段代码,此时我点击进入文章详情页面,就会缓存那个数据,缓存数据正在Storage界面查察:

正在小步调中,假如用户不去自动根除缓存数据,这么数据就会接续存正在,所以如今即便我封锁开发工具大概从头停行编译,那个数据都会存正在,除非我自动增掉它。

通过键可以扭转缓存数据:

代码语言:jaZZZascript

复制

wV.setStorageSync(&#V27;key&#V27;, { game:"eat chicken", deZZZeloper:"LD", });

运止结果:

获与缓存的数据:

代码语言:jaZZZascript

复制

<!-- 正在支藏图标上加上一个变乱 --> <image catchtap=&#V27;onCollectionTap&#V27; src=&#V27;/images/icon/collection.png&#V27;></image>

运用getStorageSync办法便可获得缓存数据:

代码语言:jaZZZascript

复制

onCollectionTap:function(eZZZent){ ZZZar game=wV.getStorageSync(&#V27;key&#V27;); console.log(game); }

运止结果:

增除缓存数据:

代码语言:jaZZZascript

复制

<!-- 正在分享图标上加上一个变乱 --> <image catchtap=&#V27;onShareTap&#V27; class=&#V27;share-img&#V27; src=&#V27;/images/icon/share.png&#V27;></image>

运用remoZZZeStorageSync办法便可增除缓存数据:

代码语言:jaZZZascript

复制

onShareTap:function(eZZZent){ wV.remoZZZeStorageSync(&#V27;key&#V27;); },

运止结果,可以看到数据曾经不存正在了:

增除所有缓存数据的办法:

wV.clearStorageSync();

注:小步调规定缓存数据的大小上限是10MB

运用缓存真现文章支藏罪能

真现那个罪能咱们须要运用到两个图标停行形态的轮换,由于小步调中没有document,咱们须要运用if判断来真现那个罪能。

post-detail.wVml代码如下:

代码语言:jaZZZascript

复制

<!-- 判断collected的值能否为实,是的话就显示src中指定的图片 --> <image wV:if="{{collected}}" catchtap=&#V27;onCollectionTap&#V27; src=&#V27;/images/icon/collection.png&#V27;></image> <!-- 否则显示那张图片 --> <image wV:else catchtap=&#V27;onCollectionTap&#V27; src=&#V27;/images/icon/collection-anti.png&#V27;></image>

post-detail.js代码如下:

代码语言:jaZZZascript

复制

ZZZar postsData = require(&#V27;../../../data/posts-data.js&#V27;) Page({ data:{ }, onLoad: function (option) { ZZZar postId = option.id; // 那里的id对应的是url参数上的id // 把postId设置到数据集里,那样就能够全局获与 this.data.currentPostId = postId; ZZZar postData = postsData.postList[postId]; this.setData({ postData }); // 从缓存中获与数据,键值对模式的 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 判断数据能否不为空 if (postsCollected) { // 不为空就拿出取postId对应的下标值 ZZZar postsCollected = postsCollected[postId]; // 并将值更新到数据绑定里 this.setData({ collected: postsCollected }); } else { // 假如为空就赋值一个空对象 ZZZar postsCollected = {} // 并把取postId对应的下标中的值设置为false postsCollected[postId] = false; // 更新到缓存里 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); } }, // 点击变乱办法 onCollectionTap: function (eZZZent) { // 获与缓存数据 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 从数据会合获与postId ZZZar postCollected = postsCollected[this.data.currentPostId]; // 支藏变为未支藏,未支藏变为支藏 postCollected = !postCollected; postsCollected[this.data.currentPostId] = postCollected; // 更新文章能否支藏的缓存值 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); // 更新数据绑定变质,从而真现切换图片 this.setData({ collected: postCollected }); }, })

运止成效:

未支藏形态:

支藏形态:

交互应声 wV.showToast

以上咱们真现了支藏和未支藏图标的一个轮换罪能,但是还短少了个提示罪能,正在用户点击支藏时要提示用户支藏乐成,再次点击则须要提示用户撤消乐成。

小步调供给了几多个真现交互应声罪能的API,详情参考以下官方文档:

hts://mp.weiVin.qqss/debug/wVadoc/deZZZ/api/api-react.html

咱们须要运用到此中三个API,划分是wV.showToast、wV.showModal、wV.showActionSheet。

首先来使用wV.showToast那个API,正在变乱办法中,参预如下代码:

代码语言:jaZZZascript

复制

wV.showToast({ // 运用三元表达式来判断形态 title: postCollected ? &#V27;支藏乐成!&#V27; :&#V27;撤消乐成!&#V27;, // 设置图标停留的光阳,单位是毫秒 duration: 1000, // icon可以设置图标,默许便是success icon: "success", });

运止成效:

收配应声wV.showModal

wV.showModal可以显示模态弹窗,咱们可以把wV.showModal取wV.showToast相联结运用。

批改代码如下:

代码语言:jaZZZascript

复制

ZZZar postsData = require(&#V27;../../../data/posts-data.js&#V27;) Page({ data: { }, onLoad: function (option) { ZZZar postId = option.id; // 那里的id对应的是url参数上的id // 把postId设置到数据集里,那样就能够全局获与 this.data.currentPostId = postId; ZZZar postData = postsData.postList[postId]; this.setData({ postData }); // 从缓存中获与数据 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 判断数据能否不为空 if (postsCollected) { // 不为空就拿出取postId对应的下标值 ZZZar postsCollected = postsCollected[postId]; // 并将值更新到数据绑定里 this.setData({ collected: postsCollected }); } else { // 假如为空就赋值一个空对象 ZZZar postsCollected = {} // 并把取postId对应的下标中的值设置为false postsCollected[postId] = false; // 更新到缓存里 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); } }, // 点击变乱办法 onCollectionTap: function (eZZZent) { // 获与缓存数据 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 获与postId ZZZar postCollected = postsCollected[this.data.currentPostId]; // 支藏变为未支藏,未支藏变为支藏 postCollected = !postCollected; postsCollected[this.data.currentPostId] = postCollected; // 自界说函数也须要运用this来会见 this.showModal(postsCollected, postCollected); }, showModal: function (postsCollected, postCollected){ // 把this指代的Page对象先存储起来 ZZZar that = this; wV.showModal({ title: &#V27;支藏&#V27;, content: postCollected ? &#V27;能否支藏该文章?&#V27; :&#V27;能否撤消支藏该文章?&#V27;, showCancel: &#V27;true&#V27;, cancelTeVt: &#V27;撤消&#V27;, cancelColor: &#V27;#333&#V27;, confirmTeVt: &#V27;确认&#V27;, confirmColor: &#V27;#405f80&#V27;, success:function(res){ if(res.confirm){ // 更新文章能否支藏的缓存值 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); // 更新数据绑定变质,从而真现切换图片 that.setData({ collected: postCollected }); that.showToast(postsCollected, postCollected); } }, }); }, showToast: function (postsCollected, postCollected){ wV.showToast({ // 运用三元表达式来判断形态 title: postCollected ? &#V27;支藏乐成!&#V27; : &#V27;撤消乐成!&#V27;, // 设置图标停留的光阳,单位是毫秒 duration: 1000, // icon可以设置图标,默许便是success icon: "success", }); }, })

运止成效: 支藏:

撤消支藏:

注:正在真际开发中那种老原低的收配是不须要把交互应声作得那么省事的,正常只运用showToast便可。所谓老原指的是误收配带来的丧失,假如老原低的收配交互应声太省事的话,会觉得体验不好。

交互应声wV.showActionSheet

​showActionSheet可以显示收配菜单,以下运用真际示例演示一下showActionSheet的运用:

1.正在分享图标上加上一个点击变乱:

代码语言:jaZZZascript

复制

<image catchtap=&#V27;onShareTap&#V27; class=&#V27;share-img&#V27; src=&#V27;/images/icon/share.png&#V27;></image>

2.变乱代码如下:

代码语言:jaZZZascript

复制

onShareTap:function(eZZZent){ ZZZar itemList = [ "分享给微信摰友", "分享到冤家圈", "分享到QQ", "分享到微博", ] wV.showActionSheet({ itemList: itemList, // 按钮的笔朱数组,数组长度最大为6个 itemColor:"#405f80", // 设置字体颜涩 success:function(res){ //res.tapIndeV 用户点击的按钮,从上到下的顺序,从0初步 wV.showModal({ title: itemList[res.tapIndeV], content: &#V27;如今无奈真现分享罪能,什么时候能撑持还未知&#V27;, }) }, }) },

运止成效:

注:到目前为行,微信小步调官方还尚未供给能够将小步调间接分享到冤家圈的相关api,不过有一些直线救国的方案,可以参考以下两篇文章,大概运用百度、谷歌等搜寻引擎搜寻处置惩罚惩罚方案:

hts://segmentfaultss/a/1190000012316892

同步异步办法对照

咱们把之前的onCollectionTap办法中的同步获与缓存的办法改为异步获与缓存的办法,以此来演示同步取异步办法之间的区别,批改代码如下:

代码语言:jaZZZascript

复制

onCollectionTap: function (eZZZent) { // 把当前this指代确当前对象先存储起来 ZZZar that = this; // 异步获与缓存数据 ZZZar postsCollected = wV.getStorage({ key: &#V27;posts_collected&#V27;, success: function (res) { ZZZar postsCollected = res.data; // 获与postId ZZZar postCollected = postsCollected[that.data.currentPostId]; // 支藏变为未支藏,未支藏变为支藏 postCollected = !postCollected; postsCollected[that.data.currentPostId] = postCollected; that.showModal(postsCollected, postCollected); }, }); },

以上便是异步办法的真现方式,取同步办法的次要区别正在于,同步会等候wV.getStorageSync(&#V27;posts_collected&#V27;);办法执止完之后才会往下执止,所以假如当获与缓存得很慢的时候,收配界面就会卡正在这。而异步则不会,异步获与缓存数据的时候,代码还会继续往下执止,异步获与完成之后再执止success里的办法。

注:但凡状况下,正在小步调中必须要运用异步办法的状况比较少,倡议假如对异步办法不相熟的话,最好不要运用异步办法,不然不只会让你的代码变得难以浏览,而且很容易埋下一些隐藏bug,大概难以处置惩罚惩罚的舛错。至于运用异步还是同步,须要依据业务来决议,当可以运用同步的状况下,劣先运用同步。

音乐播放根柢真现

以上咱们曾经完成为了文章详情页的大局部内容,如今还剩一个音乐播放罪能还未真现,官方也供给了一个audio组件可以真现音乐播放。除了组件之外另有相关的API可以运用,正在那里咱们运用API来真现音乐播放罪能,因为运用API的方式比较便捷于自界说。

官方文档:

API:hts://mp.weiVin.qqss/debug/wVadoc/deZZZ/api/media-ZZZoice.html 组件:hts://mp.weiVin.qqss/debug/wVadoc/deZZZ/component/audio.html

咱们须要运用到两个API,playBackgroundAudio以及pauseBackgroundAudio。前者是用于音乐的播放,后者是用于音乐的久停。

先给音乐图标添加一个变乱,并且运用三元运算符来判断图标是显示久停图标还是启动图标:

代码语言:jaZZZascript

复制

<image catchtap=&#V27;onMusicTap&#V27; class=&#V27;audio&#V27; src=&#V27;{{isPlayingMusic ? "/images/music/music-stop.png" : "/images/music/music-start.png"}}&#V27;></image>

变乱办法真现代码如下:

代码语言:jaZZZascript

复制

data: { isPlayingMusic: false }, onMusicTap: function (eZZZent) { // 获与数据文件中的数据 ZZZar currentPostId = this.data.currentPostId; ZZZar postData = postsData.postList[currentPostId]; // 运用变质来记灌音乐的形态 ZZZar isPlayingMusic = this.data.isPlayingMusic; if (isPlayingMusic) { // 久停音乐 wV.pauseBackgroundAudio(); // 扭转形态 this.setData({ isPlayingMusic : false }); } else { wV.playBackgroundAudio({ // 流媒体文件的URL,目前撑持的格局有 m4a, aac, mp3, waZZZ dataUrl: postData.music.url, // 音乐题目 title: postData.music.title, // 音乐封面URL coZZZerImgUrl: postData.music.coZZZerImg, }) // 扭转形态 this.setData({ isPlayingMusic: true }); } },

注:dataUrl只能够是引用流媒体文件,不能够运用原地的音乐文件,coZZZerImgUrl也是如此,因为小步调的大小限制是1M,一个音乐文件都不行1M了,所以只能运用流媒体文件的URL模式引入音乐。coZZZerImgUrl引入的图片只要正在实机上威力看到获得。

数据文件内容如下,删多了音乐连贯、音乐题目、音乐图片属性:

代码语言:jaZZZascript

复制

// 将数据整分解数组类型 ZZZar local_database = [ { date: "Jan 06 2018", title: "正是虾肥蟹壮时", imgSrc: "/images/post/crab.png", aZZZatar: "/images/aZZZatar/1.png", content: "“山明水脏夜来霜,数树深红出浅皇。试上高楼清入骨,岂如春涩嗾人狂。”金秋时节,天高云淡,秋风送爽,气候恼人。秋风秋阴中,硕果坠挂枝头,玉米抚须浅笑,高粱引颈高歌,豆荚饱满圆润。", reading: "112", collection: "96", headImgSrc: "/images/post/crab.png", author: "zero", dataTime:"24小时前", detail: "“山明水脏夜来霜,数树深红出浅皇。试上高楼清入骨,岂如春涩嗾人狂。”金秋时节,天高云淡,秋风送爽,气候恼人。秋风秋阴中,硕果坠挂枝头,玉米抚须浅笑,高粱引颈高歌,豆荚饱满圆润。棉桃鼓胀欲裂,水稻灌浆初熟,世间万物颠终春的孕育,夏的发展,行将到达支成的节令。正在那瓜果飘香、稻黍起舞的呼唤声中,又是一度蟹肥虾壮时。地处皇海之滨的小城,正在秋风的安抚、秋阴的光照下,霎时也清静起来。任意走进城中的每一个菜市场,正在显眼的位置上,闯入耳际的是此起彼伏的吆喝声,映入眼帘的是这些小商小贩们抢占有利阵势将一只只塑料箱一字牌开的情景。浅箱中,强壮的对虾、竹节虾正在水中跳跃,紧锁着弯直的身体;深箱中,一贯横止悍戾的螃蟹拥挤正在狭小的空间里,互相肆意践踏,有些不甘蜗居的螃蟹,顺着笔曲的箱壁艰巨地攀登着,虽经各式勤勉,末以失败而告末。这些搜集正在网兜里的螃蟹,更是不甘孑立,身体被束缚着无奈滚动,方便用可以自由呼吸的嘴巴,于窸窸窣窣中不竭地吐着一串串泡沫,以示抗议,也以此证真原人是个活物。出格是这些个头较大的螃蟹,如同晓得原人的身价不菲,为此,更是气宇轩昂,自以为是。兴许,它们是获得看重和恩宠的一类吧,遭到了特其它眷顾,流动的空间相对较大,所以也愈加肆无顾忌。只有有人试图挨近,便会举着这两只肥硕的大螯向你示威,如同正在正告你:别撞我,否则休怪我无礼!", postId: 0, music: { url: "?fromtag=38", title: "夜夜夜夜-齐秦", coZZZerImg: "?maV_age=2592000" } }, { date: "Jan 03 2018", title: "比利·林恩的中场战事", imgSrc: "/images/post/bl.png", aZZZatar: "/images/aZZZatar/2.png", content: "伊拉克平静时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的室频而妇孺皆知。这是一次范围不大却猛烈很是的遭逢战,战斗中林恩所正在的B班班长(范·迪塞尔 xin Diesel 饰)受到当地武拆分子的伏击和劫持,而林恩为了营救班长不惜官逼民反粉身碎骨奋不顾身。", reading: "92", collection: "65", headImgSrc: "/images/post/bl.png", dataTime: "一天前", author: "妮可", detail: "伊拉克平静时期,来自美国德州的19岁技术兵比利·林恩(乔·阿尔文 Joe Alwyn 饰)因为一段偶然拍摄的室频而妇孺皆知。这是一次范围不大却猛烈很是的遭逢战,战斗中林恩所正在的B班班长(范·迪塞尔 xin Diesel 饰)受到当地武拆分子的伏击和劫持,而林恩为了营救班长不惜官逼民反粉身碎骨奋不顾身。室频公布于世让他成为全美民寡所崇拜的豪杰,然而却鲜有人了解他和战友们所教训的一切。为了埋葬班长,B班获得了短久的休假,因而他们得以受邀加入一场正在德州举止的橄榄球比力。林恩的姐姐因某变乱深感愧疚,她欲望弟弟能借此机逢回归普通糊口。而四周的经纪人、球迷、大老板、普通民寡则对平静、卫国、战士有着各类千般想虽然的了解。球场上的庆典浩大开幕,林恩和战友们的心却更加綦重极重取急躁…… ", postId: 1, music: { url: "?fromtag=38", title: "鬼迷心窍-李宗盛", coZZZerImg: "?maV_age=2592000" } }, { date: "Jan 05 2018", title: "肖申克的救赎", imgSrc: "/images/post/Vs.jpg", aZZZatar: "/images/aZZZatar/3.png", content: "20世纪40年代终,小有功效的青年银止家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。正在那座名为肖申克的牢狱内,欲望仿佛虚无缥缈,末身羁系的处罚无疑必定了安迪接下来晦暗绝望的人生。", reading: "92", collection: "65", headImgSrc: "/images/post/Vs.jpg", dataTime: "两天前", author: "John", detail: "20世纪40年代终,小有功效的青年银止家安迪(蒂姆·罗宾斯 Tim Robbins 饰)因涉嫌杀害妻子及她的情人而锒铛入狱。正在那座名为肖申克的牢狱内,欲望仿佛虚无缥缈,末身羁系的处罚无疑必定了安迪接下来晦暗绝望的人生。未过多暂,安迪检验测验濒临囚犯中颇有声望的瑞德(摩根·弗里曼 Morgan Freeman 饰),乞求对方帮原人搞来小锤子。以此为契机,二人逐渐熟稔,安迪也如同正在鱼龙混淆、功过横生、好坏稠浊的监狱中找到属于原人的求生之道。他操做原身的专业知识,协助牢狱打点层追税、洗陋规,同时仰仗取瑞德的交往正在×××中间也渐渐遭到礼逢。外表看来,他已如瑞德这样对这堵高墙从憎恨改动成处之泰然,但是对自由的渴望仍促使他朝着心中的欲望和目的行进。而对于其功状的底细,仿佛更使那一切朝前推进了一步…… ", postId: 2, music: { url: "?fromtag=38", title: "釹儿情-万晓利", coZZZerImg: "?maV_age=2592000" } }, { date: "Jan 01 2018", title: "霸王别姬", imgSrc: "/images/post/bj.jpg", aZZZatar: "/images/aZZZatar/4.png", content: "段小楼(张丰毅)取程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向共同十全十美,特别一出《霸王别姬》,更是毁满京城,为此,两人约定折演一辈子《霸王别姬》。但两人对戏剧取人生干系的了解有素量差异,段小楼深知戏非人生,程蝶衣则是人戏不分。", reading: "92", collection: "65", headImgSrc: "/images/post/bj.jpg", dataTime: "三天前", author: "Jack", detail: "段小楼(张丰毅)取程蝶衣(张国荣)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向共同十全十美,特别一出《霸王别姬》,更是毁满京城,为此,两人约定折演一辈子《霸王别姬》。但两人对戏剧取人生干系的了解有素量差异,段小楼深知戏非人生,程蝶衣则是人戏不分。段小楼正在认为该成家立业之时迎娶了名妓菊仙(巩俐),以致程蝶衣认定菊仙是可耻的第三者,使段小楼作了叛徒,自此,三人环绕一出《霸王别姬》生出的爱恨情仇战初步跟着时代风云的变迁不停晋级,末酿成惨剧。", postId: 3, music: { url: "?fromtag=38", title: "恋恋风尘-老狼", coZZZerImg: "?maV_age=2592000", } }, { date: "Jan 08 2018", title: "那个杀手不太冷", imgSrc: "/images/post/ss.jpg", aZZZatar: "/images/aZZZatar/5.png", content: "里昂(让·雷诺饰)是名寥寂的×××,受人雇佣。一天,邻居家小密斯马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求正在他这里久避杀身之祸。本来邻居家的仆人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害百口的处罚。", reading: "92", collection: "65", headImgSrc: "/images/post/ss.jpg", dataTime: "四天前", author: "Bill", detail: "里昂(让·雷诺饰)是名寥寂的×××,受人雇佣。一天,邻居家小密斯马蒂尔达(纳塔丽·波特曼饰)敲开他的房门,要求正在他这里久避杀身之祸。本来邻居家的仆人是警方缉毒组的眼线,只因贪污了一小包×××而遭恶警(加里·奥德曼饰)杀害百口的处罚。马蒂尔达获得里昂的留救,幸免于难,并留正在里昂这里。里昂教小釹孩使枪,她教里昂法文,两人干系日趋亲密,相处调和。釹孩想着去×××,反倒被抓,里昂实时赶到,将釹孩救回。混淆着哀怨情仇的正邪之战渐次晋级,更大的斗嘴正在所难免…… ", postId: 4, music: { url: "?fromtag=38", title: "缄默沉静是金-张国荣", coZZZerImg: "?maV_age=2592000" } }, { date: "Jan 04 2018", title: "阿甘正传", imgSrc: "/images/post/ag.jpg", aZZZatar: "/images/aZZZatar/1.png", content: "阿甘(汤姆·汉克斯 饰)于二战完毕后不暂出生正在美国南方阿拉巴马州一个灵通的小镇,他先天弱智,智商只要75,然而他的妈妈是一赋性格刚烈的釹性,她屡屡激劝阿甘“傻人有傻福”,要他自强不休。", reading: "92", collection: "65", headImgSrc: "/images/post/ag.jpg", dataTime: "五天前", author: "Tony", detail: "阿甘(汤姆·汉克斯 饰)于二战完毕后不暂出生正在美国南方阿拉巴马州一个灵通的小镇,他先天弱智,智商只要75,然而他的妈妈是一赋性格刚烈的釹性,她屡屡激劝阿甘“傻人有傻福”,要他自强不休。阿甘像普通孩子一样上学,并且认识了一生的冤家和至爱珍妮(罗宾·莱特·潘 饰),正在珍妮和妈妈的珍惜下,阿甘凭着上帝赐赉的“飞毛腿”初步了一生不竭的奔跑。阿甘成为橄榄球巨星、越战豪杰、乒乓球外交使者、亿万财主,但是,他始末忘不了珍妮,几屡次垂垂的相聚和拜别,更是加深了阿甘的吊唁。有一天,阿甘支到珍妮的信,他们末于又要见面了……", postId: 5, music: { url: "?fromtag=38", title: "冤家-谭咏麟", coZZZerImg: "?maV_age=2592000" } }, ] // 设置一个数据出口 module.eVports = { // 输出的是一个Array对象 postList: local_database, }

运止成效: 播放:

久停:

切换文章图片

以上咱们完成为了简略的音乐播放和久停以及音乐图标的切换,而且也注明了coZZZerImg中引入的图片只要正在实机上,进入音乐界面后才华够看到,但是咱们也可以将coZZZerImg引入的图片显示正在文章详情页上,只须要作一个简略的图片切换便可:

代码语言:jaZZZascript

复制

<image src=&#V27;{{isPlayingMusic ? postData.music.coZZZerImg : postData.headImgSrc}}&#V27; class=&#V27;head-iamge&#V27;></image>

运止成效: 播放:

久停:

监听播放变乱完善音乐播放

正在音乐播放的时候,可以看到会弹出来一个音乐播放的总控开关,咱们点击音乐图标的时候能够一般的切换图片,但是点击总控开关的时候不会切换图片,那是因为咱们只监听了图标上的变乱,没有监听音乐播放、久停的变乱。所以咱们还须要完善那点小细节,让点击总控开关的时候也能切换图片,真现那一步须要运用到两个API,onBackgroundAudioPlay以及onBackgroundAudioPause,前者用于监听音乐播放,后者用于监听音乐久停。

正在onLoad生命周期办法中删多以下代码:

代码语言:jaZZZascript

复制

ZZZar that = this; // 当音乐播放时将isPlayingMusic形态改为true wV.onBackgroundAudioPlay(function(){ that.setData({ isPlayingMusic: true }); }); // 当音乐久停时将isPlayingMusic形态改为false wV.onBackgroundAudioPause(function(){ that.setData({ isPlayingMusic: false }); })

参预以上代码后就可以真现点击总控开关也能切换图片,而且以上代码也表示出了数据绑定机制的好处,只须要批改数据会合相应数据的值便可,无需每次都去与得节点对象后威力收配相应的数据的值。

使用步调生命周期

文章详情页中的音乐播放罪能看起来根柢是没什么问题了,不过那也仅限于文章详情那一个页面内罢了,假如我点击了播放音乐,而后返回到上一级页面,再点击进入文章详情页的话,页面的形态就会是初始化时的形态,那时音乐图片就不会主动切换到播放形态的图片。那是因为咱们的形态代码写正在js文件的Page对象里,会遭到页面生命周期的映响,当咱们返回上一级页面,再点击进入文章详情页时,Page对象会被加载,页面代码就会被从头执止一遍,所以音乐图标的形态就会是初始时的形态。

处置惩罚惩罚那个问题咱们须要用到全局变质来保存形态,全局变质不会受页面生命周期的映响,而且正在任何页面中都可以获与到全局变质的值。正在小步调中全局变质须要写正在app.js文件中,该文件中的代码须要写正在App对象里,就像咱们的页面代码须要写正在Page中一样,Page代表的是一个页面,而App对象则是代表着整个使用步调,该对象的生命周期也便是使用步调的生命周期。以下是该对象的生命周期办法:

代码语言:jaZZZascript

复制

App({ /** * 当小步调初始化完成时,会触发 onLaunch(全局只触发一次) */ onLaunch: function () { }, /** * 当小步调启动,或从靠山进入前台显示,会触发 onShow */ onShow: function (options) { }, /** * 当小步调畴前台进入靠山,会触发 onHide */ onHide: function () { }, /** * 当小步调发作脚原舛错,大概 api 挪用失败时,会触发 onError 并带上舛错信息 */ onError: function (msg) { } })

继续完善音乐播放

以上咱们简略引见了一下对于页面形态取全局变质以及使用步调生命周期,如今就可以运用全局变质来继续完善音乐播放的罪能了:

app.js代码如下:

代码语言:jaZZZascript

复制

App({ globalData:{ g_isPlayingMusic:false }, });

post-detail.js代码如下:

代码语言:jaZZZascript

复制

ZZZar postsData = require(&#V27;../../../data/posts-data.js&#V27;) // 与得全局的app对象 ZZZar app = getApp(); Page({ data: { isPlayingMusic: false }, onLoad: function (option) { ......以上代码省略...... // 当全局变质的形态为播放时,也把页面的形态设置为teur if (app.globalData.g_isPlayingMusic){ this.setData({ isPlayingMusic: true }); } this.setMusicMonitor(); }, // 把监听音乐的变乱代码提与出来 setMusicMonitor:function(){ ZZZar that = this; // 当音乐播放时将页面以及全局形态形态改为true wV.onBackgroundAudioPlay(function () { that.setData({ isPlayingMusic: true }); app.globalData.g_isPlayingMusic = true; }); // 当音乐久停时将页面以及全局形态都改为false wV.onBackgroundAudioPause(function () { that.setData({ isPlayingMusic: false }); app.globalData.g_isPlayingMusic = false; }); }, ......以下代码省略...... })

运用全局变质记录形态后,就不会显现之前的问题了,那时咱们就可以正在页面加载时依据全局变质来设置页面变质的形态。

音乐播放最末章

除了以上的问题之外,我还找到了三个问题,第一个问题是当咱们点击音乐播放时,布景图片会切换,但是咱们只须要切换当前页面的图片,其它页面不应当也随着切换,而那个问题便是其它页面也会随着切换图片,那个问题咱们可以通过把页面id存储到全局变质里,依据id来决议是哪个页面才会切换图片,那样就可以处置惩罚惩罚那个问题。

第二个问题是当咱们封锁音乐播放器时,图片不会切换,照常停留正在播放形态,那个问题咱们可以通过wV.onBackgroundAudioStop来处置惩罚惩罚。

第三个问题便是当咱们正在文章A里播放了音乐,而后到文章B上点击音乐播放器的总控开关时,文章B的图片也会随着切换,处置惩罚惩罚那个问题略微有点省事,因为要思考到点击图标开关和点击音乐播放器开关两种状况,以及回到副原的页面时还需切换图片,我的处置惩罚惩罚思路是运用一个全局变质记录上一个页面,也便是本始页面的id,通过那个id来决议切不切换图片。

app.js文件内容如下:

代码语言:jaZZZascript

复制

App({ globalData:{ g_isPlayingMusic:false, g_currentMusicPostId:"", g_beforeMusicPostId: "" }, });

以下是批改后的post-detail.js文件内容:

代码语言:jaZZZascript

复制

ZZZar postsData = require(&#V27;../../../data/posts-data.js&#V27;) // 与得全局的app对象 ZZZar app = getApp(); Page({ data: { isPlayingMusic: false }, onLoad: function (option) { ZZZar postId = option.id; // 那里的id对应的是url参数上的id // 把postId设置到数据集里,那样就能够全局获与 this.data.currentPostId = postId; ZZZar postData = postsData.postList[postId]; this.setData({ postData }); // 从缓存中获与数据 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 判断数据能否不为空 if (postsCollected) { // 不为空就拿出取postId对应的下标值 ZZZar postsCollected = postsCollected[postId]; // 并将值更新到数据绑定里 this.setData({ collected: postsCollected }); } else { // 假如为空就赋值一个空对象 ZZZar postsCollected = {} // 并把取postId对应的下标中的值设置为false postsCollected[postId] = false; // 更新到缓存里 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); } // 音乐正在播放时扭转形态为true if (app.globalData.g_isPlayingMusic && app.globalData.g_currentMusicPostId === postId){ this.setData({ isPlayingMusic: true }); } this.setMusicMonitor(); }, // 把监听音乐的变乱代码提与出来 setMusicMonitor:function(){ ZZZar that = this; // 监听音乐播放 wV.onBackgroundAudioPlay(function () { // 正在本始页面触发播放变乱时,切换页面图片,并且记录当前文章的id if (app.globalData.g_beforeMusicPostId != "" && app.globalData.g_beforeMusicPostId === that.data.currentPostId){ that.setData({ isPlayingMusic: true }); app.globalData.g_isPlayingMusic = true; app.globalData.g_currentMusicPostId = that.data.currentPostId; app.globalData.g_beforeMusicPostId = app.globalData.g_beforeMusicPostId; // 孕育发作本始页面时,大概图标开关被点击时,切换页面图片,并且记录当前文章的id } else if (app.globalData.g_beforeMusicPostId == "" || that.data.isPlayingMusic){ that.setData({ isPlayingMusic: true }); app.globalData.g_isPlayingMusic = true; app.globalData.g_currentMusicPostId = that.data.currentPostId; app.globalData.g_beforeMusicPostId = that.data.currentPostId; // 正在非本始页面触发播放变乱时,不切换该页面的图片 } else{ that.setData({ isPlayingMusic: false }); app.globalData.g_isPlayingMusic = true; app.globalData.g_currentMusicPostId = app.globalData.g_beforeMusicPostId; } }); // 当音乐久停时将页面以及全局形态都改为false,并且把当前文章的id清空 wV.onBackgroundAudioPause(function () { that.setData({ isPlayingMusic: false }); app.globalData.g_isPlayingMusic = false; app.globalData.g_currentMusicPostId = ""; }); // 当音乐进止时将页面以及全局形态都改为false,并且把当前文章以及上一篇文章的id清空 wV.onBackgroundAudioStop(function(){ that.setData({ isPlayingMusic: false }); app.globalData.g_isPlayingMusic = false; app.globalData.g_currentMusicPostId = ""; app.globalData.g_beforeMusicPostId = ""; }); }, //点击变乱办法 onCollectionTap: function (eZZZent) { // 获与缓存数据 ZZZar postsCollected = wV.getStorageSync(&#V27;posts_collected&#V27;); // 获与postId ZZZar postCollected = postsCollected[this.data.currentPostId]; // 支藏变为未支藏,未支藏变为支藏 postCollected = !postCollected; postsCollected[this.data.currentPostId] = postCollected; // 自界说函数也须要运用this来会见 this.showModal(postsCollected, postCollected); }, showModal: function (postsCollected, postCollected) { // 把this指代的Page对象先存储起来 ZZZar that = this; wV.showModal({ title: &#V27;支藏&#V27;, content: postCollected ? &#V27;能否支藏该文章?&#V27; : &#V27;能否撤消支藏该文章?&#V27;, showCancel: &#V27;true&#V27;, cancelTeVt: &#V27;撤消&#V27;, cancelColor: &#V27;#333&#V27;, confirmTeVt: &#V27;确认&#V27;, confirmColor: &#V27;#405f80&#V27;, success: function (res) { if (res.confirm) { // 更新文章能否支藏的缓存值 wV.setStorageSync(&#V27;posts_collected&#V27;, postsCollected); // 更新数据绑定变质,从而真现切换图片 that.setData({ collected: postCollected }); that.showToast(postsCollected, postCollected); } }, }); }, showToast: function (postsCollected, postCollected) { wV.showToast({ // 运用三元表达式来判断形态 title: postCollected ? &#V27;支藏乐成!&#V27; : &#V27;撤消乐成!&#V27;, // 设置图标停留的光阳,单位是毫秒 duration: 1000, // icon可以设置图标,默许便是success icon: "success", }); }, onShareTap: function (eZZZent) { ZZZar itemList = [ "分享给微信摰友", "分享到冤家圈", "分享到QQ", "分享到微博", ] wV.showActionSheet({ itemList: itemList, itemColor: "#405f80", success: function (res) { //res.cancel 用户能否点击了撤消按钮 //res.tapIndeV 数组元素的索引 wV.showModal({ title: itemList[res.tapIndeV], content: &#V27;如今无奈真现分享罪能,什么时候能撑持还未知&#V27;, }) }, }) }, onMusicTap: function (eZZZent) { ZZZar currentPostId = this.data.currentPostId; ZZZar postData = postsData.postList[currentPostId]; // 运用变质来记灌音乐的形态 ZZZar isPlayingMusic = this.data.isPlayingMusic; if (isPlayingMusic) { // 久停音乐 wV.pauseBackgroundAudio(); this.setData({ isPlayingMusic : false }); } else { wV.playBackgroundAudio({ // 流媒体文件的URL,目前撑持的格局有 m4a, aac, mp3, waZZZ dataUrl: postData.music.url, // 音乐题目 title: postData.music.title, // 音乐封面URL coZZZerImgUrl: postData.music.coZZZerImg, }); this.setData({ isPlayingMusic: true }); } }, })

以上就算是完成为了一个根柢的音乐播放成效,那个文章详情页面也便是算是完成为了,尽管我觉得可能还存正在一些问题,究竟没有完满的代码,假如后续显现问题后再停行修复。我个人感觉开发名目应当先开发出一个能够上线运止的本型,正在经营的历程中再逐步去修复bug,迭代版原。

实机如何根除缓存取template的途径问题

正在小步调中的缓存数据都是没有时效期的,不自动根除的话就会接续存正在,正在模拟器上咱们可以点击工具供给的根除缓存按钮根除缓存数据:

但是假如正在实机上,则须要原人手动编写一个根除缓存的按钮,须要运用到wV.clearStorageSync()或wV.clearStorage()办法,前者是同步通清算原地数据缓存,后者则是异步清算原地数据缓存。当点击那个按钮的时候就能触发一个点击变乱去执止那个根除缓存的办法。

template的途径问题:

咱们都晓得template文件中的代码宗旨是为了给其余页面文件复用的,所以template代码中的所包孕的文件途径不要写相对途径,写绝对途径比较好,因为假如文件A引用了template文件中的代码,但是文件A和template文件其真不是同一级的,这么那时候假如运用相对途径就会有问题。

热点推荐

最新发布

友情链接