一个非常 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 项目,并且有打印的需求,不妨试试这个组件吧😉!

相关文章
|
14天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
82 1
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
157 64
|
25天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
47 8
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
54 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
49 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
43 1
vue学习第四章
|
2月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
35 1
vue学习第7章(循环)