You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.0 KiB
Vue

<template>
<view class="i-clicker-page">
<ch-nav-bar title="答题器" :height="66" :rightWidth="120">
<template v-slot:right>
<uni-icons class="handle-icon" type="reload" size="56" color="#fff" @tap="refresh"/>
<uni-icons class="handle-icon" type="checkmarkempty" size="56" color="#fff" @tap="submitAnswer"/>
</template>
</ch-nav-bar>
<ch-empty emptyText="暂无答题任务" v-if="!options.length"></ch-empty>
<ch-flex class="answer-options" justify="around" items="center" @tap.native="selectOpt" v-else>
<block v-for="option in options" :key="option.id">
<view class="option" :class="{ 'selected': selectOpts.includes(option.text) }" :data-opt="option">
{{ option.text }}
</view>
</block>
</ch-flex>
</view>
</template>
<script setup>
import { getIClickerData, submitIClickerData } from '@/api/iClicker.js'
import { reactive, toRefs } from 'vue';
import { useUserStore } from '../../store/user';
const defaultOptions = [
{
id: '001',
text: 'A'
},
{
id: '002',
text: 'B'
},
{
id: '003',
text: 'C'
},
{
id: '004',
text: 'D'
},
]
const userStore = useUserStore();
const userId = userStore.userId;
const data = reactive({
options: [...defaultOptions],
selectOpts: []
})
const { options, selectOpts } = toRefs(data);
function selectOpt (e) {
const opt = e.target.dataset.opt || null;
if (!opt) return;
const index = selectOpts.value.findIndex(text => text == opt.text)
selectOpts.value = index == -1 ? [...selectOpts.value, opt.text]
: selectOpts.value.filter(text => text!== opt.text)
}
function submitAnswer () {
const params = {
studentanswer: selectOpts.value.sort().join(','),
studentid: userId
}
submitIClickerData(params).then(res => {
uni.showToast({
icon: 'success',
title: '已提交'
})
refresh();
}).catch(() => {
uni.showToast({
icon:'error',
title: '提交失败'
})
})
}
function refresh () {
selectOpts.value = [];
}
</script>
<style lang="scss" scoped>
@import './IClicker.scss'
</style>