一个非常 nb 的 Vue 组件 (含Vue3版本)

简介: 一个非常 nb 的 Vue 组件 (含Vue3版本)

我坚信很多朋友在开发后台管理类项目的过程中,大概率都会碰到打印的需求

倘若您目前还未遭遇这样的需求,也无妨,今日看完,以便日后之需。

今天为大家分享一个超牛的 Vue 打印组件 — vue-print-nb

它是一个针对 Vue.js 的指令包装器,用于达成页面打印功能📄。具备简单、快捷、便利、轻量等出色优点👍。

安装与引入

1. 安装

  • Vue 2 版本npm install vue-print-nb --save
  • Vue 3 版本npm install vue3-print-nb --save

2. 引入(以下是两种常见的引入方式)

Vue 2 版本

  • 全局指令:在 main.js 中添加:
import print from 'vue-print-nb';
Vue.use(print);
  • 局部指令:在单业务页面添加:
import print from 'vue-print-nb';
directives: { print }

Vue 3 版本

  • 全局指令
import { createApp } from 'vue';
import App from './App.vue';
import print from 'vue3-print-nb';
const app = createApp(App);
app.use(print);
app.mount('#app');
  • 局部指令
import print from 'vue3-print-nb';
directives: { print }

使用方法

1. 打印整个页面

只需添加:

<button v-print>打印整个页面</button>

2. 打印局部范围

  • HTML 部分
<div id="print-me" style="background: red;">
  <!-- 这里是你要打印的内容 -->
</div>
<button v-print="'#print-me'">打印局部范围</button>
  • 直接传入字符串类型的 ID:id 为局部打印范围的标识符。

3. 打印局部范围更多设置(通过对象进行配置)

  • JavaScript 部分
export default {
  data() {
    return {
      printLoading: true,
      printobj: {
        id: "print-me",
        popTitle: '好的打印标题',
        extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
        extraHead: '<meta http-equiv="content-language" content="zh-cn" />',
        beforeOpenCallback(vue) {
          vue.printLoading = true;
          console.log('打开之前');
        },
        openCallback(vue) {
          vue.printLoading = false;
          console.log('执行了打印');
        }
      }
    };
  }
};
  • HTML 部分
<button v-print="printobj">打印局部范围</button>
<div id="loading" v-show="printLoading"></div>
<div id="print-me" style="background: red;">
  <!-- 这里是你要打印的内容 -->
</div>

4. 打印 URL

  • 直接使用
<button v-print="url">打印 URL</button>
  • 异步加载 URL
asyncUrl(resolve) {
  setTimeout(() => {
    resolve('http://localhost:8080/');
  }, 2000);
}

5. 打印预览

  • 全局预览
<button v-print="printobj">打印预览</button>

其中 printobj 对象中包含预览相关的配置,如 preview: true, previewTitle: '预览的标题', previewPrintBtnLabel: '预览结束,开始打印' 等。

  • 局部预览
<button v-print="printLocalRangePreviewObj">打印局部范围预览</button>

6. v-print API

  • Vue 2 版本:在全局或局部引入后,即可在组件中使用 v-print 指令。
  • Vue 3 版本:与 Vue 2 类似,在相应的引入方式后,可在组件中使用 v-print 指令。

注意事项和解决方法

在使用 vue-print-nb 的过程中,可能会遇到一些小问题,但别担心,我们有办法解决😜!

1. 页眉页脚字符串问题🚩

打印预览时可能会出现页码、网址等 undefined 之类的字符。可以通过设置样式来解决,优点是简单直接,缺点是页面上下边距会消失。可以在打印媒体查询中添加如下样式,将页边距设置为 3mm 来隐藏页眉页脚:

@media print {
  @page {
    size: auto;
    margin: 3mm;
  }
}

2. 打印时内容显示不全问题🚩

如果实际页面中高度不够导致部分内容隐藏,可以在打印媒体查询中添加如下样式,将 body 的高度设置为 auto,使隐藏滚动的内容全部显示:

@media print {
  @page {
    size: auto;
    margin: 3mm;
  }
  body {
    height: auto;
  }
}

3. 打印时样式消失问题🚩

样式消失的根本原因是打印内容外层的样式以及使用的一些框架样式没有被获取到。如果确定需要打印的内容,尽量避免在表格或块内容中使用任何 UI 框架以及外部的 scss 或 less 内容。可以采用内联样式或在内部样式中书写样式。例如:

<div class="box">
  <div id="printtest">
    <div class="print-style">打印的相关内容</div>
  </div>
</div>
<style lang="scss" scoped>
  .box {} // 无效
  #printtest {} // 无效
  .print-style {} // 写在这里的样式才有效果
</style>

4. 打印时需要根据内容分页及添加水印🚩

如果有多个表格或内容块需要分页,可以通过计算进行分页,并为每一页添加水印。例如:

<div id="printtest">
  <div class="printpage printmark" v-for="item in 5" :key="item">
    打印的相关内容
  </div>
</div>
<style media="print" lang="scss">
  @media print {
    @page {
      size: auto;
      margin: 3mm;
    }
    body {
      height: auto;
    }
    .printpage {
      height: 291mm; // 根据实际情况进行分页设置
      position: relative;
      &::before {
        position: absolute;
        content: 'xx 水印';
        top: 20%;
        right: 5%;
        font-size: 48px;
        opacity: 0.1;
        transform: rotate(30deg);
      }
      &::after {
        position: absolute;
        content: 'xx 水印';
        bottom: 20%;
        left: 5%;
        font-size: 48px;
        opacity: 0.1;
        transform: rotate(30deg);
      }
    }
  }
</style>

总结

总的来说,vue-print-nb 是一个非常实用的 Vue 打印组件👍,它让页面打印变得简单而高效!

无论是打印整个页面,还是特定的局部范围,甚至是 URL,都能轻松搞定🤩!如果你正在开发 Vue 项目,并且有打印的需求,不妨试试这个组件吧😉!

相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
301 2
|
1月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
280 137
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
403 1
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
259 0
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
777 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1010 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
835 77
|
7月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
5月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
465 17