一个简单的Vue导出封装处理

vue文件

methods: {
 // 调用导出,弹出命名对话框
 exportData () {
    this.$MxfileDownLoad({
      exportfile: this.$t('m.export'),
      fileName: this.$t('m.fileName'),
      confirm: this.$t('m.export'),
      cancel: this.$t('m.cancel'),
      handleConfirm: (name, cbClose) => this.exportConfirm(name, cbClose)
    })
  },
  // 确认导出文件
  exportConfirm (name, cbClose) {
    let parameters = {
      参数
    }
    if (!name) name = this.$t('m.fileName')
     这是一个接口请求,要求返回responseType是blob格式
    this.$api.excel(parameters, 'blob').then(res => {
      this.$filter.tableExport(res, name)
      cbClose()
    })
  },
}

tool.js

// 导出接口的处理
export const tableExport = (res, fileName) => {
  const link = document.createElement('a')
  let blob = new Blob([res], { type: 'application/vnd.ms-excel' })
  link.style.display = 'none'
  link.href = URL.createObjectURL(blob)
  link.setAttribute('download', fileName + '.xlsx')
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}

$MxfileDownLoad 的封装

组件导出index.js 入口

import MxfileDownLoad from './fileDownLoad/index'

const components = [
  MxfileDownLoad,
]

const install = function (Vue) {
  components.map(component => Vue.component(component.name, component))
  Vue.prototype.$MxfileDownLoad = MxfileDownLoad
}

export default {
  install,
  MxfileDownLoad,
}

组件vue模板(/src/index.vue)

<template>
  <!-- 文件导出 -->
  <Modal
    v-model="visible"
    width="300"
    footer-hide
    :mask-closable="false"
    draggable
    class="sod-modal-dialog sod-modal-export"
    @click="visible=false"
    :z-index="11111"
  >
    <p slot="header">
      <span>{{ exportfile }}</span>
    </p>
    <Card style="min-height: auto;">
      <iForm :model="form" :label-width="90" @submit.native.prevent>
        <FormItem :label="fileName">
          <Input v-model="form.fileName"/>
        </FormItem>
      </iForm>
    </Card>
    <div class="footer-button-wrap">
      <Button class="footer-button" @click="handleConfirm(form.fileName)">{{ confirm }}</Button>
      <Button class="footer-button" @click="visible=false">{{cancel}}</Button>
    </div>
  </Modal>
</template>
<script>
export default {
  name: 'fileDownLoad',
  data () {
    return {
      visible: false,
      exportfile: '',
      fileName: '',
      cancel: '',
      confirm: '',
      form: {
        fileName: ''
      }
    }
  },
  methods: {
    handleConfirm () {}
  },
  mounted () {}
}
</script>
<style lang="less">
  .sod-modal-export .ivu-card-body {
    height: 54px!important;
    min-height: auto!important;
  }
</style>

导出js

import Vue from 'vue'
import DownLoad from './src/index.vue'

// 定义一个函数
var FileDownLoad = function (options) {
  // 设置默认值
  let defaults = {
    exportfile: '',
    fileName: '',
    confirm: '',
    cancel: '',
    handleConfirm: null
  }
  // 通过Vue.extend()函数,创建一个Vue构造器 Component
  var Component = Vue.extend(DownLoad)
  // 将传入的值赋值给默认值
  for (let key in options) {
    defaults[key] = options[key]
  }

  // 实例化构造器
  var vm = new Component({
    // 如果没有挂载的话,没有关联的 DOM 元素。是获取不到$el的。
    // 或者new Component({...}).$mount('#main')
    el: document.createElement('div'), // 挂载方式之一
    data () {
      return {
        visible: false,
        form: {
          fileName: ''
        },
        exportfile: defaults.exportfile,
        fileName: defaults.fileName,
        cancel: defaults.cancel,
        confirm: defaults.confirm
      }
    },
    methods: {
      handleConfirm (name) {
        // 从body中移除组件
        let cbClose = () => { document.body.removeChild(vm.$el) }
        // 如果传入了默认的确认方法,则defaults.handleConfirm为真,执行defaults.handleConfirm.call(this)
        defaults.handleConfirm && defaults.handleConfirm.call(this, name, cbClose)
      }
    }
  })
  vm.visible = true
  // 将组件插入body中
  document.body.appendChild(vm.$el)
}

export default FileDownLoad

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Vue 3 中封装一个 table 组件,您需要做以下几步: 1. 定义组件:使用 Vue 3 的 defineComponent 函数定义组件。 2. 定义模板:使用 template 属性定义组件的 HTML 模板。 3. 定义数据:使用 props 属性定义组件所需的数据。 4. 定义方法:使用 methods 属性定义组件的方法。 5. 在组件中使用数据和方法:在模板中使用绑定和事件处理程序来使用数据和方法。 例如,下面是一个简单的 table 组件的示例: ``` import { defineComponent } from 'vue'; export default defineComponent({ name: 'MyTable', props: { rows: { type: Array, required: true } }, methods: { sort(column) { this.rows.sort((a, b) => a[column] > b[column]); } }, template: ` <table> <thead> <tr> <th v-for="column in columns" @click="sort(column)"> {{ column }} </th> </tr> </thead> <tbody> <tr v-for="row in rows"> <td v-for="column in columns"> {{ row[column] }} </td> </tr> </tbody> </table> ` }); ``` 这个组件使用了 props 来接收外部传入的 rows 数据,并使用 methods 定义了一个 sort 方法来排序 rows。在模板中,使用 v-for 指令来循环遍历 rows 和 columns,并使用 @click 指令来处理点击事件,调用 sort 方法。 ### 回答2: Vue3是一款轻量级的JavaScript框架,它允许开发者构建高效且易于维护的用户界面。在Vue3中,我们可以通过封装组件来实现代码的复用和模块化。现在我将用300字的篇幅来回答如何封装一个table组件。 首先,我们需要创建一个新的Vue组件,可以命名为Table。在Table组件中,我们可以通过props来接收传入的属性,例如表格的数据源和列定义。 接下来,我们可以在Table组件的模板中使用Vue的指令和语法来渲染表格。使用v-for指令可以遍历数据源,并根据列定义动态生成表头和表格内容。 在表头部分,我们可以遍历列定义数组,使用v-if指令来判断是否需要显示该列,并根据列定义中的标题属性来渲染表头文字。 在表格内容部分,我们可以利用v-for指令循环遍历数据源,并使用列定义中的字段属性来获取数据,并渲染表格内容。 在Table组件中,我们还可以添加一些事件处理函数,例如点击表头可以进行排序。使用Vue的事件绑定可以实现这一功能。 此外,我们还可以为Table组件添加一些样式,并通过CSS类名动态绑定来实现外部样式的自定义。 最后,我们可以在其他Vue组件中引入Table组件,并传入需要的属性值。这样就可以在应用中多次使用Table组件,实现代码的复用和模块化。 总结起来,封装一个table组件可以通过创建一个Vue组件,并利用Vue的指令和语法来动态渲染表格的表头和内容。通过props来接收传入的属性值,使用事件绑定来实现一些交互功能,还可以为组件添加样式。 ### 回答3: Vue3的封装Table组件可以通过以下步骤实现: 1. 创建一个Table组件的.vue文件,命名为Table.vue。 2. 在Table.vue中,定义组件的模板结构,包括表格的表头和表体。可以使用Vue3语法中的`<template>`标签来编写模板。 3. 定义Table组件的props属性,以接收父组件传入的数据。可以使用Vue3语法中的`<script setup>`标签来定义props。 4. 在Table.vue中,使用Vue3语法中的`<script setup>`标签,引入自定义的composable函数,用于获取和处理表格数据。可以使用Vue3提供的Composition API来编写composable函数。例如,可以使用`onMounted`函数来在组件挂载时获取数据,使用`computed`函数来计算表格的列数等。 5. 在Table.vue中,使用Vue3语法中的`<script setup>`标签,导出Table组件及其props属性。 6. 在父组件中,引入Table组件,并使用`<Table :data="tableData" />`的方式传递数据给Table组件。其中,tableData是父组件中定义的data属性,用于存储表格数据。 7. 在父组件中,可以使用`<script>`标签定义tableData属性,并赋初值。 通过以上步骤,我们可以完成Vue3中Table组件的封装。在实际使用中,可以根据具体需求对Table组件进行进一步的功能扩展和样式优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值