index.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, { useCallback, useState ,useEffect} from 'react'
  2. import { Upload } from 'antd';
  3. import ImgCrop from 'antd-img-crop';
  4. import { RcFile } from 'antd/lib/upload';
  5. import { CameraOutlined } from '@ant-design/icons';
  6. import style from './index.less'
  7. /**上传图片单独组件*/
  8. type Props={
  9. callbakc:(fileData:{file:File,fileUrl:any})=>void
  10. }
  11. function UpImg(props:Props) {
  12. const [fileList, setFileList] = useState<any[]>([])
  13. const [previewVisible, setPreviewVisible] = useState<boolean>(false)
  14. const [fileUrl, setFileUrl] = useState<any>('')
  15. const [file, setFile] = useState<any>({})
  16. //文件上传获取
  17. const fileChanage = useCallback((e: any) => {
  18. try {
  19. let file = e?.target?.files || e
  20. if (file) {
  21. setFile(file[0] || file)
  22. let reader = new FileReader()
  23. reader.readAsDataURL(file)
  24. reader.onload=function(e){
  25. setFileUrl(this.result)
  26. }
  27. }
  28. } catch (err) {
  29. console.log(err)
  30. }
  31. }, [])
  32. //回调
  33. useEffect(()=>{
  34. if(fileUrl){
  35. props.callbakc({file,fileUrl})
  36. }
  37. },[file,fileUrl])
  38. return <div className={style.upimgBox}>
  39. <ImgCrop rotate>
  40. <Upload
  41. // listType="picture-card"
  42. accept='image/gif,image/jpeg,image/png,image/jpg'
  43. beforeUpload={function (file: RcFile) {
  44. fileChanage(file)
  45. return false
  46. }}
  47. // fileList={fileList}
  48. showUploadList={false}
  49. onChange={(newFileList: any) => {
  50. setFileList([...newFileList.fileList])
  51. }}
  52. onPreview={(file: any) => {
  53. setPreviewVisible(true)
  54. setFileUrl(file.thumbUrl)
  55. }}
  56. >
  57. <div className={style.xj}><CameraOutlined style={{color:'#1890ff',fontSize:20}}/></div>
  58. </Upload>
  59. </ImgCrop>
  60. </div>
  61. }
  62. export default UpImg