vue 打印

本文介绍了如何在Vue3项目中使用vue3-print-nb库进行打印,包括安装步骤、组件引入和配置,以及如何通过模拟数据展示和控制打印样式。适合学习者了解Vue3打印功能的实践应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是基于vue3 进行写vue打印,vue2 只需要改动代码即可。

打印我使用的是vue3-print-nb,vue2也有对应的版本。

1. 安装vue3-print-nb

npm install vue3-print-nb --save

vue2 版本

npm install vue-print-nb --save 

安装完毕后,在vue3中使用是在main.js中进行引入


import print from 'vue3-print-nb'
createApp(App).use(store).use(router)
  .use(ElementPlus)
  .use(print)

 接着就是可以利用vue3-print-nb进行打印啦

我这里打印的数据是mock接口模拟的哦,大家自己也可以尝试着模拟数据过来

2.打印操作

 <el-button v-print="printObj" >打印</el-button>
//  利用v-print进行打印,printObj是一个方法
 <!-- 打印部分的内容,v-show用来控制显示与隐藏,必须要在id的外面上面写,如果在id中写,则打印的内容不生效 -->
  <div v-show='false'>
  <div id='printMe' >
    <!-- 打印的关键在与id,它是利用id进行查找内容进行打印 -->
     <div   v-for="(item,index) in data1" :key="index" >
      <h2 style='text-align:center;'>文章列表</h2>
     <div id='text'>
        <span>姓名:{{item.name}}</span>
        <span>创建时间:{{item.creataAt}}</span>
         <span>价格:{{item.sale}}</span>
          </div>
        <span>描述:{{item.desc}}</span>
    <table align='center'>
      <tr>
        <td colspan="2">第一行</td>
      </tr>
      <tr>
         <td>活动名称:{{form1.name}}</td>
         <td>活动区域:{{form1.region}}</td>
      </tr>
    </table>
      <!-- 用来控制分页 -->
     <div style="page-break-after: always;"></div>
    </div>
  </div>
  </div>

script中的代码

import { ref, onMounted } from 'vue'
import { print1 } from '@/api/index.js'
const form1 = ref({
  name: '',
  region: 'shanghai'
})
const printObj = ref({
  id: 'printMe', // 打印哪一部分的名字
  popTitle: 'good print' // 打印的标题
})
const data1 = ref([])
const getprint1 = async () => {
  const res = await print1()
  if (res.data.code === 200) {
    data1.value = res.data.data.list
  }
  console.log(data1.value)
}
onMounted(() => {
  getprint1()
})

打印的样式写法:一定不要 使用class 哦,可能在后续打包的过程中导致样式失效,可以使用media或者是行内样式来解决这个问题。

这里在style的上面,写media=‘printMe’ printMe就是你要打印的地方的名字是什么,然后根据id=printMe就可以设置它的样式。

<style lang="scss" media='printMe' scoped>
// 非打印部分的样式
#uu{
  background-color:blue;
}
// 打印部分的样式
#printMe  {
  #text{
   width:100%;
    background-color:blue;
    display:flex;
    height:120px;
     flex-wrap: wrap;
    span{
      width:33.3%;
      align-self:center;

    }
  }
  table{
    text-align: center;
    width:50%;
    height:100px;
    border-collapse: collapse;
  }
  td{
    border:1px solid black;

  }
   #printMe   ::-webkit-scrollbar {
  display: none; /* Chrome Safari */
}

  }
</style>

打印效果如下:

 

页面展示效果如下:

 

最后附上完整代码:

<template>
  <div>
    <!-- 在页面中显示打印的内容 -->
  <div  style='height:400px; overflow:auto;'>
     <div  v-for="(item,index) in data1" :key="index" >
      <h2 style='text-align:center;'>文章列表</h2>
     <div id='text'>
        <span>姓名:{{item.name}}</span>
        <span>创建时间:{{item.creataAt}}</span>
         <span>价格:{{item.sale}}</span>
          </div>
        <span>描述:{{item.desc}}</span>
    <table align='center'>
      <tr>
        <td colspan="2">第一行</td>
      </tr>
      <tr>
         <td>活动名称:{{form1.name}}</td>
         <td>活动区域:{{form1.region}}</td>
      </tr>
    </table>
    </div>
  </div>

  <!-- 打印部分的内容,v-show用来控制显示与隐藏,必须要在id的外面上面写,如果在id中写,则打印的内容不生效 -->
  <div v-show='false'>
  <div id='printMe' >
    <!-- 打印的关键在与id,它是利用id进行查找内容进行打印 -->
     <div   v-for="(item,index) in data1" :key="index" >
      <h2 style='text-align:center;'>文章列表</h2>
     <div id='text'>
        <span>姓名:{{item.name}}</span>
        <span>创建时间:{{item.creataAt}}</span>
         <span>价格:{{item.sale}}</span>
          </div>
        <span>描述:{{item.desc}}</span>
    <table align='center'>
      <tr>
        <td colspan="2">第一行</td>
      </tr>
      <tr>
         <td>活动名称:{{form1.name}}</td>
         <td>活动区域:{{form1.region}}</td>
      </tr>
    </table>
      <!-- 用来控制分页 -->
     <div style="page-break-after: always;"></div>
    </div>
  </div>
  </div>
 <el-button v-print="printObj" >打印</el-button>

  <div>
       <el-form ref="form" :model="form1" label-width="80px" id='uu'>
             <el-form-item label="活动名称">
               <el-input v-model="form1.name"></el-input>
             </el-form-item>
     <el-form-item label="活动区域">
             <el-select v-model="form1.region" placeholder="请选择活动区域">
               <el-option label="区域一" value="shanghai"></el-option>
               <el-option label="区域二" value="beijing"></el-option>
             </el-select>
    </el-form-item>
       </el-form>
    </div>
  </div>
</template>

<script  setup>
import { ref, onMounted } from 'vue'
import { print1 } from '@/api/index.js'
const form1 = ref({
  name: '',
  region: 'shanghai'
})
const printObj = ref({
  id: 'printMe', // 打印哪一部分的名字
  popTitle: 'good print' // 打印的标题
})
const data1 = ref([])
const getprint1 = async () => {
  const res = await print1()
  if (res.data.code === 200) {
    data1.value = res.data.data.list
  }
  console.log(data1.value)
}
onMounted(() => {
  getprint1()
})
</script>

<style lang="scss" media='printMe' scoped>
// 非打印部分的样式
#uu{
  background-color:blue;
}
// 打印部分的样式
#printMe  {
  #text{
   width:100%;
    background-color:blue;
    display:flex;
    height:120px;
     flex-wrap: wrap;
    span{
      width:33.3%;
      align-self:center;

    }
  }
  table{
    text-align: center;
    width:50%;
    height:100px;
    border-collapse: collapse;
  }
  td{
    border:1px solid black;

  }
   #printMe   ::-webkit-scrollbar {
  display: none; /* Chrome Safari */
}

  }
</style>

<think>好的,我现在需要回答用户关于如何在Vue中实现打印功能的示例。用户提到了几个引用来源,主要是关于vue-print-nb插件的使用。首先,我要确保自己了解这个插件的使用方法,然后根据用户提供的引用信息来组织回答。 首先,我应该检查用户提供的引用内容。引用[1]到[4]都提到了使用vue-print-nb插件在Vue项目中实现打印功能。引用[2]和[3]详细说明了安装和配置步骤,包括全局挂载和局部指令的使用。引用[4]还提到了Vue2中的使用方法。看来用户需要的是一个具体的示例,展示如何集成这个插件并实现打印。 接下来,我需要组织回答的结构,确保符合用户的要求:结构清晰,分步骤说明,并且引用相关文献。可能需要分几个部分,比如安装插件、全局或局部注册、模板中的使用,以及可能的样式调整。同时,用户提到了示例代码,所以需要提供实际的代码片段,比如在组件中如何应用指令。 另外,要注意用户提到的系统级指令,比如数学公式的格式,但在这个问题中可能不涉及数学内容,所以可以忽略这部分。但必须确保回答使用中文,生成相关问题,并且在引用后添加标识符。例如,在提到安装插件时,引用[3]和[4]中的信息,末尾加上[^3][^4]。 需要确认vue-print-nb的使用步骤是否正确。根据引用内容,安装是通过npm安装,然后在main.js中全局引入,或者在单个组件中引入。然后在需要打印的元素上使用v-print指令,并绑定一个打印参数,比如id或类名。可能还需要处理打印时的样式问题,因为打印样式可能需要@media print媒体查询来调整。 还需要考虑用户可能的疑问,比如如何自定义样式、处理打印预览,或者处理分页等问题。不过用户主要需要的是一个示例,所以重点放在基本实现上,但也提到扩展的可能性,如设计小票样式,这可以引用引用[1]中的内容。 然后,在生成相关问题部分,需要提出与Vue打印功能相关的其他问题,比如如何优化打印样式、处理分页,或者比较不同的打印插件。确保问题与主题相关,并且能引导用户进一步探索。 最后,检查回答是否符合所有要求:结构清晰、步骤正确、引用正确,代码示例格式正确,使用中文,没有使用markdown,并且自然添加引用标识。确保没有遗漏任何系统级指令中的要求,比如数学公式的格式,但在这个问题中可能不需要。</think>在Vue中实现打印功能可通过`vue-print-nb`插件快速实现,以下是具体实现步骤和示例: --- ### 一、安装插件 通过npm安装依赖: ```bash npm install vue-print-nb --save ``` --- ### 二、全局注册(推荐) 在`main.js`中全局挂载指令: ```javascript import Vue from &#39;vue&#39; import Print from &#39;vue-print-nb&#39; Vue.use(Print) // 注册全局指令v-print ``` --- ### 三、组件中使用 1. **模板定义打印区域** 使用`v-print`指令绑定打印目标容器的ID或类名: ```vue <template> <div> <button v-print="printOptions">打印</button> <div id="printContent"> <!-- 需要打印的内容 --> <h1>订单小票</h1> <p>订单号:20231001</p> </div> </div> </template> ``` 2. **配置打印参数** 在组件中定义打印配置: ```javascript export default { data() { return { printOptions: { id: &#39;printContent&#39;, // 指定打印区域的ID popTitle: &#39;订单详情&#39;, // 打印窗口标题(可选) extraCss: &#39;https://example.com/print.css&#39;, // 自定义打印样式(可选) } } } } ``` --- ### 四、自定义打印样式 通过CSS媒体查询`@media print`调整打印效果: ```css @media print { /* 隐藏非打印元素 */ .no-print { display: none; } /* 调整打印内容布局 */ #printContent { width: 80mm !important; /* 小票宽度 */ font-size: 12px; } } ``` --- ### 五、扩展功能(引用示例) 1. **设计小票样式**:通过HTML+CSS定制小票模板,支持表格、图标等复杂内容[^1] 2. **添加打印预览**:结合`window.print()`或第三方库实现预览功能[^2] 3. **局部打印**:仅打印页面指定区域,避免干扰内容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值