医学道
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
video/src/components/topic/multi.tsx

101 lines
3.0 KiB

import {FC, useCallback, useEffect, useState} from "react";
import {Checkbox, CheckboxGroup, Radio, RadioGroup, Text, View} from "@tarojs/components";
import './topic.scss'
interface Props {
data: Multi
onAnswer: (isAnswer: boolean) => void
validate: boolean
}
const Multi: FC<Props> = ({data, onAnswer, validate}) => {
const [rightAnswer, setRightAnswer] = useState<string[]>([]) //答案
const rightKey = data?.right_answer?.split(',') || [] // 正确答案数组
const [error, setError] = useState(false)
const answers = [
{value: "A", title: data.answerA},
{value: "B", title: data.answerB},
{value: "C", title: data.answerC},
{value: "D", title: data.answerD},
]
function RadioChange(e) {
const value = e.detail.value
setRightAnswer([value])
}
const changeCheckbox = useCallback((value: string) => {
const index = rightAnswer.indexOf(value)
if (index === -1) {
setRightAnswer([...rightAnswer, value])
} else {
const oldRightAnswer: string[] = JSON.parse(JSON.stringify(rightAnswer))
oldRightAnswer.splice(index, 1)
setRightAnswer(oldRightAnswer)
}
}, [rightAnswer])
useEffect(() => {
if (validate) {
if (rightAnswer.length !== rightKey.length) {
onAnswer(false)
setError(false)
} else {
const isAnswer = rightAnswer.reduce((pre, cut) => {
if (!pre) {
return false
}
return rightKey.indexOf(cut) !== -1
}, true)
onAnswer(isAnswer)
setError(!isAnswer)
}
}
}, [validate])
return (
<View className='topic'>
<View className='mb-3'>
<Text className='topicType'>{data.type ? "多选题" : '单选题'}</Text>
<Text>{data.question}</Text>
</View>
<View>
{data.type ? <CheckboxGroup>
{answers.map(d => <Checkbox
onClick={() => changeCheckbox(d.value)}
key={d.value}
value={d.value}
className='option'
disabled={validate}
checked={rightAnswer.includes(d.value)}
>
<Text className='title'>{d.value}{d.title}</Text>
</Checkbox>)}
</CheckboxGroup>
: <RadioGroup onChange={RadioChange}>
{answers.map(d => <Radio
key={d.value}
value={d.value}
className='option'
color={validate ? rightKey.includes(d.value) ? '#45d4a8' : 'red' : '#45d4a8'}
disabled={validate ? !rightAnswer.includes(d.value) : false}
>
<Text className='title'>{d.value}{d.title}</Text>
</Radio>)}
</RadioGroup>
}
</View>
{error && <View className='mt-3'>
<View className='right_answer'>{data.right_answer}</View>
<View className='font-weight my-3'></View>
<View>{data.analysis}</View>
</View>}
</View>
)
}
export default Multi