百度答題小程序入口在哪(百度答題小程序入口官網(wǎng))
手把手教你搭建答題活動小程序系列文章,第一階段為界面設(shè)計篇,分別描寫了如何搭建答題小程序界面。
現(xiàn)在已經(jīng)進(jìn)入第二階段,功能交互篇。而上一篇文章描寫了,如何用云開發(fā)實現(xiàn)查詢題庫功能。其實說白了就是相當(dāng)于,前后端分離架構(gòu)中的異步請求。
這一篇緊接著上一篇,聊聊用云開發(fā)實現(xiàn)查詢題庫功能后要做的事情。通俗來說,就是拿到題目數(shù)據(jù)后,接著要干什么。
軟件架構(gòu):微信原生小程序+云開發(fā)
戳 源碼地址,獲取源碼,版本持續(xù)迭代中…
聊聊用戶體驗
這里先插個題外話。
用戶體驗好不好,真的重要嗎?如何做好答題小程序的用戶體驗?zāi)兀?/span>
我問你一句,你敢答應(yīng)嗎,第一個問題留給你來思考一下。我來聊聊第二個問題,我個人認(rèn)為,從做好一個個的界面交互細(xì)節(jié)開始。
舉個栗子,就拿我這個答題小程序,項目里的其中一個界面交互細(xì)節(jié),來簡要聊聊吧。
1)看,首先還是快速看一下官網(wǎng)技術(shù)文檔:
wx.showLoading(Object object)顯示 loading 提示框;
wx.hideLoading(Object object)隱藏 loading 提示框;
2)用,我使用了上述的小程序原生的API,具體使用聚焦到發(fā)送異步請求的函數(shù):
// 獲取題庫
getQuestionList() {
// 顯示 loading 提示框
wx.showLoading({
title: '拼命加載中'
});
// 發(fā)起請求
activityQuestion.where({
true: _.exists(true)
})
.get()
.then(res => {
// 隱藏 loading 提示框
wx.hideLoading();
})
}
當(dāng)獲取數(shù)據(jù)的時候,這個加載提示是在告訴用戶,題目數(shù)據(jù)正在加載中,請耐心等待一下,很快就好了。
// 顯示 loading 提示框
wx.showLoading({
title: '拼命加載中'
});
當(dāng)數(shù)據(jù)獲取成功后,就隱藏這各提示,相當(dāng)于告訴用戶,好了,你可以開始做題了。
// 隱藏 loading 提示框
wx.hideLoading();
言歸正傳
拿到數(shù)據(jù)后要干什么?如何做?
實現(xiàn)動態(tài)數(shù)據(jù)綁定,其實,概括起來就三步走:
1)先通過 Collection.get 來獲取題庫集合里的題目數(shù)據(jù);
2)再使用setData函數(shù)將題目數(shù)據(jù)從邏輯層發(fā)送到視圖層;
3)再Mustache 語法(雙大括號)將變量包起來,實現(xiàn)動態(tài)數(shù)據(jù)綁定。
界面演示
1)獲取數(shù)據(jù)

2)同步更新

3)填充到答題界面

源碼解讀
數(shù)據(jù)綁定
test.js
Page({
/**
* 頁面的初始數(shù)據(jù)
*/
data: {
questionList: [], // 題目列表
index: 0 // 當(dāng)前題目索引
}
})
test.wxml
<view class="page">
<view class="padding-top text-center">
第<text class="text-bold text-xl">{{index+1}}</text>題
共<text class="text-bold text-xl">{{questionList.length}}</text>題
</view>
<view class='page__hd padding'>
<view class="page__title">
<text class="text-bold">【單選題】</text>
{{questionList[index].question}}
</view>
</view>
<view class="page__bd">
<radio-group class="radio-group">
<label class="radio my-choosebox" wx:for="{{questionList[index].option}}" wx:for-index="key" wx:for-item="value" wx:key="index">
<radio value="{{key}}" checked="{{questionList[index].checked}}" />
<text class="margin-left-xs">{{value}}</text>
</label>
</radio-group>
</view>
<view class='page_ft flex padding flex-direction'>
<button class="cu-btn bg-red round lg" wx:if="{{index == questionList.length-1}}">提交</button>
<button class="cu-btn bg-red round lg" wx:else>下一題</button>
</view>
<view class="mw-weixin text-center text-gray padding-top">
<text class="icon-weixin"></text> meng674782630
</view>
</view>
WXML 中的動態(tài)數(shù)據(jù)均來自對應(yīng) Page 的 data。
其中,wx:for實現(xiàn)列表渲染:
<label class="radio my-choosebox" wx:for="{{questionList[index].option}}" wx:for-index="key" wx:for-item="value" wx:key="index">
<radio value="{{key}}" checked="{{questionList[index].checked}}" />
<text class="margin-left-xs">{{value}}</text>
</label>
其中,wx:if和wx:else實現(xiàn)條件渲染:
<button class="cu-btn bg-red round lg" wx:if="{{index == questionList.length-1}}">提交</button>
<button class="cu-btn bg-red round lg" wx:else>下一題</button>
更新視圖
setData 函數(shù)用于將數(shù)據(jù)從邏輯層發(fā)送到視圖層(異步),同時改變對應(yīng)的 this.data 的值(同步)。
activityQuestion.where({
true: _.exists(true)
})
.get()
.then(res => {
let data = res.data || [];
// 將數(shù)據(jù)從邏輯層發(fā)送到視圖層,通俗的說,也就是更新數(shù)據(jù)到頁面展示
this.setData({
questionList:data,
index: 0
});
})
注意:
- 直接修改 this.data 而不調(diào)用 this.setData 是無法改變頁面的狀態(tài)的,還會造成數(shù)據(jù)不一致。
- 僅支持設(shè)置可 JSON 化的數(shù)據(jù)。
- 單次設(shè)置的數(shù)據(jù)不能超過1024kB,請盡量避免一次設(shè)置過多的數(shù)據(jù)。
- 請不要把 data 中任何一項的 value 設(shè)為 undefined ,否則這一項將不被設(shè)置并可能遺留一些潛在問題。

如若轉(zhuǎn)載,請注明出處:http://www.qjsdgw.cn/74397.html