e-upload.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <div id="e-upload">
  3. <el-upload
  4. :action="url"
  5. :http-request="upload"
  6. :list-type="type"
  7. :fileList="fileList"
  8. :on-remove="onRemove"
  9. :on-error="onError"
  10. :on-preview="onPreview"
  11. :limit="limit"
  12. :on-exceed="onExceed"
  13. :before-remove="beforeRemove"
  14. >
  15. <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
  16. </el-upload>
  17. </div>
  18. </template>
  19. <script>
  20. const _ = require('lodash');
  21. import axios from 'axios';
  22. import { mapState, createNamespacedHelpers } from 'vuex';
  23. export default {
  24. name: 'e-upload',
  25. props: {
  26. url: { type: String, required: true },
  27. type: { type: String, default: 'picture-card' },
  28. fileList: { type: Array },
  29. limit: { type: Number },
  30. remove: { type: Function },
  31. extra: { type: Object, default: () => {} },
  32. },
  33. model: {
  34. prop: 'fileList',
  35. event: 'change',
  36. },
  37. components: {},
  38. created() {},
  39. methods: {
  40. async upload({ file }) {
  41. let formdata = new FormData();
  42. formdata.append('file', file, file.name);
  43. const res = await axios.post(this.url, formdata, {
  44. headers: { 'Content-Type': 'multipart/form-data' },
  45. });
  46. if (res.status === 200 && res.data.errcode == 0) {
  47. const { id, name, uri } = res.data;
  48. const obj = { url: uri, name: file.name, ...this.extra, uid: id };
  49. this.fileList.push(obj);
  50. }
  51. },
  52. beforeRemove(file) {
  53. if (this.remove && _.isFunction(this.remove)) {
  54. const { result, msg } = this.remove(file);
  55. if (!result) {
  56. this.$message.error(msg);
  57. return false;
  58. }
  59. }
  60. return true;
  61. },
  62. onRemove(file) {
  63. const index = this.fileList.findIndex(f => f.url === file.url);
  64. this.fileList.splice(index, 1);
  65. },
  66. onError(err) {
  67. this.$message.error(err);
  68. },
  69. // 点击事件
  70. onPreview(file) {
  71. const { url } = file;
  72. window.open(url);
  73. },
  74. // 超出限制
  75. onExceed() {
  76. this.$message.error(`只能上传${this.limit}个文件`);
  77. },
  78. },
  79. computed: {
  80. ...mapState(['user', 'menuParams']),
  81. pageTitle() {
  82. return `${this.$route.meta.title}`;
  83. },
  84. },
  85. metaInfo() {
  86. return { title: this.$route.meta.title };
  87. },
  88. };
  89. </script>
  90. <style lang="less" scoped>
  91. /deep/.el-upload-list__item.is-ready {
  92. display: none;
  93. }
  94. </style>