vue+elementUIで作った画像アップロードコンポーネント

38514 ワード

コンポーネントパッケージ需要分析のアップロード
elementUIライブラリに基づくショッピングモールのバックグラウンド管理では、さまざまな商品画像情報を入力する必要があるため、最も需要のあるのは商品管理フォームです.バックグラウンドに2 M未満の画像を渡すように要求されたため、uploadがカプセル化された.vueコンポーネントは、画像のアップロードロジックを管理するためのアップロードページのサブコンポーネントとして使用されます.
upload.vue解析
uploadは主にフォーム上で画像をアップロードする需要を実現するために用いられ、主にinput+imgから構成されている.画像がない場合はデフォルトの画像を表示し、画像がある場合はアップロード画像を表示する.inputスタイルがあまり需要に合わないため、起を非表示に設定するだけで、display:noneに設定することはできない.そうしないとinputのchangeイベントはトリガーされません
upload.vueコードは次のとおりです.
<template>
	<div>
		<div class="upload-box" :style="imgStyle">
			 
			<input type="file" :ref="imgType$1"   @change="upload(formVal$1,imgType$1)" class="upload-input" />
			
			<img :src="formVal$1[imgType$1]?formVal$1[imgType$1]:'static/img/upload.jpg'" />
		div>
	div>
template>
<script>
/* 
                     (mainImg)    (detailImg)      (plusImg)  
	         lrz,         
	npm install lrz --save   
*/
import lrz from 'lrz';
export default {
    name: 'uploadImg', //    
    props: {
        formVal: {
            type: Object, //props        (             )
            required: true,
            default: {}
        },
        imgType: {                //           example:mainImg
            type: String,
            required: true,
            default: ''
        },
        imgStyle: {
            type: Object,        //             
            required: true //    
        }
    },
    created: function() {
        //       
    },
    data: function() {
      /*
                           ,
                 
      */
        let formVal$1 = this.formVal;
        let imgType$1 = this.imgType;
        return {
            formVal$1,
            imgType$1,
            uploadUrl: url,//     url  
        };
    },
    methods: {
        upload: function(formVal, imgType) {
            var self = this;
            //               ,        ,      
            var loadingInstance = this.$loading({
                text: '   '
            });
            var that = this.$refs[imgType].files[0]; //    file
            //      
            var testUrl = this.uploadUrl; //      
            try {
                //lrz                  
                lrz(that)
                    .then(function(message) {
                        var formData = message.formData; //           formData  
                        self.$axios
                            .post(testUrl, formData)
                            .then(function(res) {
                                console.log(res);
                                if (res && res.data.iRet == 0) {
                                    formVal[imgType] = res.data.objData.sUrl;
                                    //                         change   
                                    self.$refs[imgType].value = '';
                                    /*
	                                          elementUI      ,
	                                                       
	                                                     
                                     */
                                    self.$emit('clearValidate', imgType);
                                    self.$nextTick(() => {
                                        //           Loading       
                                        loadingInstance.close();
                                    });
                                } else {
                                    throw res.data.sMsg;
                                }
                            })
                            .catch(function(err) {
                                self.$nextTick(() => {
                                    //           Loading       
                                    loadingInstance.close();
                                });
                                //        
                                alert(err);
                            });
                    })
                    .catch(function(err) {
                        self.$nextTick(() => {
                            loadingInstance.close();
                        });
                    });
            } catch (e) {
                //        
                self.$nextTick(() => {
                    loadingInstance.close();
                });
            }
        }
    },
    mounted: function() {},
    watch: {
       /*
                                     .
                 ,             
        */
        formVal: {
            handle: function(newVal, oldVal) {
                var imgType = this.imgType;
                if (newVal[imgType] == '') {
                   //       js         ref    ,    
                    document.getElementsByClassName('upload-input')[0].value = '';
                }
            }
        }
    }
};
script>
<style scoped>
/*
              。             
*/
.upload-box {
    position: relative;
    height: 100px;
    width: 100px;
    overflow: hidden;
}

.upload-box img {
    width: 100%;
    height: 100%;
}

.upload-box .upload-input {
    position: absolute;
    left: 0;
    opacity: 0;
    width: 100%;
    height: 100%;
}
style>


商品ページでuploadコンポーネントを使用
good.vueではuploadコンポーネントを導入します.また、対応するフォームオブジェクト、アップロードするピクチャタイプのプロパティ、およびサブコンポーネントへのピクチャ表示スタイルを渡します.
good.vueコアコード:
<template>
   <el-form ref="form" :model="form" label-width="80px" label-position="top" :rules="rules">
   	
   	<el-form-item label="   " prop="sDetailImg" ref="sDetailImg">
   		<uploadImg :form-val="form" :img-type="'sDetailImg'" :img-style="detailImgStl" @clearValidate="clearValidate">uploadImg>
   	el-form-item>
   	<el-form-item>
   		<el-row style="text-align:center;">
   			<el-button type="primary" size="medium" @click.stop="submit('form')" v-if="!form.ID">  el-button>
   			<el-button type="primary" size="medium" @click.stop="submit('form')" v-else-if="form.ID">  el-button>
   			<el-button size="medium" @click.stop="resetForm('form')">  el-button>
   		el-row>
   	el-form-item>
   el-form>
   
template>
<script>
   import uploadImg from "../common/uploadImg"; //    
   export default {
   	name: "good", //         
   	data: function() {
   		return {
   			form: {
   				ID: NULL,
   				//     
   				sDetailImg: "" //     
   			},
   			detailImgStl: {
   				width: "350px",
   				height: "150px"
   			},
   			rules: {
   				sDetailImg: [{
   					required: true,
   					message: "        ",
   					trigger: "change"
   				}],
   			}
   		}
   	},
   	methods: {
   		//            ,                   bug
   		clearValidate: function(imgName) {
   			//                     
   			this.$refs[imgName].clearValidate();
   		},
   		//    
   		resetForm: function(formName) {
   			this.confirm("      ", function(self) {
   				self.$refs[formName].resetFields();
   			})

   		}
   	},
   }
script>


最後に書く
画像のアップロードについては前にも小さなプログラムバージョンを書いたことがありますが、全体的にpc端の画像のアップロードは小さなプログラムよりも複雑で、このパッケージは現在の単図のアップロードの需要を満たすしかありません.彼の不足点もあります.もちろん多図アップロードにも拡張できますが、多図アップロードに関するネット上にも多くの例があります.ここではこれ以上詳しく述べない.