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.
		
		
		
		
		
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.1 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 () {
 | |
| 	uni.showModal({
 | |
| 		content: '确定要提交答案?',
 | |
| 		confirmText: '提交',
 | |
| 		cancelText: '放弃',
 | |
| 		success: () => {
 | |
| 			const params = {
 | |
| 				studentanswer: selectOpts.value.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>
 |