日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue 實現上傳組件

瀏覽:22日期:2022-09-29 10:03:44
目錄1.介紹2.思路文件上傳的兩種實現方式3.生命周期4.代碼草稿5.具體實現1.介紹

效果如下圖

vue 實現上傳組件

2.思路文件上傳的兩種實現方式

1.From形式

<form method='post' enctype='multipart/from-data' action='api/upload'> <input type='file name='file'> <button type='submit'>Submit</button></form>

form的method屬性指定為 'post' 請求,通過HTML表單發送數據給服務器,并返回服務器的修改結果,在這種情況下Content-Type是通過在<form>元素中設置正確的enctype屬性。

form的enctype屬性規定在發送到服務器之前應該如何對表單數據進行編碼。

application/x-www-form-urlencoded(默認值):表示在發送前編碼所有字符,數據被編碼成以'&'分隔的鍵值對,同時以'='分隔鍵和值,('name=seven&age=19')。不支持二進制數據。 multipart/form-data:支持二進制數據(上傳文件時必須指定)

2.JavaScript異步請求形式

我們知道 FormData 接口提供了一種表示表單數據的鍵值對 key/value 的構造方式,并且可以輕松的將數據通過XMLHttpRequest.send()方法發送出去,本接口和此方法都相當簡單直接。如果送出時的編碼類型被設為 'multipart/form-data',它會使用和表單一樣的格式。

var formdata = new FormData(); // 創建FormData對象formdata.append('name','laotie'); // 通過append()方法添加新的屬性值... // 更多方法請點下面鏈接

FormData接口

3.生命周期

上傳組件也有它的生命周期

beforeUpload --> uploading --> fileUploaded 或者 uploadedError

4.代碼草稿

本例中采用js異步請求的方式開發上傳組件

<input type='file' name='file' @change.prevent='handleFileChange'>// 創建一個file類型的input,用于觸發文件上傳,后面可以把input隱藏掉,自定義好看的樣式// 自定義樣式的時候可以用slot區分不同上傳狀態的樣式(loading,success,defult)

const handleFileChange = (e:Event)=>{ const target = e.target as HTMLInputElement const files = Array.from(target.files)// 注意這里取得的是一個類數組 if(files){ // 取得文件 const uploadedFile = files[0]if(!validateFormat) return // ...這里只是提供一種思路,具體校驗不再講述 // 在這里做一些上傳文件前的校驗,比如文件格式,大小等, // 不符合要求的話就不在繼續發送請求const formData = new FormData() formData.append(uploadedFile.name,uploadedFile)axios.post(’/upload’,formData,{ headers:{ // 注意設置編碼類型’Content-Type’: ’multipart/form-data’ } }).then(res=>{ console.log(’上傳成功’) }).catch(error =>{ // 文件上傳失敗 }).finally(()=>{ // 文件上傳完成,無論成功還是失敗 // 這里可以清除一下input.value }) }}5.具體實現

// Upload.vue<template> <div class='upload-container'> <div @click.prevent='triggerUpload' v-bind='$attrs'> <slot name='loading' v-if='fileStatus===’loading’'><button class='btn btn-primary'>上傳中</button> </slot> <slot name='uploaded' v-else-if='fileStatus===’success’' :uploadedData='fileData'><button class='btn btn-primary'>上傳成功</button> </slot> <slot v-else name='default'><button class='btn btn-primary'>點擊上傳</button> </slot> </div> <input type='file' name='file' ref='uploadInput' @change='hanldeInput'/> </div></template><script lang='ts'>import { defineComponent, ref, PropType, watch } from ’vue’import axios from ’axios’type UploadStatus = ’ready’ | ’loading’ | ’success’ | ’error’type FunctionProps = (file:File) => booleanexport default defineComponent({ name: ’Upload’, inheritAttrs: false, props: { // 上傳的url action: { type: String, required: true }, // 上傳之前的校驗,是一個返回布爾值的函數 beforeUpload: { type: Function as PropType<FunctionProps> }, // 上傳好的數據,用來判斷狀態或做初始化展示 uploadedData: { type: Object } }, emits: [’file-uploaded-success’, ’file-uploaded-error’], setup(props, ctx) { const uploadInput = ref<null | HTMLInputElement>(null) const fileStatus = ref<UploadStatus>(props.uploadedData ? ’success’ : ’ready’) const fileData = ref(props.uploadedData) watch(() => props.uploadedData, (val) => { if (val) {fileStatus.value = ’success’fileData.value = val } }) const triggerUpload = () => { if (uploadInput.value) {uploadInput.value.click() } } const hanldeInput = (e:Event) => { const target = e.target as HTMLInputElement const files = target.files console.log(target) if (files) {const uploadFile = Array.from(files)const validateFormat = props.beforeUpload ? props.beforeUpload(uploadFile[0]) : trueif (!validateFormat) returnfileStatus.value = ’loading’const formData = new FormData()formData.append(’file’, uploadFile[0])axios.post(props.action, formData, { headers: { ’Content-Type’: ’multipart/form-data’ }}).then(res => { console.log(’文件上傳成功’, res) fileStatus.value = ’success’ fileData.value = res.data ctx.emit(’file-uploaded-success’, res.data)}).catch(error => { console.log(’文件上傳失敗’, error) fileStatus.value = ’error’ ctx.emit(’file-uploaded-error’, error)}).finally(() => { console.log(’文件上傳完成’) if (uploadInput.value) { uploadInput.value.value = ’’ }}) } } return { uploadInput, triggerUpload, hanldeInput, fileStatus, fileData } }})</script>

使用示例:

<template> <div class='create-post-page'> <upload action='/upload' :beforeUpload='beforeUpload' :uploadedData='uploadedData' @file-uploaded-success='hanldeUploadSuccess' > <template #uploaded='slotProps'><div class='uploaded-area'> <img :src='http://m.b3g6.com/bcjs/slotProps.uploadedData.data.url'/> <h3>點擊重新上傳</h3></div> </template> <template #default> <h2>點擊上傳頭圖</h2> </template> <template #loading> <div class='d-flex'> <div role='status'> <span class='sr-only'></span> </div> </div> </template> </upload> </div></template><script lang='ts'>import { defineComponent, ref, onMounted } from ’vue’import Upload from ’../components/Upload.vue’import createMessage from ’../components/createMessage’export default defineComponent({ name: ’CreatePost’, components: { Upload }, setup() { const uploadedData = ref() //創建一個響應式數據 let imageId = ’’ onMounted(() => { .... // 這里有邏輯省略了,取到初始化數據image if (image) {uploadedData.value = { data: image } } }) // 上傳前校驗,返回布爾值 const beforeUpload = (file:File) => { const res = beforeUploadCheck(file, {format: [’image/jpeg’, ’image/png’],size: 1 }) const { error, passed } = res if (error === ’format’) {createMessage(’上傳圖片只能是JPG/PNG格式!’, ’error’) } if (error === ’size’) {createMessage(’上傳圖片大小不能超過1MB’, ’error’) } return passed } // 上傳成功后拿到imageId就可以進行后續處理,創建表單啥的 const hanldeUploadSuccess = (res:ResponeseProps<ImageProps>) => { createMessage(`上傳圖片ID ${res.data._id}`, ’success’) if (res.data._id) {imageId = res.data._id } } return { beforeUpload, hanldeUploadSuccess, uploadedData } }})</script><style>.create-post-page{ padding:0 20px 20px;}.create-post-page .upload-box{ height:200px; cursor: pointer; overflow: hidden;}.create-post-page .upload-box img{ width: 100%; height: 100%; object-fit: cover;}.uploaded-area{ position: relative;}.uploaded-area:hover h3{ display: block;}.uploaded-area h3{ display: none; position: absolute; color: #999; text-align: center; width: 100%; top:50%}</style>

以上就是vue 實現上傳組件的詳細內容,更多關于vue 上傳組件的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久香蕉网站| 蜜臀久久99精品久久久画质超高清| 亚洲一级淫片| 男女激情视频一区| 蜜桃久久av一区| 国产成人精选| 中国字幕a在线看韩国电影| 欧美国产偷国产精品三区| 国产suv精品一区二区四区视频 | 国产精品久av福利在线观看| 免费欧美日韩| 亚洲三级网站| 国产视频网站一区二区三区| 久久av资源| 国精品产品一区| 久久久人人人| 香蕉成人久久| 日韩一区二区三免费高清在线观看 | 色偷偷色偷偷色偷偷在线视频| 国产suv精品一区二区四区视频| 成人国产精选| 偷拍欧美精品| 国产一区二区精品| 欧美一区二区三区久久精品| 麻豆精品99| а√天堂8资源中文在线| 国产videos久久| 午夜免费一区| 少妇精品久久久| 色综合视频一区二区三区日韩 | 综合色就爱涩涩涩综合婷婷| 日韩高清电影一区| 国产精品二区影院| 欧洲亚洲一区二区三区| 九色精品91| 日韩毛片视频| 夜久久久久久| 久久国产生活片100| 荡女精品导航| 欧美a级片一区| 香蕉久久国产| 国产欧美一级| 亚洲黄色免费av| 婷婷成人基地| 青青草精品视频| 精品久久国产一区| 黄色不卡一区| 欧美一区久久| 日韩欧美午夜| 三级一区在线视频先锋| 国产精品欧美大片| 国产91精品对白在线播放| 亚洲免费中文| 国产欧美日韩综合一区在线播放| 麻豆网站免费在线观看| 久久九九电影| 日本色综合中文字幕| 亚洲1234区| 在线亚洲一区| 麻豆91小视频| 香蕉久久夜色精品国产| 精品视频99| 先锋亚洲精品| 黄色aa久久| 亚洲精品黄色| 正在播放日韩精品| 亚洲精选久久| av亚洲一区二区三区| 日本一区免费网站| 日韩欧美二区| 日韩1区2区日韩1区2区| 神马午夜久久| 国产亚洲欧美日韩精品一区二区三区| 国产在线|日韩| 欧美一区不卡| 国产婷婷精品| 国产一区二区三区不卡视频网站| 免费看的黄色欧美网站| 成人午夜网址| 日韩精品一区二区三区中文在线 | 欧美xxxx中国| 婷婷综合福利| 九色精品91| 国产精品视频首页| 99国产精品私拍| 国产成人精品三级高清久久91| 美女精品在线| 欧美三级网址| 你懂的国产精品| 久久亚洲图片| 久久青草久久| 色综合五月天| 国产精品www.| 亚洲欧美日本国产| 国产精品羞羞答答在线观看| 玖玖玖国产精品| 亚洲成人一区在线观看| 国产精品igao视频网网址不卡日韩 | 国产96在线亚洲| 蜜桃视频一区二区三区在线观看| 99热国内精品| 成人在线超碰| 欧美精品aa| 97成人在线| 亚洲精品美女| 国产亚洲欧洲| 中文一区在线| 免费观看在线色综合| 亚洲一级二级| 欧美日韩伊人| 精品国产a一区二区三区v免费| 欧美成a人片免费观看久久五月天| 在线日韩中文| 亚洲精品美女91| 亚洲区欧美区| 国产免费av国片精品草莓男男| 激情黄产视频在线免费观看| 国产图片一区| 日韩精品a在线观看91| 国产欧美日韩一区二区三区四区 | 91精品国产自产观看在线| 99xxxx成人网| 亚洲成人精选| 中文字幕日韩亚洲| 久久国产精品亚洲77777| 1000部精品久久久久久久久| 欧美国产偷国产精品三区| 福利一区二区免费视频| 高清不卡一区| 一区二区精品伦理...| 久久中文字幕一区二区| 国产精品久久| 久久超级碰碰| 国产精品大片| 精品午夜视频| 国产精品久久久久久久免费软件| 欧美一级网站| 国产精品大片免费观看| 精品国产三区在线| 国产a亚洲精品| 91精品xxx在线观看| 久久国产欧美| 激情六月综合| 日韩一区二区免费看| 亚洲女人av| 婷婷综合电影| 国产精品一区免费在线| 国产精品久久| 国产福利电影在线播放| 欧美日韩精品免费观看视完整| 亚洲美女久久精品| 天堂资源在线亚洲| 伊人久久亚洲影院| 亚洲伊人精品酒店| 欧美日韩夜夜| 久久影院资源站| 午夜久久中文| 亚洲国产一区二区三区在线播放| 国产亚洲网站| 日韩**一区毛片| 精品一级视频| 午夜久久免费观看| 日韩欧美中文字幕电影| 国产精品一在线观看| 日韩a一区二区| 久久九九精品| 日韩制服丝袜av| 国产一区二区亚洲| 久久要要av| 日本在线不卡视频一二三区| 国产精品宾馆| 亚洲网站视频| 亚洲精品欧美| 国产一区二区三区四区五区| 国产综合婷婷| 日本中文字幕一区二区| 国产一区二区精品福利地址| 午夜影院欧美| 国产调教精品| 国产精品亚洲一区二区三区在线观看| 欧美99久久| 欧美日韩精品一区二区三区视频 | 婷婷成人av| 成人在线视频免费看| 99国产精品99久久久久久粉嫩| 欧美日本三区| 久久91导航| 亚洲精品国产精品粉嫩| 国产精品第一国产精品| 欧美成人综合| 欧美私人啪啪vps| 久久精品主播| 国产日韩精品视频一区二区三区| 久久男人天堂| 日韩一区二区三区在线看| 日韩欧美三级| 久久久夜夜夜| 国产情侣久久| 亚洲女同一区| 国产一区二区三区不卡视频网站|