前端封装 自定义-上传文件-组件

<template>
  <a href="javascript:;" class="file" v-show='list.length == 0'>
    <iconfont name="shangchuan" class="ico"/> 上传文件
    <input type="file" name="file" id="fileField" :accept="accept" @change="beforeUpload">
  </a>
  <template v-show='list.length !== 0' v-for="(item,index) in list" :key="index">
    <div class="upload_name"  >
      <div class="left">
        <iconfont name="lianjie" class="ico"/>
      </div>
      <div class="name">{{item.name}}</div>
      <div class="operate">
        <a :href="item.url" class="down"><iconfont name="xiazai" color='#85bbec'/></a>
        <a class="dele" @click="Delete(index)"><iconfont name="shanchu-copy" color='red'/></a>
      </div>
  </div>
  </template>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
  name: 'app-upload',
  props: {
    value: {
      type: [String, Array],
      default: '',
    },
    accept: {
      type: String,
      default: ''
    },
    name: {
      type: String,
      default: ''
    },
    request: {
      type: Function
    }
  },
  data() {
    return {
      list: [],
      place:'',
      result: '',
      yulan: {
        visible: false,
        url: '',
      },
      showUploadList:true
    }
  },
  emits: ['update:value'],
  watch: {
    value: {
      handler(value) {
        if (this.result === value) return;
        let array = [];
        if (typeof value == 'string' && value) {
          let values = value.split(',').filter((value) => Boolean(value));
          let name = this.place == '' ? this.name : this.place
          array = [
              {
                status: 'done',
                uid: this.random(),
                name: name,
                url: values[0],
              },
            ];
        }
        this.list = array;
      },
      immediate: true,
      deep: true,
    },
    list: {
      handler(value) {
        let result = [];
        value.filter((item) => {
          if (item.status == 'error' || item.status == 'removed') return false;
          else if (item.status == 'done') {
            if (item.url) result.push(item.url);
            else if (item.response && item.response.url)
              result.push(item.response.url);
          }
          return true;
        });
        this.result = result.join(',');
        this.$emit('update:value', this.result);
      },
      immediate: true,
      deep: true,
    }
  },
  methods: {
    random() {
      return Math.random().toString(36).slice(-8);
    },
    preview(file) {
      let url = '';
      if (file.url) url = file.url;
      else if (file.response && file.response.url) url = file.response.url;
      this.yulan.visible = url ? true : false;
      this.yulan.url = url;
    },
    Delete(index){
      this.$success('删除成功')
      setTimeout(()=>{
        this.list.splice(index,1)
      },500)
    },
    beforeUpload(e) {
      let file = e.target.files[0]
      const max = 1024 * 1024 * 5
      if (file.size > max) {
        file = ''
        this.$error('大小不能超过 5MB!');
        this.list.length = 0   
        return false
      }
      this.place = file.name
      // this.list = []
      this.request(file)
    }
  }
})
</script>

.file {
    position: relative;
    display: inline-block;
    background: #feffff;
    border: 1px solid #b9babb;
    border-radius: 4px;
    padding: 4px 12px;
    overflow: hidden;
    color: #b9babb;
    text-decoration: none;
    text-indent: 0;
    line-height: 20px;
}
.file input {
    position: absolute;
    font-size: 100px;
    right: 0;
    top: 0;
    opacity: 0;
}
.file:hover {
    text-decoration: none;
    cursor: pointer;
}
.upload_but{
    width: 100px;
    height: 30px;
    line-height: 30px;
    text-align: center;
    font-size: 13px;
    border-radius: 5px;
    border: 1px #9999 solid;
    /* font-weight: 700; */
  }
  .upload_but:hover{
      cursor: pointer;
    }
  .upload_name{
      display: flex;
      font-size: 13px;
      align-items: center;
      justify-content: space-between;
      /* margin-top: 10px; */
      width: 80%;
      /*  */
      /* background-color: red; */
      .left{
          flex:1;
          padding-top: 5px;
      }
      .name{
          flex: 6;
          color: #60a7e6;
          margin-left: 10px;
          /* margin: 0 5px 0 20px; */
      }
      .operate{
          flex: 2;
          display: flex;
        .down{
            margin: 0 10px;
        }
        .dele{}
      }

  }

</style>
//使用
 <app-upload v-model:value="spirit.audio.url" :request="uploadAudio" accept='audio/mp3' name="音频"></app-upload>

//value是上传路径
//接收子组件最后传过来的文件//accept传给子组件类型//name传给子组件的名词

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在BladeX前端框架中,可以使用axios作为HTTP请求的库。要自定义封装wrapper,可以在axios的拦截器中进行配置。 具体步骤如下: 1. 在src/utils/request.js中创建一个axios实例,并导出该实例。 ``` import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) export default service ``` 2. 在该实例中设置请求拦截器和响应拦截器,这两个拦截器会在请求发送和响应返回时自动触发。 ``` import axios from 'axios' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 5000 }) // 请求拦截器 service.interceptors.request.use( config => { // 在请求发送之前做一些处理,例如添加token等 return config }, error => { // 处理请求错误 console.log(error) return Promise.reject(error) } ) // 响应拦截器 service.interceptors.response.use( response => { // 在响应返回之前做一些处理,例如统一处理错误码等 const res = response.data if (res.code !== 200) { // 处理错误码 console.log(res.msg) return Promise.reject(new Error(res.msg || 'Error')) } else { return res } }, error => { // 处理响应错误 console.log('err' + error) return Promise.reject(error) } ) export default service ``` 3. 在src/api下定义接口文件,例如demo.js。 ``` import request from '@/utils/request' export function getDemoList(params) { return request({ url: '/demo/list', method: 'get', params }) } export function addDemo(data) { return request({ url: '/demo/add', method: 'post', data }) } ``` 4. 在需要使用接口的组件中引入定义好的接口文件,并调用接口。 ``` import { getDemoList, addDemo } from '@/api/demo' export default { data() { return { demoList: [] } }, mounted() { this.getDemoList() }, methods: { getDemoList() { getDemoList({}).then(response => { this.demoList = response.data }).catch(error => { console.log(error) }) }, addDemo() { addDemo({}).then(response => { console.log(response) }).catch(error => { console.log(error) }) } } } ``` 以上就是在BladeX前端框架中自定义封装wrapper的步骤。通过自定义封装wrapper,可以方便地统一处理请求和响应,在开发过程中提高效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值