最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實(shí)現(xiàn)打印指定組件內(nèi)容的示例詳解

 更新時(shí)間:2024年03月11日 09:43:19   作者:不要止步于此  
這篇文章主要和大家分享一下vue中打印指定組件內(nèi)容,多頁(yè)打印自動(dòng)適配紙張大小打印的方案,文中的示例代碼講解詳細(xì),需要的可以參考一下

前言

大家好,最近在做vue項(xiàng)目時(shí)使用到了print-js打印指定組件內(nèi)容,并且還得切換紙張大小時(shí)做到自動(dòng)適配布局的需求,其中遇到了一些問題及我的解題思路想給大家分享一下,希望日后能幫助到大家。

背景

大致需求是在頁(yè)面中提供一個(gè)多選框組,可以從中選擇打印哪些內(nèi)容,每個(gè)勾選項(xiàng)打印格式都是一樣的,不同的是每個(gè)勾選項(xiàng)獨(dú)占一頁(yè),且響應(yīng)式適配紙張大小,大致效果如下圖所示:

了解需求后,我們開始做開發(fā)準(zhǔn)備工作!

引入print-js,并封裝打印函數(shù)

npm install print-js@1.3.1

usePrint.js

import printJS from 'print-js'

export const usePrint = () => {
  printJS({
    // 需要打印區(qū)域設(shè)置的Id
    printable: 'print-area',
    // 打印類型
    type: 'html',
    // 默認(rèn)值為800,我們把把設(shè)置為100%
    maxWidth: '100%', 
    // *代表應(yīng)用所有樣式,默認(rèn)值為null,如果不設(shè)置,打印窗口則會(huì)忽略所有樣式
    targetStyles: ['*'],
  });

上面主要注意點(diǎn)是注意點(diǎn)是修改maxWidth的默認(rèn)值及設(shè)置targetStyles應(yīng)用組件所寫的樣式。想要了解更多可參考:print-js文檔

封裝打印選擇器及打印內(nèi)容組件

引入插件后,我們先把打印的組件結(jié)構(gòu)先寫好,下面先把打印內(nèi)容選擇器結(jié)構(gòu)寫好

PrintSelector.vue

<template>
  <div>
    <!-- 這里是我們封裝的打印組件 -->
    <PrintArea :data="printData" />
    <el-checkbox :value="checkAll" @change="onCheckAllChange">全選</el-checkbox>
    <div style="margin: 15px 0;"></div>
    <el-checkbox-group v-model="checkedItems" @change="onCheckedChange">
      <el-checkbox v-for="item in options" :label="item.id" :key="item.id">{{item.label}}</el-checkbox>
    </el-checkbox-group>
    <div style="margin: 15px 0;"></div>
    <el-button @click="onPrint">打印</el-button>
  </div>
</template>

<script>
import { usePrint } from './hooks/usePrint'
import PrintArea from './PrintArea.vue'
export default {
  components: {
    PrintArea
  },
  data() {
    return {
      checkedItems: [],
      options: [
        { id: 1, label: '項(xiàng)目1' },
        { id: 2, label: '項(xiàng)目2' },
        { id: 3, label: '項(xiàng)目3' },
      ]
    }
  },
  computed: {
    checkAll() {
      return this.checkedItems.length === this.options.length;
    },
    printData() {
      return this.options.filter(item => this.checkedItems.includes(item.id))
    }
  },
  methods: {
    onCheckAllChange() {
      if(this.checkAll) {
        this.checkedItems = []
      } else {
        this.checkedItems = this.options.map(item => item.id)
      }
    },
    onCheckedChange(val) {
      this.checkedItems = val
    },
    onPrint() {
      usePrint()
    }
  },
}
</script>

注意,上面我們把需要打印的組件PrintArea引入到了PrintSelector組件中,因?yàn)樵谡{(diào)用printJS方法時(shí)需要通過id獲取頁(yè)面dom元素,所以需要組件的dom元素渲染到頁(yè)面中來,但是我們又不希望頁(yè)面中顯示打印的內(nèi)容,這里可以通過設(shè)置display: none把元素隱藏起來。但,隱藏后有一個(gè)需要注意的點(diǎn),我們先把PrintArea組件寫出來,后面再進(jìn)行講解。

PrintArea.vue

<template>
  <div id="print-area" v-show="false">
    <div class="item" v-for="item in data" :key="item.id">
      <div class="head">頭部</div>
      <div class="main">
        <span class="text">{{ item.label }}</span>
      </div>
      <div class="footer">底部</div>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    data: Array
  }
}
</script>

這個(gè)組件就是我們需要打印的內(nèi)容,外部勾選需要打印的內(nèi)容后傳入當(dāng)前組件即可,每一個(gè)item代表著一頁(yè)。我們回到前文提到的設(shè)置display:none時(shí)的問題,我們給idprint-area打印內(nèi)容跟標(biāo)簽隱藏了起來,如果這時(shí)選擇項(xiàng)目點(diǎn)擊打印后,會(huì)發(fā)現(xiàn)打印預(yù)覽窗口為空白?。。?/p>

其實(shí)問題就是出現(xiàn)給打印區(qū)域設(shè)置了display:none,所以打印預(yù)覽窗口也把內(nèi)容隱藏了,解決辦法也簡(jiǎn)單,就是給打印區(qū)域再套一層div,把v-show="false"設(shè)置在外層div上即可。

<template>
  <div v-show="false">
    <div id="print-area">
      ...省略其中代碼
    </div>
  </div>
</template>

這樣子打印窗口就能正常顯示內(nèi)容了。

我們下面通過一個(gè)小例子模擬打印預(yù)覽講解一下這個(gè)問題出現(xiàn)的原因:

demo.html

<body>
  <div class="wrapper">
    <!-- 打印區(qū)域 -->
    <div id="print-area" style="display: none;">
      <div class="item">111</div>
      <div class="item">222</div>
    </div>
  </div>
  <!-- 模擬打印預(yù)覽窗口 -->
  <div id="print-window"></div>
  <script>
    window.onload = function() {
      const printArea = document.getElementById('print-area')
      const printWindow = document.getElementById('print-window')
      // 把打印內(nèi)容放入打印預(yù)覽窗口
      printWindow.appendChild(printArea)
    }
  </script>
</body>

上面我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的模擬打印流程,在打印區(qū)域的div上設(shè)置了display: none,所以調(diào)用appendChild放入模擬的打印窗口div下時(shí),頁(yè)面并沒有內(nèi)容顯示,因?yàn)?code>print-area樣式還是設(shè)置為隱藏。所以我們通過在外面增加一層用來設(shè)置隱藏樣式的div。這樣,我們獲取idprint-areadom元素后,當(dāng)前元素上沒有設(shè)置隱藏樣式,所以appendChild放到打印預(yù)覽窗口,就不會(huì)隱藏打印的內(nèi)容了!

頁(yè)面布局設(shè)計(jì)

我們?cè)?code>PrintArea.vue文件中先把樣式補(bǔ)上,看下效果

<style lang="scss" scoped>
#print-area {
  background-color: deeppink;
  .item {
    display: flex;
    flex-direction: column;
    background-color: bisque;
    .head {
      text-align: center;
      line-height: 100px;
      font-weight: bold;
      font-size: 36px;
      background-color: azure;
    }
    .main {
      flex: 1;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .footer {
      text-align: center;
      line-height: 100px;
      font-weight: bold;
      font-size: 20px;
      background-color: #eee;
    }
  }
}
</style>

我們的需求是根據(jù)每個(gè)item進(jìn)行分頁(yè)打印,分頁(yè)實(shí)現(xiàn)可以直接在.item下設(shè)置page-break-after: always;樣式即可,但是還有一個(gè)需求是怎樣能夠讓item響應(yīng)式適應(yīng)紙張大小,占滿整個(gè)區(qū)域呢?第一想到的就是height: 100%,但,這樣就得保證每一層父組件的高度為頁(yè)面文檔的高度100%。好像不太理想,那設(shè)置每一頁(yè)item的高度為100vh呢?下圖可看出也并沒有達(dá)到想要的效果:

解決辦法是讓打印區(qū)域脫離文檔流,設(shè)置一個(gè)絕對(duì)定位

#print-area {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  .item {
    height: 100%;
  }
}

上面我們巧用絕對(duì)定位的上下左右距離都為0,使容器能撐滿整個(gè)紙張大小,最后給每一頁(yè)item繼承100%高度,這樣子布局就能夠適應(yīng)各種紙張大小了,即使切換紙張也能夠達(dá)到撐滿整個(gè)容器的效果。

總結(jié)

以上我們主要是通過在打印內(nèi)容區(qū)域外設(shè)置v-show="false"來隱藏元素,使打印內(nèi)容不受隱藏影響,并通過一個(gè)小demo演示了問題出現(xiàn)的原因;接著我們通過在每個(gè)item下設(shè)置page-break-after: always;實(shí)現(xiàn)分頁(yè);最后通過絕對(duì)定位使容器撐滿整個(gè)紙張,以達(dá)到切換紙張大小時(shí)也能撐滿整個(gè)容器的效果。

到此這篇關(guān)于vue實(shí)現(xiàn)打印指定組件內(nèi)容的示例詳解的文章就介紹到這了,更多相關(guān)vue打印指定組件內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue element-ui里的table中表頭與表格出現(xiàn)錯(cuò)位的解決

    vue element-ui里的table中表頭與表格出現(xiàn)錯(cuò)位的解決

    這篇文章主要介紹了vue element-ui里的table中表頭與表格出現(xiàn)錯(cuò)位的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue中圖片的引用方式的區(qū)別詳解

    Vue中圖片的引用方式的區(qū)別詳解

    在?Vue?開發(fā)中,圖片的引用方式主要取決于圖片存放的位置,一般有四種常用的存放方式,本文將詳細(xì)分析這些方式的區(qū)別,并提供完整的代碼示例,希望對(duì)大家有所幫助
    2025-02-02
  • Vue.js圖片預(yù)覽插件使用詳解

    Vue.js圖片預(yù)覽插件使用詳解

    Vue是一套用于構(gòu)建用戶界面的漸進(jìn)式框架。這篇文章主要介紹了Vue.js圖片預(yù)覽插件的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • vue中el-checkbox、el-switch綁定值問題詳解

    vue中el-checkbox、el-switch綁定值問題詳解

    這篇文章主要給大家介紹了關(guān)于vue中el-checkbox、el-switch綁定值問題的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • vue?同局域網(wǎng)訪問不到的問題及解決

    vue?同局域網(wǎng)訪問不到的問題及解決

    這篇文章主要介紹了vue?同局域網(wǎng)訪問不到的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue超出文本框顯示省略號(hào)鼠標(biāo)滑入顯示全部的實(shí)現(xiàn)方法

    Vue超出文本框顯示省略號(hào)鼠標(biāo)滑入顯示全部的實(shí)現(xiàn)方法

    在Vue項(xiàng)目中經(jīng)常需要處理文本內(nèi)容過長(zhǎng)的情況,這篇文章主要給大家介紹了關(guān)于Vue超出文本框顯示省略號(hào)鼠標(biāo)滑入顯示全部的實(shí)現(xiàn)方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 在Vue框架下實(shí)現(xiàn)表格行合并的兩種方法

    在Vue框架下實(shí)現(xiàn)表格行合并的兩種方法

    本文介紹了ElementUI和Antd+Vue中el-table和a-table實(shí)現(xiàn)行合并的方法,包括基本使用、實(shí)現(xiàn)步驟、示例代碼等,通過自定義計(jì)算合并行數(shù)的方法,可以靈活實(shí)現(xiàn)表格數(shù)據(jù)的合并顯示,提升數(shù)據(jù)的可讀性和用戶體驗(yàn),需要的朋友可以參考下
    2026-04-04
  • Vue?中ref()和?reactive()響應(yīng)式數(shù)據(jù)的使用方法

    Vue?中ref()和?reactive()響應(yīng)式數(shù)據(jù)的使用方法

    article介紹Vue3中ref()和reactive()函數(shù)的使用方法,ref()用于創(chuàng)建基本數(shù)據(jù)類型的響應(yīng)式引用,reactive()用于創(chuàng)建響應(yīng)式對(duì)象,本文介紹Vue中ref()和reactive()響應(yīng)式數(shù)據(jù)的使用方法,感興趣的朋友一起看看吧
    2025-01-01
  • vue中如何給靜態(tài)資源增加路由前綴

    vue中如何給靜態(tài)資源增加路由前綴

    這篇文章主要介紹了vue中如何給靜態(tài)資源增加路由前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue + axios get下載文件功能

    vue + axios get下載文件功能

    這篇文章主要為大家詳細(xì)介紹了vue + axios get下載文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評(píng)論

军事| 肃南| 大埔县| 崇左市| 汤原县| 南丰县| 永定县| 松滋市| 靖宇县| 中阳县| 大渡口区| 麻栗坡县| 资讯 | 无锡市| 抚松县| 三穗县| 桓台县| 秦皇岛市| 乐业县| 桦川县| 景泰县| 聂荣县| 南川市| 镇沅| 江都市| 梧州市| 铁岭市| 潍坊市| 惠东县| 宽城| 镇沅| 天台县| 逊克县| 阿巴嘎旗| 广德县| 盱眙县| 昭觉县| 岑溪市| 利川市| 乐至县| 五指山市|