美文网首页
vue 前端上传图片组件

vue 前端上传图片组件

作者: 虚蕪面孔 | 来源:发表于2018-01-23 12:18 被阅读1181次
<template>
    <div class="update">
        <!-- 通过input获取文件 ,为了美观使用v-show="false" 将input隐藏 通过input的change事件绑定fileChange-->
        <input type="file" v-show="false" accept="image" ref="input" @change="fileChange($event.target.files)">
        <!-- 通过$refs操作input的点击事件,调起文件选择 -->
        <div @click="$refs.input.click()">
            <!-- 通过slot内容分发将头像的显示交给父组件,父组件可以自定义图片样式 -->
            <slot></slot>
        </div>
    </div>
</template>
<script>
/*
auth:袁
作用:文件上传
返回事件: file
返回事件参数: file对象
*/
export default {
    methods: {
        fileChange(files) {
            /* 通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。
            它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单
            的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式
            和表单通过submit() 方法传输的数据格式相同*/
            // 你可以自己创建一个FormData对象,然后通过调用它的append()方法添加字段,就像这样:
            let formData = new FormData();
            formData.append('thumb', files[0]);
            //由于我的请求接口需要openid所以需要再次向FormData对象添加openid字段,如果你们不需要可以不用此操作
            formData.append('openid', localStorage.getItem('openid'));
            // 向父组件传递参数,事件为fileChange,参数为formData对象
            this.$emit('fileChange', formData)
        },
    }
}


</script>

组件使用
1.导入注册

import Update from '@/components/update'
在 对象局部注册该组件 components: {
    Update,

},

2.页面使用

< !--父组件通过fileChange事件用于接收子组件的派发事件 -->
     <Update @fileChange="fileChange" >
<!--这里是slot自定义内容 -->
 <img :src="img" alt="" class="info">
</Update>

3.事件处理

fileChange(file) {
    // 因为file是个FormData格式的对象所以可以直接通过接口开始上传,不需要做多余操作
    this.axios.post('/upload/thumb', file).then(res => {
        console.log(res.data.datas)
        this.img = this.HTTP + res.data.datas
    }, err => {
        console.log(err)
    })
},

相关文章

网友评论

      本文标题:vue 前端上传图片组件

      本文链接:https://www.haomeiwen.com/subject/tlhsaxtx.html