最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3?頭像上傳?組件功能實(shí)現(xiàn)

 更新時(shí)間:2023年05月18日 08:23:19   作者:ps酷教程  
這篇文章主要介紹了vue3頭像上傳組件功能,用到了自定義組件v-model的雙向綁定,使用axios + formData 上傳文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

vue3 頭像上傳 組件功能

在這里插入圖片描述

  • 用到了自定義組件v-model的雙向綁定
  • 使用input的type=file這個(gè)原生html元素,通過(guò)監(jiān)聽change事件,獲取到選擇的文件(注意,選擇完文件值后,要把這個(gè)隱藏的input的type=file元素的value置為空,否則,下次選擇同樣的圖片,將不會(huì)觸發(fā)change事件)
  • 使用axios + formData 上傳文件
  • 后臺(tái)做保存文件,以及靜態(tài)資源目錄映射即可

前端

AvatarUpload.vue

<template>
    <div class="avatar-upload-wrapper">
        <!-- {{ modelValue }} -->
        <div :class="['avatar-box',{'avatar-box-border':imgUrl?false:true}]" @click="clickAvatarBox" :style="{width: size + 'px',height: size + 'px'}">
        	<!-- 隱藏的input的type=file -->
            <input type="file" hidden ref="fileInputRef" accept="image/x-png,image/gif,image/jpeg,image/bmp" @change="changeFile">
            <img v-if="imgUrl" :src="imgUrl" alt="">
            <div v-else class="avatar-marker">
                <i class="iconfont icon-jiahao"></i>
            </div>
        </div>
    </div>
</template>
<script setup>
    import Messager from '@/utils/messager'
    import axiosInstance from '@/utils/request'
    import { ref,reactive,watch } from 'vue'
    const emits = defineEmits(['update:modelValue'])
    const props = defineProps({
        size: {
            type: Number,
            default: 64
        },
        modelValue: {
            type: String,
            default: '' // 默認(rèn)頭像鏈接地址
        },
        maxSize: {
            type:Number,
            default: 5 // 默認(rèn)最大不超過(guò)5M
        },
        serverUrl: {
            type:String,
            default: 'http://localhost:9091/static/img'
        } 
    })
    const fileInputRef =ref(null)
    // const imgUrl = ref('http://localhost:9091/static/img/avatar/3026520210706112210298.png')
    const imgUrl = ref(props.modelValue)
    // console.log(imgUrl.value);
    // 監(jiān)聽頭像url改變(打開彈框時(shí), 傳入的圖片地址變化時(shí), 同步修改imgUrl)
    watch(()=>props.modelValue,(newVal,oldVal)=>{
        imgUrl.value = newVal
    })
    function clickAvatarBox() {
        fileInputRef.value.click()
    }
    function changeFile() {
        console.log(123,fileInputRef.value.files[0].size);
        // 獲取更改后的文件
        let file = fileInputRef.value.files[0]
        // 校驗(yàn)文件大小
        if(file.size / 1024 / 1024 > props.maxsize) {
            Messager.error('文件超過(guò)指定大小')
        } 
        // 執(zhí)行文件上傳
        let formData = new FormData()
        formData.append("mfile", file)
        formData.append("type", "avatar")
        let config = {
            headers: {
                'Content-Type': 'multipart/form-data',
                'a':'b' // 隨便自己帶個(gè)什么請(qǐng)求頭
            }
        } // 這個(gè)config可以不必?cái)y帶, 當(dāng)使用FormData傳參時(shí), 
          // axios會(huì)自己帶上'Content-Type': 'multipart/form-data',請(qǐng)求頭
        axiosInstance.post('/file/uploadFile',formData,config ).then(res=>{
            console.log(res,'上傳成功');
            imgUrl.value = props.serverUrl + res
            let img = new Image()
            img.src = imgUrl.value
            img.onload = ()=>{
                emits('update:modelValue', imgUrl.value)
            }
        })
    }
</script>
<style lang="scss" scoped>
    .avatar-box-border {
        border: 1px dashed #409eff !important;
    }
    .avatar-box {
        border-radius: 50%;
        margin-left: 20px;
        cursor: pointer;
        position: relative;
        border: 2px solid #eee;
        overflow: hidden;
        &:hover::before {
            content:'';
            display: block;
            position: absolute;
            width: 100%;
            height: 100%;
            background: rgba(0,0,0,.03);
        }
        img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        .avatar-marker {
            position: absolute;
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: #409eff;
            i.iconfont {
                font-size: 24px;
            }
        }
    }
</style>

使用AvatarUpload.vue

<el-dialog v-model="userDialogVisible" width="450">
   <el-form :model="userForm" :rules="userFormRules" label-width="80">
        <el-form-item label="昵稱" prop="nickname">
            <el-input v-model="userForm.nickname" style="width: 300px;"></el-input>
        </el-form-item>
        <!-- 使用頭像上傳組件 -->
        <el-form-item label="頭像" prop="avatar">
            <avatar-upload v-model="userForm.avatar" />
        </el-form-item>
        <el-form-item label="個(gè)性簽名" prop="bio">
            <el-scrollbar>
                <el-input type="textarea" :rows="3" v-model="userForm.bio" style="width: 300px;"></el-input>
            </el-scrollbar>
        </el-form-item>
        <el-form-item label="網(wǎng)站鏈接" prop="website">
            <el-input v-model="userForm.website" style="width: 300px;"></el-input>
        </el-form-item>
        <el-form-item label="是否可用" prop="disabled">
            <el-switch v-model="userForm.disabled" :active-value="0" :inactive-value="1" active-color="#13ce66"
                inactive-color="#eaecf0">
            </el-switch>
        </el-form-item>
        <el-form-item>
            <div style="margin-left: auto;">
                <el-button @click="userDialogVisible = false">取消</el-button>
                <el-button type="primary" @click="handleSave">確定</el-button>
            </div>
        </el-form-item>
    </el-form>
</el-dialog>

后端

上傳接口

@PostMapping("uploadFile")
public Result<String> uploadFile(@RequestParam("mfile") MultipartFile mfile, String type) {
    return Result.ok(fileService.saveFile(mfile,type));
}
@Override
public String saveFile(MultipartFile mfile, String type) {
    String filePath = FilePathEnum.type(type).getPathPrefix() + SnowflakeIdWorker.generateId().substring(0, 8) + mfile.getOriginalFilename();
    String targetFilePath = fileSavePath + filePath;
    try {
        mfile.transferTo(new File(targetFilePath));
    } catch (IOException e) {
        throw BizException.SAVE_FILE_ERR;
    }
    return filePath;
}

配置mvc

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("file:D:\\Projects\\boot-blog\\src\\main\\resources\\static\\");
    }
}

到此這篇關(guān)于vue3 頭像上傳 組件的文章就介紹到這了,更多相關(guān)vue3 頭像上傳 組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用vue-cli3+typescript的項(xiàng)目模板創(chuàng)建工程的教程

    使用vue-cli3+typescript的項(xiàng)目模板創(chuàng)建工程的教程

    這篇文章主要介紹了使用vue-cli3+typescript的項(xiàng)目模板創(chuàng)建工程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • vue多層嵌套路由實(shí)例分析

    vue多層嵌套路由實(shí)例分析

    這篇文章主要介紹了vue多層嵌套路由,結(jié)合實(shí)例形式分析了vue.js多層嵌套路由的概念、原理及相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • 如何在vue 中使用柱狀圖 并自修改配置

    如何在vue 中使用柱狀圖 并自修改配置

    這篇文章主要介紹了如何在vue 中使用柱狀圖 并自修改配置,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • vue實(shí)現(xiàn)移動(dòng)端項(xiàng)目多行文本溢出省略

    vue實(shí)現(xiàn)移動(dòng)端項(xiàng)目多行文本溢出省略

    這篇文章主要介紹了vue實(shí)現(xiàn)移動(dòng)端項(xiàng)目多行文本溢出省略功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • VUE中使用滾動(dòng)組件-vueSeamlessScroll

    VUE中使用滾動(dòng)組件-vueSeamlessScroll

    這篇文章主要介紹了VUE中使用滾動(dòng)組件-vueSeamlessScroll,需要的朋友可以參考下
    2023-10-10
  • 淺談vuex之mutation和action的基本使用

    淺談vuex之mutation和action的基本使用

    本篇文章主要介紹了淺談vuex之mutation和action的基本使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • element多選表格中使用Switch開關(guān)的實(shí)現(xiàn)

    element多選表格中使用Switch開關(guān)的實(shí)現(xiàn)

    當(dāng)在做后臺(tái)管理系統(tǒng)的時(shí)候,會(huì)用到用戶的狀態(tài)管理這個(gè)功能,本文主要介紹了element多選表格中使用Switch開關(guān)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • vue3+vite+electron構(gòu)建項(xiàng)目完整實(shí)例代碼

    vue3+vite+electron構(gòu)建項(xiàng)目完整實(shí)例代碼

    Electron+Vite+Vue3的組合為開發(fā)者提供了一個(gè)高效、靈活的跨平臺(tái)桌面應(yīng)用開發(fā)框架,下面這篇文章主要介紹了vue3+vite+electron構(gòu)建項(xiàng)目的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • 詳解vue的hash跳轉(zhuǎn)原理

    詳解vue的hash跳轉(zhuǎn)原理

    這篇文章主要介紹了vue的hash跳轉(zhuǎn)原理,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • vue寫一個(gè)全局彈窗組件通過(guò)js調(diào)用的方法

    vue寫一個(gè)全局彈窗組件通過(guò)js調(diào)用的方法

    彈窗效果是在Web開發(fā)中經(jīng)常用到的一種交互效果,它可以在用戶點(diǎn)擊某個(gè)按鈕或者觸發(fā)某個(gè)事件時(shí)顯示一個(gè)懸浮框,提供用戶與頁(yè)面進(jìn)行交互的機(jī)會(huì),這篇文章主要給大家介紹了關(guān)于vue寫一個(gè)全局彈窗組件通過(guò)js調(diào)用的方法,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

满洲里市| 黎平县| 建水县| 高邑县| 西乌珠穆沁旗| 武平县| 惠东县| 微博| 丰台区| 珲春市| 临清市| 永德县| 象州县| 芒康县| 油尖旺区| 六安市| 铁岭县| 石柱| 涞源县| 临江市| 永康市| 平陆县| 准格尔旗| 庐江县| 托里县| 南郑县| 大兴区| 耒阳市| 红安县| 五华县| 富蕴县| 普陀区| 衢州市| 古蔺县| 高碑店市| 商南县| 溧水县| 吉首市| 南靖县| 团风县| 洛扎县|