一,设置答题器选项
import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' import _ from 'lodash' import CloseButtonSmall from '../CloseButtonSmall' import LargeButton from '../LargeButton' import CancelButton from '../CancelButton' import OptionSettings from '../OptionSettings' import './index.less' /** * 答题设置组件 * * @param {*} props * @returns */ function AnswererSettings(props) { const { style, onConfirm, onClose } = props const wrapperStyle = _.assign({}, style) const [selectedCount, setSelectedCount] = useState(2) const [isShowLimitTip, setIsShowLimitTip] = useState(false) const minOptionCount = 2 useEffect(() => { const tipTimeout = setTimeout(() => { setIsShowLimitTip(false) }, 3000) return () => { clearTimeout(tipTimeout) } }, [isShowLimitTip]) const handleSelectOption = (optionCount) => { setSelectedCount(optionCount) } const handleSelectMinOption = (optionCount) => { setIsShowLimitTip(true) setSelectedCount(optionCount) } const handleConfirm = () => { onConfirm(selectedCount) onClose() } const handleCancel = () => { onClose() } return () } AnswererSettings.propTypes = { style: PropTypes.object, onConfirm: PropTypes.func.isRequired, onClose: PropTypes.func, } AnswererSettings.defaultProps = { style: {}, onClose: _.noop, } export default AnswererSettings答题器
设置选项让学生实时参与答题
<OptionSettings style={{ marginTop: '6px', marginRight: '23px', }} onSelectOption={handleSelectOption} onSelectMinOption={handleSelectMinOption} minOptionCount={minOptionCount} />{ isShowLimitTip ? (设定选项
请至少保留两个选择选项 <CloseButtonSmall style={{ marginLeft: '20px', }} onClick={() => { setIsShowLimitTip(false) }} />) : ''}<LargeButton text="确 定" className="btn-confirm" onClick={handleConfirm} style={{ marginLeft: '29px', }} /> <CancelButton text="取 消" className="btn-cancel" onClick={handleCancel} style={{ marginLeft: '37px', }} />
import React, { useState, useRef } from 'react' import PropTypes from 'prop-types' import CX from 'classnames' import _ from 'lodash' import './index.less' const optionItemImgs = [ require('~/shared/assets/image/answerer-option-letter-a.svg'), require('~/shared/assets/image/answerer-option-letter-b.svg'), require('~/shared/assets/image/answerer-option-letter-c.svg'), require('~/shared/assets/image/answerer-option-letter-d.svg'), require('~/shared/assets/image/answerer-option-letter-e.svg'), // require('~/shared/assets/image/answerer-option-letter-f.svg'), ] /** * 选项设置组件 * * @param {*} props * @returns */ function OptionSettings(props) { const { style, onSelectOption, onSelectMinOption, minOptionCount, } = props const wrapperStyle = _.assign({}, style) const [selectedCount, setSelectedCount] = useState(2) const options = useRef(null) const handleClickItem = (e) => { const { target } = e if (target.classList.contains('last-selected')) { if (selectedCount !== minOptionCount) { setSelectedCount(selectedCount - 1) onSelectOption(selectedCount - 1) } else { onSelectMinOption(selectedCount) } } else if (target.classList.contains('first-non-selected')) { setSelectedCount(selectedCount + 1) onSelectOption(selectedCount + 1) } } const renderOptionItems = () => { return optionItemImgs.map((img, index) => { return ( <div className={CX({ item: true, selected: index < selectedCount, 'last-selected': index === selectedCount - 1, 'first-non-selected': index === selectedCount, })} key={img} >![]()
![]()
{renderOptionItems()}