vue项目中附件下载方法封装,并提取成全局共用方法

该博客介绍了如何在Vue项目中创建一个全局方法`GLOBAL.vue`,用于封装附件下载功能。通过此方法,可以避免在多个页面重复编写下载代码。文章详细展示了下载方法的实现,包括根据文件类型设置下载头,并使用Blob和a标签实现文件下载。此外,还展示了在`main.js`和具体组件中如何引用和使用这个全局方法。

如果项目中有多个页面用到附件下载的方法,那么可以将这个方法封装成一个全局方法,减少重复代码。

main.js同级目录下新建一个GLOBAL.vue文件,在里面可以声明很多全局共用方法。

>> GLOBAL.vue
<scirpt>
import { fileDownload } from '../HTTP/myApis'

const downloadAttachment = async (fileid, rename, type) => {
  await fileDownload({id: fileid, type: type}).then(res => {
    if(res.code == 0) {
      instance.$message.error('附件下载出错:' + res.msg)
    }else {
      let extentionType = rename.substring(rename.lastIndexOf('.')).toLowerCase();
      let fileType =  ''
      switch(extentionType) {
        case '.doc':
          fileType = 'application/msword'
          break
        case '.txt':
          fileType = 'text/plain'
          break
        case '.docx':
          fileType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
          break
        case '.xls':
          fileType = 'application/vnd.ms-excel'
          break
        case '.xlsx':
          fileType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
          break
        case '.jpg':
          fileType = 'image/jpeg'
          break
        case '.png':
          fileType = 'image/png'
          break
        case '.ppt':
          fileType = 'application/vnd.ms-powerpoint'
          break
        case '.pdf':
          fileType = 'application/pdf'
          break
        case '.zip':
          fileType = 'application/zip'
          break
        default:
          break
      }
      let blob = new Blob([res], {type: fileType});
      var link = document.createElement("a");
      link.href = window.URL.createObjectURL(blob);
      link.download = rename
      link.click();
    }
  })
}

export default ({
	downloadAttachment 
})
</scirpt>

使用方法:

>> main.js
import global_ from './Global.vue'
Vue.prototype.GLOBAL = global_

>> xx.vue
this.GLOBAL.downloadAttachment(a, b, c);
### Vue项目中不依赖额外框架进行组件或功能封装方法Vue项目中,即使不使用额外的框架,也可以通过合理利用Vue的核心特性来实现组件或功能的封装。以下是一些常见的封装方法及其具体实现方式: #### 1. 父子组件通信 父子组件之间的通信是Vue项目中非常常见的需求。可以通过`props`和`emit`实现数据的双向传递[^1]。 - **父组件向子组件传递数据**:通过`props`将数据从父组件传递到子组件。 - **子组件向父组件传递事件**:通过`$emit`触发自定义事件,父组件监听该事件处理逻辑。 ```vue <!-- 子组件 Child.vue --> <template> <div> <p>子组件接收到的数据: {{ message }}</p> <button @click="sendDataToParent">发送数据给父组件</button> </div> </template> <script> export default { props: { message: String, }, methods: { sendDataToParent() { this.$emit("child-event", "这是子组件发送的数据"); }, }, }; </script> ``` ```vue <!-- 父组件 Parent.vue --> <template> <div> <child :message="parentMessage" @child-event="handleChildEvent"></child> <p>父组件接收到的数据: {{ childData }}</p> </div> </template> <script> import Child from "./Child.vue"; export default { components: { Child }, data() { return { parentMessage: "这是父组件的数据", childData: "", }; }, methods: { handleChildEvent(data) { this.childData = data; }, }, }; </script> ``` #### 2. 插槽(Slot)的使用 插槽允许父组件向子组件注入内容,从而增强组件的灵活性。可以使用默认插槽、具名插槽和作用域插槽[^1]。 ```vue <!-- 子组件 SlotDemo.vue --> <template> <div> <header><slot name="header"></slot></header> <main><slot></slot></main> <footer><slot name="footer"></slot></footer> </div> </template> ``` ```vue <!-- 父组件 Parent.vue --> <template> <slot-demo> <template #header> <h1>这是头部内容</h1> </template> <p>这是主体内容</p> <template #footer> <p>这是底部内容</p> </template> </slot-demo> </template> <script> import SlotDemo from "./SlotDemo.vue"; export default { components: { SlotDemo }, }; </script> ``` #### 3. 全局图标组件封装Vue 3.0中,可以通过配置`svg-sprite-loader`来封装SVG图标组件,而无需依赖额外的UI框架[^2]。 - 配置`vue.config.js`以支持SVG图标加载: ```javascript const path = require("path"); function resolve(dir) { return path.join(__dirname, dir); } module.exports = { chainWebpack(config) { config.module.rule("svg").exclude.add(resolve("src/icons")).end(); config.module .rule("icons") .test(/\.svg$/) .include.add(resolve("src/icons")) .end() .use("svg-sprite-loader") .loader("svg-sprite-loader") .options({ symbolId: "icon-[name]", }) .end(); }, }; ``` - 创建一个`Icon`组件用于动态渲染SVG图标: ```vue <!-- Icon.vue --> <template> <svg class="icon" aria-hidden="true"> <use :xlink:href="`#icon-${name}`"></use> </svg> </template> <script> export default { props: { name: { type: String, required: true, }, }, }; </script> ``` #### 4. Mixins 的使用 Mixins 是一种分发 Vue 组件复用功能的灵活方式。可以将多个组件共用的逻辑提取到一个单独的文件中,通过`mixins`选项引入[^1]。 ```javascript // mixins/sharedLogic.js export default { methods: { sharedMethod() { console.log("这是一个共享方法"); }, }, }; ``` ```vue <!-- ComponentA.vue --> <template> <div> <button @click="sharedMethod">调用共享方法</button> </div> </template> <script> import sharedLogic from "./mixins/sharedLogic"; export default { mixins: [sharedLogic], }; </script> ``` #### 5. 自定义指令 自定义指令可以用来封装一些通用的DOM操作逻辑。例如,实现一个聚焦输入框的功能[^1]。 ```javascript // 自定义指令 focus.js export default { mounted(el) { el.focus(); }, }; ``` ```vue <!-- 使用自定义指令的组件 --> <template> <input v-focus /> </template> <script> import vFocus from "./focus"; export default { directives: { focus: vFocus, }, }; </script> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值