UNPKG

zarm

Version:

基于 React 的移动端UI库

112 lines (98 loc) 3.94 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; /** * 设置选择前的方法,获取选择文件的相关信息,需要时可以对图片进行压缩、改变图片尺寸。 * * multiple: 默认为 false,设置为 true 之后一次可以选择多张,onChange 事件调用之后返回一个数组, * 不设置或者设置为 false,onChange 事件调用之后返回一个对象。 * disabled: 传递之后不可以点击上传,整个选择组件会设置为半透明状态,透明度为 0.5。 * quality: 没有默认值,不设置不会进行压缩。 * accept: 设置选择的文件类型,默认为所有类型,只有文件类型为图片(image/*)的时候会有本地预览图。 * onChange: () => { file, fileType, fileSize, fileName, thumbnail }。 * onBeforeSelect: () => boolean,返回 false 的时候阻止后续的选择事件。 */ import React, { cloneElement, useCallback } from 'react'; import { createBEM } from '@zarm-design/bem'; import handleFileInfo from './utils/handleFileInfo'; import { ConfigContext } from '../config-provider'; var FilePicker = /*#__PURE__*/React.forwardRef(function (props, ref) { var fileRef = ref || /*#__PURE__*/React.createRef(); var _React$useContext = React.useContext(ConfigContext), prefixCls = _React$useContext.prefixCls; var bem = createBEM('file-picker', { prefixCls: prefixCls }); var className = props.className, multiple = props.multiple, accept = props.accept, capture = props.capture, disabled = props.disabled, children = props.children, onBeforeSelect = props.onBeforeSelect, onChange = props.onChange, quality = props.quality, restProps = _objectWithoutProperties(props, ["className", "multiple", "accept", "capture", "disabled", "children", "onBeforeSelect", "onChange", "quality"]); var cls = bem([{ disabled: disabled }, className]); var handleClick = useCallback(function () { fileRef === null || fileRef === void 0 ? void 0 : fileRef.current.click(); }, [fileRef]); var handleDefaultInput = useCallback(function (e) { // 防止选择同一张图片两次造成 onChange 事件不触发 e.currentTarget.value = ''; if (typeof onBeforeSelect !== 'function') { return; } // 阻止 input onChange 默认事件 if (onBeforeSelect() === false || disabled) { e.preventDefault(); } }, [onBeforeSelect, disabled]); var handleChange = function handleChange(e) { var files = [].slice.call(e.target.files); var fileList = []; var getFileInfo = function getFileInfo(data) { if (multiple) { fileList.push(data); if (files.length === fileList.length && typeof onChange === 'function') { onChange(fileList); } } else { typeof onChange === 'function' && onChange(data); } }; if (files) { files.map(function (file) { return handleFileInfo({ file: file, quality: quality }, getFileInfo); }); } }; var content = /*#__PURE__*/cloneElement(children, { onClick: handleClick, className: [children.props.className, 'needsclick'].filter(Boolean).join(' ') // 修复加载fastClick库后引起的合成事件问题 }); return /*#__PURE__*/React.createElement("div", _extends({ className: cls }, restProps), /*#__PURE__*/React.createElement("input", { className: bem('input'), type: "file", ref: fileRef, accept: accept, multiple: multiple, capture: capture, onClick: handleDefaultInput, onChange: handleChange }), content); }); FilePicker.displayName = 'FilePicker'; FilePicker.defaultProps = { disabled: false, multiple: false, onBeforeSelect: function onBeforeSelect() { return true; } }; export default FilePicker;