微信小程序刷題邏輯實現:技術揭秘與實踐分享

頁面展示:

在這里插入圖片描述

概述

在當今數字化學習的浪潮中,微信小程序以其便捷性和實用性,成為了眾多學習者刷題備考的得力工具。今天,我們就來深入剖析一個微信小程序刷題功能的實現邏輯,從代碼層面揭開其神秘面紗。

小程序界面布局

1. 自定義頂部導航

在小程序的頂部,我們設置了一個自定義導航欄,方便用戶進行頁面跳轉。代碼如下:

<!--自定義頂部導航 start-->
<view class="top-nav"><t-icon bind:click="toLastPage" class="icon" name="chevron-left" size="50rpx" />
</view>
<!--自定義頂部導航 end-->

這里使用了 t-icon 組件,當用戶點擊向左箭頭圖標時,會觸發 toLastPage 方法,實現返回上一頁的功能。

2. 頂部信息展示

頂部區域還展示了題庫名稱和當前題目的類型:

<!--頂部 start-->
<view class="top"><view class="left"><view class="title">{{questionBankName}}</view></view><view class="right">{{questionList[currentIndex].questionType}}</view>
</view>
<!--頂部 end-->

通過 questionBankName 顯示題庫名稱,questionList[currentIndex].questionType 顯示當前題目的類型。

3. 題目內容展示

這是刷題的核心區域,顯示題目內容和選項:

<!--題目內容 start-->
<view class="content"><view class="title">{{questionList[currentIndex].questionContent}}</view><view class="option-list"><view class="option   {{questionList[currentIndex].isDone ? (questionList[currentIndex].selectedOptionValue === questionList[currentIndex].questionAnswer ? (index === selectedOption ? 'option-right' : '') : (index === selectedOption ? 'option-wrong' : '')) : ''}}" wx:for="{{questionList[currentIndex].questionOptionsJSON}}" wx:key="*this" bindtap="handleOptionClick" data-index="{{index}}">{{item}}</view></view>
</view>
<!--題目內容 end-->

這里使用 wx:for 指令遍歷題目選項,用戶點擊選項時會觸發 handleOptionClick 方法。同時,根據題目是否已做以及答案是否正確,動態添加不同的樣式類,如 option-rightoption-wrong

4. 底部功能欄

底部功能欄提供了一些常用操作,如上下題切換、標記題目等:

<!--底部 start-->
<view class="bottom"><view class="function-list"><view class="function-item" wx:for="{{ bottomFunctionList }}" wx:for-item="item" wx:for-index="id" wx:key="id"><van-icon bindtap="{{item.tap}}" class="icon" name="{{item.icon}}" /><view class="text">{{item.text}}</view></view></view>
</view>
<!--底部 end-->

使用 wx:for 遍歷 bottomFunctionList 數組,根據數組中的配置顯示不同的圖標和文字,點擊圖標會觸發相應的方法。

5. 選項卡彈出框

選項卡彈出框用于快速切換題目:

<!--選項卡彈出框 start-->
<t-popup visible="{{bottomChoiceShow}}" placement="bottom"><view class="prop-choice"><view class="prop-top"><van-icon bindtap="bottom_choice_close" class="icon" name="arrow-down" /><view class="title">選題卡</view></view><view class="prop-content"><view class="button-list"><t-button  bindtap="choice_quetion" data-id="{{id}}" wx:for="{{ questionList }}" wx:for-item="item" wx:for-index="id" wx:key="id" class="button" theme="{{item.isDone?(item.selectedFlag?'primary':'danger'):'light'}}" size="small">{{id+1}}</t-button></view></view></view>
</t-popup>
<!--選項卡彈出框 end-->

點擊相應按鈕可打開或關閉彈出框,點擊題目按鈕會切換到對應的題目。

小程序邏輯實現

1. 數據初始化

onLoad 方法中,我們進行了數據的初始化操作:

onLoad(options1) {//初始化數據this.setData({bottomFunctionList: bottomFunctionList_data, //底部功能userId: wx.getStorageSync('userId'), //獲取用戶idquestionBankId: wx.getStorageSync('questionBankId'), //題庫idquestionBankName: wx.getStorageSync('questionBankName'), //題庫名稱})//mock數據if (mock_flag) {const questionListWithStatus = questionList_mock.map(question => ({...question,questionOptionsJSON: JSON.parse(question.questionOptions), //序列化選項isDone: false, //是否做過selectedOptionValue: null, //選擇的答案selectedFlag: '', //對錯}));this.setData({questionList: questionListWithStatus,});}//網絡請求if (!mock_flag) {this.http_question_findAllByQuestionBankId() //題目列表}
}

這里從本地存儲中獲取用戶和題庫信息,根據 mock_flag 的值決定是使用模擬數據還是進行網絡請求獲取題目列表。

2. 題目操作邏輯

  • 上下題切換:通過 bottom_prebottom_next 方法實現上下題的切換:
// 上一題
bottom_pre() {if (this.data.currentIndex > 0) {this.setData({currentIndex: this.data.currentIndex - 1});}
}
// 下一題
bottom_next() {if (this.data.currentIndex < this.data.questionList.length - 1) {this.setData({currentIndex: this.data.currentIndex + 1});}
}
  • 選項點擊處理:用戶點擊選項時,會觸發 handleOptionClick 方法,該方法會記錄用戶選擇的選項,并調用 submitAnswer 方法提交答案:
//當前點擊的選項
handleOptionClick(e) {this.setData({selectedOption:e.currentTarget.dataset.index})//設置選中的選項this.data.questionList[this.data.currentIndex].selectedOptionValue = this.data.questionList[this.data.currentIndex].questionOptionsJSON[e.currentTarget.dataset.index]//提交答案this.submitAnswer()
}
  • 答案提交與判斷submitAnswer 方法會判斷用戶是否選擇了選項,若選擇了則標記題目為已做,并判斷答案的對錯:
//提交答案
submitAnswer() {if (this.data.selectedOption !== null) {//標記題目為已做this.markQuestionAsDone()//判斷對錯if (this.data.questionList[this.data.currentIndex].selectedOptionValue === this.data.questionList[this.data.currentIndex].questionAnswer) {//設置對錯為對this.data.questionList[this.data.currentIndex].selectedFlag=trueif (!mock_flag) {//積分+1}} else {if (!mock_flag) {//加入錯題集,增加次數this.http_userWrongQuestion_add()}}} else {wx.showToast({title: '請先選擇一個選項',icon: 'none'});}
}

3. 網絡請求

  • 獲取題目列表:通過 http_question_findAllByQuestionBankId 方法根據題庫 ID 獲取所有題目:
//根據題庫id查詢所有題目
http_question_findAllByQuestionBankId() {getRequest(baseUrl + "/front/question/findAllByQuestionBankId", {questionBankId: this.data.questionBankId}).then(res => {if (res.code == 200) {const questionList = res.data.map(question => ({...question,questionOptionsJSON: JSON.parse(question.questionOptions), //序列化選項isDone: false, //是否做過selectedOptionValue: null, //選擇的答案selectedFlag: '', //對錯}));this.setData({questionList: questionList,})}})
}
  • 加入錯題集:通過 http_userWrongQuestion_add 方法將錯題加入錯題集:
//加入錯題集,增加次數
http_userWrongQuestion_add() {postRequest(baseUrl + "/front/userWrongQuestion/add", {userId: this.data.userId,questionId: this.data.questionList[this.data.currentIndex].questionId}).then(res => {if (res.code == 200) {}})
}

總結

通過以上代碼和邏輯的實現,我們完成了一個簡單的微信小程序刷題功能。從界面布局到數據初始化,再到題目操作和網絡請求,每個環節都緊密配合,為用戶提供了一個流暢的刷題體驗。希望這篇文章能幫助你更好地理解微信小程序刷題邏輯的實現,如果你有相關需求,不妨參考這些代碼進行開發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898008.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM--垃圾回收

垃圾回收的概念 垃圾回收主要針對的是堆中的對象&#xff0c;堆是一個共享的區域&#xff0c;創建的對象和數組都放在這個位置。但是我們不能一直的創建對象&#xff0c;也不是所有的對象能一直存放&#xff0c;如果不進行垃圾回收&#xff0c;內存遲早會耗盡&#xff0c;及時…

【教程】繼承中的訪問控制 C++

目錄 簡介public&#xff0c;protected 和 private繼承中的 public&#xff0c;protected 和 private示例 簡介 在 C 中派生類可以通過 public&#xff0c;protected 和 private 三種修飾符決定基類成員在派生類中的訪問級別 public&#xff0c;protected 和 private 公有成…

【2025】基于python+django的駕校招生培訓管理系統(源碼、萬字文檔、圖文修改、調試答疑)

課題功能結構圖如下&#xff1a; 駕校招生培訓管理系統設計 一、課題背景 隨著機動車保有量的不斷增加&#xff0c;人們對駕駛技能的需求也日益增長。駕校作為駕駛培訓的主要機構&#xff0c;面臨著激烈的市場競爭和學員需求多樣化等挑戰。傳統的駕校管理模式往往依賴于人工操作…

要登錄的設備ip未知時的處理方法

目錄 1 應用場景... 1 2 解決方法&#xff1a;... 1 2.1 wireshark設置... 1 2.2 獲取網口mac地址&#xff0c;wireshark抓包前預過濾掉自身mac地址的影響。... 2 2.3 pc網口和設備對接... 3 2.3.1 情況1&#xff1a;... 3 2.3.2 情…

一.ffmpeg打開麥克風,錄制音頻并重采樣

一.windows windows下使用msys編譯ffmpeg&#xff0c;先編譯libx264和libx265&#xff0c;然后編譯ffmpeg的時候需要添加這兩個庫的路徑才能--enable&#xff1b;為什么ffplay--enable了還是沒有呢&#xff0c;仔細看編譯打印&#xff0c;可能剛有一段報錯提示SDL找不到&#…

go 安裝swagger

1、依賴安裝&#xff1a; # 安裝 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安裝 gin-swagger 和 swagger 文件的依賴 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、測試 cmd中輸入&#xff1a; swag -v 如果…

網絡安全反滲透 網絡安全攻防滲透

網絡滲透防范主要從兩個方面來進行防范&#xff0c;一方面是從思想意識上進行防范&#xff0c;另一方面就是從技術方面來進行防范。 1.從思想意識上防范滲透 網絡攻擊與網絡安全防御是正反兩個方面&#xff0c;縱觀容易出現網絡安全事故或者事件的公司和個人&#xff0c;在這些…

java泛型通配符?及上下界(extends,super)保證安全性、靈活性、可讀性

在 Java 中&#xff0c;泛型通配符&#xff08;?&#xff09;用于表示未知類型&#xff0c;通常用于增強泛型的靈活性。通配符可以與上下限結合使用&#xff0c;以限制泛型的范圍。以下是通配符及上下限的使用示例&#xff1a; 1. 無界通配符 (?) 無界通配符表示可以接受任意…

技術視界|構建理想仿真平臺,加速機器人智能化落地

在近期的 OpenLoong 線下技術分享會 上&#xff0c;松應科技聯合創始人張小波進行了精彩的演講&#xff0c;深入探討了仿真技術在機器人智能化發展中的關鍵作用。他結合行業趨勢&#xff0c;剖析了現有仿真平臺的挑戰&#xff0c;并描繪了未來理想仿真系統的設計理念與實現路徑…

uniapp-x 之useAttrs只讀

數據類型&#xff1a; useAttrs在web端拿到的是obj&#xff0c;app拿到的是map 是否可以修改內部元素&#xff1a; 否&#xff0c;只讀 這意味著你想這樣寫代碼將會無效 let attrsuseAttrs();console.log("attrs",attrs, attrs instanceof Map)//appif(attrs ins…

Python 正則表達式模塊 re

Python 正則表達式模塊 re flyfish 一、正則表達式基礎 1. 什么是正則表達式&#xff1f; 正則表達式&#xff08;Regular Expression, RE&#xff09;是一種用于匹配、查找和替換文本模式的工具&#xff0c;由普通字符&#xff08;如字母、數字&#xff09;和特殊字符&…

【商城實戰(33)】解鎖版本迭代與更新策略

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

環境配置 | 5分鐘極簡Git入門:從零上手版本控制

你是否剛接觸Git&#xff1f;別擔心&#xff01;這篇指南將用最簡單的步驟帶你掌握Git核心操作&#xff0c;快速開啟版本控制之旅&#xff01;? 1.git在win10上的下載安裝 1.1.下載git 打開官方網站 Git - Downloadshttps://git-scm.com/downloads ? ?? 1.2.git安裝 …

計算機網絡——DNS

一、什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09; 是互聯網的核心服務&#xff0c;負責將人類可讀的域名&#xff08;如 www.baidu.com&#xff09;轉換為機器可識別的 IP地址&#xff08;如 14.119.104.254&#xff09;。它像一…

SQLark 實戰 | 如何從Excel、csv、txt等外部文件進行數據導入

數據導入導出是應用開發者在平時開發中最常用的操作之一&#xff0c;SQLark 里提供了方便的圖形化界面來完成導入導出。本文先和大家分享如何從 Excel、csv、txt 等外部文件導入數據到數據庫表中。 &#x1f449; 前往 SQLark 官網&#xff1a;www.sqlark.com 下載全功能免費版…

docker無法正常拉取鏡像問題的解決

目錄 1.前言 2.解決方案 1.前言 安裝docker后拉取鏡像&#xff0c;遇見了如下問題&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whil…

k8s系統學習路徑

學習 Kubernetes&#xff08;K8s&#xff09;需要循序漸進&#xff0c;結合理論知識和實踐操作。以下是學習 Kubernetes 的推薦步驟&#xff1a; 1. 先決條件 ? 掌握容器基礎&#xff1a;先學習 Docker&#xff0c;理解容器化概念&#xff08;鏡像、容器、倉庫&#xff09;、…

@RequestParam、@RequestBody、@PathVariable

1. RequestParam RequestParam&#xff1a;get請求時如果用不到它的3個屬性&#xff0c;可以省略&#xff1b;其他請求如果是通過param傳送數據&#xff0c;必須使用該注釋 要點&#xff1a; 可用于任何類型的請求&#xff08;get請求數據在請求行中&#xff0c; post請求數據…

麒麟系統利用pycharm生成deb文件

在麒麟系統&#xff08;Kylin OS&#xff09;上使用 PyCharm 進行 Python 開發并生成 .deb 可安裝軟件包&#xff0c;可以按照以下步驟進行操作&#xff1a; 1. 準備工作 安裝 PyCharm&#xff1a;確保已經在麒麟系統上安裝了 PyCharm&#xff0c;可以使用官方提供的安裝包進…

微信小程序接入DeepSeek模型(火山方舟),并在視圖中流式輸出

引言&#xff1a; DeepSeek&#xff0c;作為一款先進的自然語言處理模型&#xff0c;以其強大的文本理解和生成能力著稱。它能夠處理復雜的文本信息&#xff0c;進行深度推理&#xff0c;并快速給出準確的回應。DeepSeek模型支持流式處理&#xff0c;這意味著它可以邊計算邊輸…