♻️: ♻️: ♻️: 重构upload支持跟随form组件提交,补充在文档的示例
This commit is contained in:
		
							parent
							
								
									1abea59297
								
							
						
					
					
						commit
						21d0d62015
					
				@ -17,6 +17,7 @@ import {
 | 
				
			|||||||
  ref,
 | 
					  ref,
 | 
				
			||||||
  useSlots,
 | 
					  useSlots,
 | 
				
			||||||
  withDefaults,
 | 
					  withDefaults,
 | 
				
			||||||
 | 
					  watch,
 | 
				
			||||||
} from "vue";
 | 
					} from "vue";
 | 
				
			||||||
import { templateRef } from "@vueuse/core";
 | 
					import { templateRef } from "@vueuse/core";
 | 
				
			||||||
import { LayLayer } from "@layui/layer-vue";
 | 
					import { LayLayer } from "@layui/layer-vue";
 | 
				
			||||||
@ -70,6 +71,7 @@ export interface UploadProps {
 | 
				
			|||||||
  cutOptions?: CutOptions;
 | 
					  cutOptions?: CutOptions;
 | 
				
			||||||
  text?: string;
 | 
					  text?: string;
 | 
				
			||||||
  dragText?: string;
 | 
					  dragText?: string;
 | 
				
			||||||
 | 
					  modelValue?: any;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getCutDownResult = () => {
 | 
					const getCutDownResult = () => {
 | 
				
			||||||
@ -83,6 +85,11 @@ const getCutDownResult = () => {
 | 
				
			|||||||
      Object.assign({ currentTimeStamp, cutResult: imgData, orginal: orgInfo })
 | 
					      Object.assign({ currentTimeStamp, cutResult: imgData, orginal: orgInfo })
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
    let newFile = dataURLtoFile(imgData);
 | 
					    let newFile = dataURLtoFile(imgData);
 | 
				
			||||||
 | 
					    if (isInFormItem.value) {
 | 
				
			||||||
 | 
					      emit("update:modelValue", [newFile]);
 | 
				
			||||||
 | 
					      clearLightCutEffect();
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    commonUploadTransaction([newFile]);
 | 
					    commonUploadTransaction([newFile]);
 | 
				
			||||||
    nextTick(() => clearAllCutEffect());
 | 
					    nextTick(() => clearAllCutEffect());
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
@ -104,6 +111,13 @@ const clearAllCutEffect = () => {
 | 
				
			|||||||
  _cropper = null;
 | 
					  _cropper = null;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const clearLightCutEffect = () => {
 | 
				
			||||||
 | 
					  activeUploadFiles.value = [];
 | 
				
			||||||
 | 
					  activeUploadFilesImgs.value = [];
 | 
				
			||||||
 | 
					  innerCutVisible.value = false;
 | 
				
			||||||
 | 
					  _cropper = null;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { t } = useI18n();
 | 
					const { t } = useI18n();
 | 
				
			||||||
const text = computed(() => {
 | 
					const text = computed(() => {
 | 
				
			||||||
  return props.text ? props.text : t("upload.text");
 | 
					  return props.text ? props.text : t("upload.text");
 | 
				
			||||||
@ -148,6 +162,7 @@ const props = withDefaults(defineProps<UploadProps>(), {
 | 
				
			|||||||
  disabledPreview: false,
 | 
					  disabledPreview: false,
 | 
				
			||||||
  cut: false,
 | 
					  cut: false,
 | 
				
			||||||
  cutOptions: void 0,
 | 
					  cutOptions: void 0,
 | 
				
			||||||
 | 
					  modelValue: null,
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const slot = useSlots();
 | 
					const slot = useSlots();
 | 
				
			||||||
@ -160,8 +175,21 @@ const emit = defineEmits([
 | 
				
			|||||||
  "error",
 | 
					  "error",
 | 
				
			||||||
  "cutdone",
 | 
					  "cutdone",
 | 
				
			||||||
  "cutcancel",
 | 
					  "cutcancel",
 | 
				
			||||||
 | 
					  "update:modelValue",
 | 
				
			||||||
]);
 | 
					]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const isInFormItem = computed(() => context?.parent?.type.name === 'LayFormItem');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					watch(
 | 
				
			||||||
 | 
					  () => props.modelValue,
 | 
				
			||||||
 | 
					  () => {
 | 
				
			||||||
 | 
					    if (!props.modelValue) {
 | 
				
			||||||
 | 
					      clearAllCutEffect();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const isDragEnter = ref(false);
 | 
					const isDragEnter = ref(false);
 | 
				
			||||||
const activeUploadFiles = ref<any[]>([]);
 | 
					const activeUploadFiles = ref<any[]>([]);
 | 
				
			||||||
const activeUploadFilesImgs = ref<any[]>([]);
 | 
					const activeUploadFilesImgs = ref<any[]>([]);
 | 
				
			||||||
@ -219,7 +247,7 @@ const localUploadTransaction = (option: localUploadTransaction) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const dataURLtoFile = (dataurl: string) => {
 | 
					const dataURLtoFile = (dataurl: string) => {
 | 
				
			||||||
  let arr: any[] = dataurl.split(",");
 | 
					  let arr: any[] = dataurl.split(",");
 | 
				
			||||||
  let mime: string = "";
 | 
					  let mime = "";
 | 
				
			||||||
  if (arr.length > 0) {
 | 
					  if (arr.length > 0) {
 | 
				
			||||||
    mime = arr[0].match(/:(.*?);/)[1];
 | 
					    mime = arr[0].match(/:(.*?);/)[1];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -323,12 +351,13 @@ const uploadChange = (e: any) => {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  let arm1 =
 | 
					  let arm1 =
 | 
				
			||||||
    props.cut &&
 | 
					    props.cut &&
 | 
				
			||||||
    props.acceptMime.indexOf("image") != -1 &&
 | 
					    (props.acceptMime.indexOf("image") != -1 || isInFormItem.value) &&
 | 
				
			||||||
    props.multiple == false;
 | 
					    props.multiple == false;
 | 
				
			||||||
  let arm2 =
 | 
					  let arm2 =
 | 
				
			||||||
    props.cut &&
 | 
					    props.cut &&
 | 
				
			||||||
    props.acceptMime.indexOf("image") != -1 &&
 | 
					    (props.acceptMime.indexOf("image") != -1 || isInFormItem.value) &&
 | 
				
			||||||
    props.multiple == true;
 | 
					    props.multiple == true;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  if (arm1) {
 | 
					  if (arm1) {
 | 
				
			||||||
    innerCutVisible.value = true;
 | 
					    innerCutVisible.value = true;
 | 
				
			||||||
    setTimeout(() => {
 | 
					    setTimeout(() => {
 | 
				
			||||||
@ -347,6 +376,10 @@ const uploadChange = (e: any) => {
 | 
				
			|||||||
    if (arm2) {
 | 
					    if (arm2) {
 | 
				
			||||||
      console.warn(cannotSupportCutMsg.value);
 | 
					      console.warn(cannotSupportCutMsg.value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (isInFormItem.value) {
 | 
				
			||||||
 | 
					      emit("update:modelValue", _files);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    commonUploadTransaction(_files);
 | 
					    commonUploadTransaction(_files);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -173,6 +173,9 @@ export default {
 | 
				
			|||||||
    <lay-form-item label="描述" prop="desc">
 | 
					    <lay-form-item label="描述" prop="desc">
 | 
				
			||||||
      <lay-textarea placeholder="请输入描述" v-model="validateModel.desc"></lay-textarea>
 | 
					      <lay-textarea placeholder="请输入描述" v-model="validateModel.desc"></lay-textarea>
 | 
				
			||||||
    </lay-form-item>
 | 
					    </lay-form-item>
 | 
				
			||||||
 | 
					    <lay-form-item label="文件" prop="file">
 | 
				
			||||||
 | 
					      <lay-upload v-model="validateModel.file" :cut="true"/>
 | 
				
			||||||
 | 
					    </lay-form-item>
 | 
				
			||||||
    <lay-form-item>
 | 
					    <lay-form-item>
 | 
				
			||||||
      <lay-button @click="validate">提交</lay-button>
 | 
					      <lay-button @click="validate">提交</lay-button>
 | 
				
			||||||
      <lay-button @click="clearValidate">清除校验</lay-button>
 | 
					      <lay-button @click="clearValidate">清除校验</lay-button>
 | 
				
			||||||
@ -192,7 +195,8 @@ export default {
 | 
				
			|||||||
        username: "",
 | 
					        username: "",
 | 
				
			||||||
        password: "",
 | 
					        password: "",
 | 
				
			||||||
        specialty: "1",
 | 
					        specialty: "1",
 | 
				
			||||||
        hobbys: ""
 | 
					        hobbys: "",
 | 
				
			||||||
 | 
					        file: null,
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const layFormRef = ref(null);
 | 
					    const layFormRef = ref(null);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user