如何实现打印功能

发布于:2025-07-29 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、AI赋能提供思路

基本框架

<!-- 隐藏的打印内容(默认不显示) -->
<div id="print-container" style="display: none;">
  <h1>退货单打印内容</h1>
  <table>
    <!-- 打印专用的表格结构 -->
  </table>
</div>

<script>
export default {
  methods: {
    handlePrint() {
      // 临时显示打印内容
      document.getElementById('print-container').style.display = 'block';
      
      // 调用打印
      window.print();
      
      // 打印完成后隐藏(需延迟执行,确保打印已触发)
      setTimeout(() => {
        document.getElementById('print-container').style.display = 'none';
      }, 500);
    }
  }
}
</script>

二、具体实操

1.实现显示页面

主要设计:按钮区、主表格区、打印区

<div class="button">
      <el-button size="mini" type="primary"
      @click="handlePrint">打印</el-button>
    </div>
    <div class="tableData">
      <el-table :data="tableData" ref="multiTable" @selection-change="handleSelection">
        <el-table-column type="selection"></el-table-column>
        <el-table-column prop="id" label="ID"></el-table-column>
        <el-table-column prop="name" label="名字"></el-table-column>
        <el-table-column prop="category" label="种类"></el-table-column>
        <el-table-column prop="price" label="价格"></el-table-column>
        <el-table-column prop="stock" label="库存"></el-table-column>
        <el-table-column prop="date" label="时间"></el-table-column>
      </el-table>
    </div>
    <div id="printData" style="display: none;">
      <h2>库存表格</h2>
      <table>
        <thead>
          <tr>
            <th>序号</th>
            <th>名字</th>
            <th>种类</th>
            <th>价格</th>
            <th>库存</th>
            <th>时间</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(row,index) in selectRow" :key="row.id">
            <th>{{ index+1 }}</th>
            <th>{{ row.name }}</th>
            <th>{{ row.category }}</th>
            <th>{{ row.price }}</th>
            <th>{{ row.stock }}</th>
            <th>{{ row.date }}</th>
          </tr>
        </tbody>
      </table>
    </div>

2.准备基础数据

响应信息

{
  "code": 200,
  "message": "success",
  "data": [
    {
      "id": 1,
      "name": "华为Mate 60 Pro",
      "category": "手机",
      "price": 6999,
      "stock": 120,
      "date": "2023-10-01"
    },
    {
      "id": 2,
      "name": "苹果iPhone 15",
      "category": "手机",
      "price": 7999,
      "stock": 85,
      "date": "2023-09-20"
    }
  ]
}

数据接收

data() {
    return {
      tableData: [],
      loading: false
    };
  },
  methods: {
    async fetchData() {
      this.loading = true;
      try {
        const response = await axios.get('/mock/tableData.json');
        this.tableData = response.data.data;
      } catch (error) {
        console.error('获取数据失败', error);
      } finally {
        this.loading = false;
      }
    }
  },
  mounted() {
    this.fetchData();
  }
};

三、逻辑实现

methods:{
    handleSelection(row){
      this.selectRow=row
    },
    handlePrint(){
      // 1.打印模板
      const printTemplate=document.getElementById("printData");
      // 2. 显示打印模板(默认隐藏)
      const originalDisplay = printTemplate.style.display;
      printTemplate.style.display = "block";
      
      // 3. 调用浏览器打印功能
      window.print();
      
      // 4. 恢复模板隐藏状态
      printTemplate.style.display = originalDisplay;
    }
  }

四、样式设置

@media print {
  /* 隐藏类名是tableData和button的组件内容 */
  .tableData, .button {
    display: none !important;
  }
  
  /* 确保在id为printData的组件中显示 */
  #printData {
    display: block !important;
  }
}
h2 {
text-align: center;
 margin: 20px 0;
}

table {
  border-collapse: collapse; /* 合并边框 */
  width: 100%;
  margin: 0 auto;
  display: flex;/* 弹性布局实现动态对齐 */
}
th, td {
  border: 1px solid #ddd; /* 单元格边框 */
  padding: 8px;
  text-align: left;
}
th {
  background-color: #f5f5f5; /* 表头灰色背景 */
}

常见的表格布局

基础流式:本实操中的

<div class="table-container">
  <table>
    <thead>
      <tr>
        <th>列1</th>
        <th>列2</th>
        <th>列3</th>
      </tr>
    </thead>
    <tbody>
      <tr><td>数据1</td><td>数据2</td><td>数据3</td></tr>
    </tbody>
  </table>
</div>

卡片式布局

<div class="card-container">
  <!-- 每个卡片对应一行数据 -->
  <div class="data-card" v-for="row in tableData" :key="row.id">
    <div class="card-field">
      <span class="field-label">商品名称:</span>
      <span class="field-value">{{ row.name }}</span>
    </div>
    <div class="card-field">
      <span class="field-label">价格:</span>
      <span class="field-value">{{ row.price }}</span>
    </div>
  </div>
</div>


.card-container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); /* 自动换行 */
  gap: 15px; /* 卡片间距 */
  padding: 10px;
}
.data-card {
  padding: 15px;
  border-radius: 8px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1); /* 卡片阴影 */
  background: #fff;
}

更多布局可参考Bootstrap和elementUI 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到