UNPKG

@td-design/react-native

Version:

react-native UI组件库

103 lines (101 loc) 3.34 kB
import { useEffect, useState } from 'react'; import { useMemoizedFn } from '@td-design/rn-hooks'; export default function useCheckbox(props) { const { value, options, disabledValue, defaultValue, onChange, showCheckAll } = props; const [transformedOptions, setTransformedOptions] = useState([]); useEffect(() => { const checkedValue = value ?? defaultValue ?? []; const newOptions = options.map(option => { const disabled = !!(disabledValue !== null && disabledValue !== void 0 && disabledValue.includes(option.value)); const checked = !!(checkedValue !== null && checkedValue !== void 0 && checkedValue.includes(option.value)); return { ...option, disabled, status: checked ? 'checked' : 'unchecked' }; }); setTransformedOptions(newOptions); }, [options, value, defaultValue, disabledValue]); let checkedAllStatus = 'unchecked'; if (showCheckAll) { checkedAllStatus = getCheckedAllStatus(transformedOptions); } /** * 1. 选中或者办选中状态下,设置为未选中 * 2. 未选中状态下,设置为选中 */ const handleAllChange = (_, status) => { if (status === 'checked') { const newOptions = transformedOptions.map(option => { return { ...option, disabled: !!(disabledValue !== null && disabledValue !== void 0 && disabledValue.includes(option.value)), status: 'unchecked' }; }); if (onChange) { onChange([]); } else { setTransformedOptions(newOptions); } } else { const newOptions = transformedOptions.map(option => { const disabled = !!(disabledValue !== null && disabledValue !== void 0 && disabledValue.includes(option.value)); return { ...option, disabled, status: !disabled ? 'checked' : 'unchecked' }; }); if (onChange) { const values = newOptions.filter(item => !(disabledValue !== null && disabledValue !== void 0 && disabledValue.includes(item.value))).map(option => option.value); onChange(values); } else { setTransformedOptions(newOptions); } } }; /** * 1. 选中状态下,设置为未选中 * 2. 未选中状态下,设置为选中 */ const handleChange = (value, status) => { const newOptions = transformedOptions.map(item => { if (item.value === value) { item.status = status === 'checked' ? 'unchecked' : 'checked'; } return item; }); if (onChange) { const values = newOptions.filter(item => item.status === 'checked').map(item => item.value); onChange(values); } else { setTransformedOptions(newOptions); } }; return { transformedOptions, checkedAllStatus, handleAllChange: useMemoizedFn(handleAllChange), handleChange: useMemoizedFn(handleChange) }; } function getCheckedAllStatus() { let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; const checkedLength = options.filter(option => option.status === 'checked').length; if (checkedLength === 0) { return 'unchecked'; } else if (checkedLength === options.length) { return 'checked'; } else { return 'halfchecked'; } } //# sourceMappingURL=useCheckbox.js.map