UNPKG

1.52 kBJavaScriptView Raw
1import React, { useState, lazy, Suspense } from "react";
2import styles from "./CropBox.scss";
3
4// async load
5const Crop = lazy(
6 () =>
7 new Promise(resolve => {
8 setTimeout(() => {
9 resolve(importName("./Crop", "crop"));
10 }, 1000);
11 })
12);
13
14export default Cropper;
15
16/**
17 * 在cropperJS基础上添加了UI, 方便一键调用
18 *
19 * @param {String} src - 图片回显路径
20 * @param {Function} onSubmit(base64) - 裁切完成回调, 参数中包含base64格式图片
21 * @param {String,Optional} name - 按钮文字,默认为"选择图片"
22 * @param {Number,Optional} width - 图片的宽度, 默认260
23 * @param {Object,Optional} cropper - cropper选项, 默认值 { aspectRatio: 16/9, viewMode:2, ...}
24 */
25function Cropper(props) {
26 const { name, onSubmit, src, ...rest } = props;
27 const [file, setfile] = useState(null);
28
29 function submit(value) {
30 onSubmit && onSubmit(value);
31 }
32
33 const onChange = e => {
34 const file = e.nativeEvent.target.files[0];
35 setfile(file);
36 };
37
38 return (
39 <div className={styles.container}>
40 <div className={styles.input}>
41 <label className={styles.label}>
42 {name || "选择图片"}
43 <input type="file" onChange={onChange} style={{ display: "none" }} />
44 </label>
45 </div>
46 <img src={src} className={styles.img} />
47 <Suspense fallback={null}>
48 <Crop file={file} onSubmit={submit} width={260} {...rest} />
49 </Suspense>
50 </div>
51 );
52}