当前位置:首页 > VUE

vue实现打印插件

2026-01-19 16:24:32VUE

vue-print-nb 插件实现打印

安装插件:

npm install vue-print-nb --save

全局引入:

import Print from 'vue-print-nb'
Vue.use(Print)

局部使用:

<template>
  <div id="printContent">
    <!-- 需要打印的内容 -->
  </div>
  <button v-print="printConfig">打印</button>
</template>

<script>
export default {
  data() {
    return {
      printConfig: {
        id: 'printContent',
        popTitle: '打印标题',  // 打印窗口标题
        extraCss: 'https://xxx.css',  // 额外CSS
        extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>'  // 额外头部标签
      }
    }
  }
}
</script>

window.print() 原生方法实现

创建打印区域:

<template>
  <div id="printArea">
    <!-- 打印内容 -->
  </div>
  <button @click="handlePrint">打印</button>
</template>

<script>
export default {
  methods: {
    handlePrint() {
      const printContent = document.getElementById('printArea').innerHTML
      const originalContent = document.body.innerHTML

      document.body.innerHTML = printContent
      window.print()
      document.body.innerHTML = originalContent
    }
  }
}
</script>

打印样式控制

添加打印专用样式:

<style>
@media print {
  /* 隐藏不需要打印的元素 */
  .no-print {
    display: none;
  }

  /* 调整打印布局 */
  body {
    margin: 0;
    padding: 0;
  }

  /* 强制分页 */
  .page-break {
    page-break-after: always;
  }
}
</style>

打印图片处理

确保图片加载完成:

methods: {
  printWithImages() {
    const printWindow = window.open('', '_blank')
    printWindow.document.write('<html><head><title>打印</title>')
    printWindow.document.write('<style>@page { size: auto; margin: 0; }</style>')
    printWindow.document.write('</head><body>')

    const images = document.querySelectorAll('#printArea img')
    let loaded = 0

    images.forEach(img => {
      const newImg = new Image()
      newImg.onload = () => {
        loaded++
        if (loaded === images.length) {
          printWindow.document.write(document.getElementById('printArea').innerHTML)
          printWindow.document.write('</body></html>')
          printWindow.document.close()
          printWindow.focus()
          setTimeout(() => {
            printWindow.print()
            printWindow.close()
          }, 500)
        }
      }
      newImg.src = img.src
    })
  }
}

打印表格优化

处理表格分页:

@media print {
  table {
    page-break-inside: auto;
  }
  tr {
    page-break-inside: avoid;
    page-break-after: auto;
  }
  thead {
    display: table-header-group;
  }
  tfoot {
    display: table-footer-group;
  }
}

打印事件监听

添加打印前后事件:

vue实现打印插件

window.matchMedia('print').addListener(mql => {
  if (mql.matches) {
    console.log('打印前处理')
  } else {
    console.log('打印后处理')
  }
})

标签: 插件vue
分享给朋友:

相关文章

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…

vue 实现协同

vue 实现协同

Vue 实现协同编辑的方案 协同编辑指多个用户同时编辑同一文档并实时同步更改。Vue 结合相关库和技术可轻松实现该功能。 使用 WebSocket 实现实时通信 WebSocket 提供全双工通信,…