本篇博客继承于微信小程序学习(一)心理测试题库改造,做了一些修改,因与前一篇想法相差太大,所以重新写了一篇。
如无意外,以后的博客写作都会以这种背景、分析、行动、收获的大纲(star法则)去写,我认为这是一种非常好的习惯。
本来上一篇博客结束,我就应该开始自己的正事,开发一个内容向小程序。不会?看课啊!啃文档啊!奈何这个课,以实践项目为主,理论讲得不透彻,看起来太陡峭了。这个开发者文档,详细是很详细,但我串不起来啊!摔!
一筹莫展之际,灵光乍现,我应该去找本书看看啊!打开了自己的学习文件夹,哎?这有一本《微信小程序开发入门与实践》?入门好啊入门好,看了看序章,需要一定的CSS和JavaScript基础?™的,学!
于是,在经历了七天的HTML+CSS+JavaScript基础入门课后,在走马观花看了一遍菜鸟教程后,我又打开了这本书,一泻千里,不能自拔!读书真是件快乐的事情!在云编程到已经能实现多个页面之间交互后,我寻思着也该落地了,OK,就你了!考研力模型!
1、可以用wx:for语法来解决小程序存在着不定长选择题显示错乱的问题
2、想用这个语法,得先有一个符合规则的数组,可能需要整理数据
3、把业务数据放在app.js里有点蠢,直接放在页面的js文件里即可
questions: [
{ "question": "关于学习能力,以下哪种情况最符合你?", "option": { "A": "学习时不知道如何着手,很恐慌", "B": "自己学起来还好或者需要有人辅导和监督", "C": "只要给我资料、视频和书,我全部可以自己学", "D": "我学什么东西都很快,所有考试学一段时间都觉得没问题"}, "score": { "A": -1, "B": 0, "C": 1, "D": 2 } },
{ "question": "关于考研投入,以下哪种情况最符合你?", "option": { "A": "一边找工作/实习,一边考研,或者每天花5小时以下", "B": "正常准备,没课时基本都在复习", "C": "全心投入,平均每天差不多花8小时复习,偶尔放松,放假也如此", "D": "超常投入,平均每天花10个小时左右甚至更久,杜绝考研以外活动" }, "score": { "A": -1, "B": 0, "C": 1, "D": 0 } },
{ "question": "关于心理素质,以下哪种情况最符合你?", "option": { "A": "我害怕考试,每次大考都考得比正常水平差", "B": "考试有些紧张,但基本都能发挥正常水平", "C": "我是考试型选手,越到关键时刻发挥越好" }, "score": { "A": -1, "B": 0, "C": 1 } },
{ "question": "关于本科院校,以下哪种情况最符合你?", "option": { "A": "专科院校", "B": "二三本院校", "C": "一本院校", "D": "211院校", "E": "985院校", "F": "顶尖985院校" }, "score": { "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6 } }
]
结构和上次的一样,不用修改。从app.js里挪到了study.js,直接放同一个文件里连名字都写得短点2333
也不用去getApp了,因为不用获取全局对象app
<view>
<text>{{nowindex+1}}、{{nowquestion.question}}text>
view>
<block wx:for="{{nowquestion.option}}">
<view class="weui-cell weui-cell_access" hover-class="weui-cell_active" bindtap="next" data-chosen="{{index}}">
<text>{{index}}、{{item}}text>
view>
block>
主要就两个组件,view和block,分别包裹着问题和选项
核心句子wx:for="{{array}}",表明这个组件和一个数组绑定了,它会以数组的长度进行复制,并且通过item来引用数组元素。官方文档——
在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。
下面的选项,用item来引用选项,index是索引。这两个名字都是默认的,修改索引值和子项名详见开发者文档1
要注意变量一定不能写错,否则出现页面空白但又不报错的情况,抓狂。
next: function(e) {
var ans = e.currentTarget.dataset.chosen;
console.log(e)
this.data.nowscore = this.data.nowscore + this.data.questions[this.data.nowindex].score[ans];
console.log("tap success!", this.data.nowindex + 1, ans, this.data.nowscore)
if (this.data.nowindex + 1 == 4) {
wx.redirectTo({
url: '/pages/result/result?sum=' + this.data.nowscore,
})
} else {
this.setData({
nowindex: this.data.nowindex + 1,
})
this.setData({
nowquestion: this.data.questions[this.data.nowindex]
})
}
},
onLoad: function() {
this.setData({
nowquestion: this.data.questions[this.data.nowindex]
})
},
这里相对于上次其实没有什么实质性的改动,就是把变量名字换了一下,然后onLoad函数里增加了数据初始化(因为和wxml绑定了数据)。再就是代码逻辑,if (this.data.nowindex + 1 == 4)
是为了避免nowindex=4时,先加一再判定导致wxml里出现第5题的bug。
碰到一个问题,如果数据更新部分这么写就会出错——
this.setData({
nowindex: this.data.nowindex + 1,
nowquestion: this.data.questions[this.data.nowindex]
})
不知道为什么,难道是因为下面的变量又用到了nowindex所以冲突了?2
这次收获还蛮大的,毕竟也算是有了一点基础,很多东西开始看得明白了,用一句诗来形容就是
向来枉费推移力,此日中流自在行
收获主要有以下几点:
funcName : function(e){
var theVar = e.currentTarget.dataset.varName;
...
},
当然,也是会有疑惑的
然后是填坑,上一次的问题大部分都能解答了哈哈哈
微信开放文档·列表渲染 ↩︎
微信开放文档·setData ↩︎