import { Tag, Image, Button } from 'vant'; import { computed, defineComponent, nextTick, onMounted, PropType, reactive, watch } from 'vue'; import { AnswerType, labelOptions, QuestionType } from '../../unit'; import Draggable from 'vuedraggable'; import styles from './index.module.less'; import AnserTitle from '../anser-title'; import AnswerAnalysis from '../answer-analysis'; // 单选和多选题 export default defineComponent({ name: 'choice-question', props: { value: { type: Array, default: () => [] }, index: { // 题目是第几道 type: Number, default: 1 }, data: { type: Object, default: () => ({}) }, /* 只读 */ readOnly: { type: Boolean, default: false }, showRate: { // 是否显示答题的正确率 type: Boolean, default: false }, showAnalysis: { // 是否显示解析 type: Boolean, default: false }, analysis: { type: Object, default: () => ({ message: '', topic: false, // 是否显示结果 userResult: true // 用户答题对错 }) } }, emits: ['update:value'], setup(props, { emit, slots }) { const state = reactive({ domId: 'draggableContainer' + +new Date(), drag: false, sortable: null as any, list: [] as any, options: [] as any, alst: [] as any }); // 返回选中的结果 const onSelect = () => { const list = state.list || []; const result: any = []; list.forEach((item: any, index: number) => { // console.log(item, 'item') result.push({ answerId: item.answerId, answer: item.answer, answerExtra: index + 1 }); }); emit('update:value', result); }; // 修改题目逻辑 const onSelectAnswer = (item: any) => { // 判断是否已经选中了 if (item.checked || props.readOnly) return; const result: any = []; // console.log(state.options, 'state.options') state.options.forEach((option: any, index: any) => { // console.log(option, '------') result.push({ answerId: option.index, answer: option.leftValue, answerExtra: index + 1 }); }); result.push({ answerId: item.examinationQuestionAnswerId, answer: item.questionAnswer, answerExtra: state.list.length + 1 }); state.list.push({ answerId: item.examinationQuestionAnswerId, answer: item.questionAnswer, answerExtra: state.list.length + 1 }); emit('update:value', result); nextTick(() => { initOptions(); }); }; const answers = computed(() => { const list: any = props.data.answers || []; const value: any = props.value || []; // console.log(value, 'answer') list.forEach((item: any) => { const tempIndex = value.findIndex( (c: any) => c.answerId === item.examinationQuestionAnswerId ); // if (tempIndex !== -1) { item.checked = tempIndex !== -1 ? true : false; // } }); return list; }); const initOptions = () => { const answers = props.data.answers || []; const userAnswer = props.data.userAnswer || []; // 用户填写的答案 // console.log(answers, userAnswer) // state.options = [] nextTick(() => { if (userAnswer.length > 0) { const tempList: any = []; userAnswer.forEach((answer: any, index: any) => { const rightOption = answers.find( (child: any) => answer.answerId === child.examinationQuestionAnswerId ); const rightValue = answers.find( (child: any) => answer.answerExtra == child.questionExtra ); const tmp = { itemIndex: index, index: answer.answerId, // 左边的值 leftValue: answer.answer, // 左边的值 rightValue: answer.answerExtra, // 右边的值 leftType: rightOption ? rightOption.questionAnswerTypeCode || 'TXT' : 'TXT', // 左边类型 rightType: rightOption ? rightOption.questionExtraTypeCode || 'TXT' : 'TXT', // 右边类型 rightIndex: rightValue ? rightValue.examinationQuestionAnswerId : '' }; // state.options.push(tmp) tempList.push(tmp); }); state.options = tempList; } // console.log(props.data, 'data'); }); }; watch( () => state.options, () => { const list = state.options || []; const result: any = []; list.forEach((item: any, index: number) => { result.push({ answerId: item.index, answer: item.leftValue, answerExtra: index + 1 }); }); emit('update:value', result); } ); onMounted(() => { initOptions(); }); return () => ( <>
{slots.title && slots.title()} {/* 标题 */}
{answers.value.map((item: any, index: number) => (
onSelectAnswer(item)}>
{labelOptions[index + 1]}. {item.questionAnswerTypeCode === AnswerType.IMAGE && (
)} {item.questionAnswerTypeCode === AnswerType.TXT && (
{item.questionAnswer}
)}
))}
我的回答(可拖拽调整顺序)
{props.readOnly ? ( state.options.map((item: any) => (
{item.leftType === AnswerType.TXT && ( {item.leftValue} )} {item.leftType === AnswerType.IMAGE && ( )}
)) ) : ( {{ item: (element: any) => { const item = element.element; return (
{item.leftType === AnswerType.TXT && ( {item.leftValue} )} {item.leftType === AnswerType.IMAGE && ( )}
); } }}
)}
{props.showAnalysis && ( )} ); } });