Files
2026-09-24 16:25:22 +08:00

81 lines
1.9 KiB
Plaintext

/**
* 答题状态(顺序练习 / 答题卡共用)
* 用 reassign 方式更新数组,保证 uvue 下响应式可靠触发。
*/
import { reactive } from 'vue'
import { quizQuestions } from '@/mock/index.uts'
export type HrQuizState = {
/** 每题已选选项下标,-1 表示未作答 */
answers : number[]
/** 是否标记 */
marked : boolean[]
/** 当前题号(从 0 开始) */
current : number
/** 是否已交卷 */
submitted : boolean
}
function emptyAnswers() : number[] {
const arr : number[] = []
for (let i = 0; i < quizQuestions.length; i++) { arr.push(-1) }
return arr
}
function emptyMarks() : boolean[] {
const arr : boolean[] = []
for (let i = 0; i < quizQuestions.length; i++) { arr.push(false) }
return arr
}
export const quizState = reactive({
answers: emptyAnswers(),
marked: emptyMarks(),
current: 0,
submitted: false
} as HrQuizState)
/** 设置某题答案 */
export function setAnswer(index : number, option : number) : void {
const arr : number[] = []
for (let i = 0; i < quizState.answers.length; i++) {
arr.push(i == index ? option : quizState.answers[i])
}
quizState.answers = arr
}
/** 切换标记 */
export function toggleMark(index : number) : void {
const arr : boolean[] = []
for (let i = 0; i < quizState.marked.length; i++) {
arr.push(i == index ? !quizState.marked[i] : quizState.marked[i])
}
quizState.marked = arr
}
/** 已答数量 */
export function answeredCount() : number {
let n = 0
for (let i = 0; i < quizState.answers.length; i++) {
if (quizState.answers[i] >= 0) { n++ }
}
return n
}
/** 标记数量 */
export function markedCount() : number {
let n = 0
for (let i = 0; i < quizState.marked.length; i++) {
if (quizState.marked[i]) { n++ }
}
return n
}
/** 重置 */
export function resetQuiz() : void {
quizState.answers = emptyAnswers()
quizState.marked = emptyMarks()
quizState.current = 0
quizState.submitted = false
}