一、前情提要

1. 需求

根据商品sku打印出条形码,贴在商品盒上

2. 效果 

二、使用前准备

1. 下载 JsBarcode

npm install jsbarcode --save

2. 配置项

3. 封装

import jsbarcode from 'jsbarcode'

export default function renderBarcode(el: HTMLElement, value: string, options: any = {}) {
    const ops = {
        // 默认格式CODE128
        format: 'CODE128',
        // 是否显示条形码数据,可以用文本代替
        displayValue: false,

        // 。。。 其他配置项

        // 。。。 其他配置项

        // 传入的配置项
        ...options
    }
    jsbarcode(el, value, ops)
}

三、代码

1. 效果

2. 使用

<!-- ? 打印条形码模块 -->
<template>
  <div class="print-view">
    <button v-if="showBtn" class="print_btn" @click="printSKU">打印</button>
    <ul class="print_nav">
      <li v-for="(item, index) in printData" :key="item.sku" class="item">
        <svg id="barcode" :ref="(el) => renderBarcode(el as HTMLElement, item.sku)"></svg>
        <div class="sku">
          <span :ref="(el) => renderSize(el as HTMLElement)" class="text">
            {{ item.sku }}
          </span>
        </div>
        <p class="title">
          {{ item.productName }}
        </p>
      </li>
    </ul>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue'
import renderJsbarcode from '../utils/renderJsbarcode'

// 是否显示打印按钮
const showBtn = ref(true)

// 条形码数据
const printData = reactive([
  { sku: 'sku-01', productName: '衬衫-01' },
  { sku: 'sku-02', productName: '衬衫-02' }
])

// 渲染条形码
const renderBarcode = (el: HTMLElement, code: string) => {
  renderJsbarcode(el, code)
}
// 渲染条形码尺寸
const renderSize = (el: HTMLElement) => {
  nextTick(() => {
    const parent = el.parentNode as Element
    if (el.clientWidth > parent.clientWidth) {
      const scale = parent.clientWidth / el.clientWidth
      el.style.transform = `scale(${scale})`
    }
  })
}

// 打印按钮触发
const printSKU = () => {
  showBtn.value = false
  setTimeout(() => {
    window.print()
    showBtn.value = true
  }, 100)
}
</script>

<style lang="scss" scoped>
.print-view {
  position: relative;
  margin: 0 auto;
  margin-bottom: 5mm;
  padding: 1mm 1mm;
  width: 60mm;
  height: 30mm;
  font-size: 13px;
  background-color: #fff;
  text-align: center;
  .print_btn {
    border: 1px solid #2e6da4;
    border-radius: 2px;
    width: 80px;
    height: 35px;
    font-size: 13px;
    color: #fff;
    background-color: #337ab7;
    cursor: pointer;
    margin-bottom: 20px;
  }
  .print_nav {
    list-style: none;
    padding: 0;
    margin: 0;
    .item {
      margin-bottom: 10px;

      #barcode {
        // margin-bottom: 1mm;
        margin-bottom: 0;
        width: 100%;
        height: 15mm;
        object-fit: contain;
      }

      .title {
        overflow: hidden;
        margin: 0 auto;
        width: 90%;
        height: 24px;
        font-size: 10px;
      }

      .sku {
        display: flex;
        justify-content: center;
        margin: 0 auto;
        margin-bottom: 1mm;
        width: 90%;

        span {
          font-weight: 700;
          white-space: nowrap; /* 禁止文本换行 */
          // transform: scale(0.75);
          /* 动态计算! */
        }
      }
    }
  }
}
</style>

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐