vue+element实现单条打印、批量打印(图片)

这篇博客介绍了如何在前端使用JavaScript实现批量打印功能,包括通过`window.print()`和`document.execCommand('print')`方法触发打印预览。文章提供了一个示例代码,展示了如何选择表格中的数据并将其转换为打印内容,同时使用媒体查询调整打印样式。此外,还涉及了在预览和打印过程中页面内容的切换与刷新操作。

winodw.print()方法

print() 方法用于打印当前窗口的内容。调用 print() 方法会产生一个打印预览弹框,让用户可以设置打印请求。最简单的打印就是直接调用window.print(),当然用 document.execCommand('print') 也可以达到同样的效果。默认打印页面中body里的所有内容。

<template>
  <div class="dashboard-container">
    <el-button @click='allPrint'>批量打印</el-button>
    <el-table :data="tableData" style="width: 100%" border @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55">
      </el-table-column>
      <el-table-column prop="id" label="id" width="180">
      </el-table-column>
      <el-table-column label="图标" width="180">
        <template slot-scope="scope">
          <img :src="scope.row.src" class="table_img">
        </template>
      </el-table-column>
      <el-table-column label="操作" width="100">
        <template slot-scope="scope">
          <el-button @click="print(scope.row)" type="text" size="small">打印</el-button>
        </template>
      </el-table-column>
    </el-table>


    <!--startprint-->
    <div id="printcontent" ref='printcontent'>
      <img :src="item.src" class="print_img" v-for="item in multipleSelection" :key='item.id' />
    </div>
    <!--endprint-->
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [{
            id: 1,
            src:'94/4d3ea53c084bad6931a56d5158a48jpeg'
          },
          {
            id: 2,
            src:'94/4d3ea53c084bad6931a56d5158a48jpeg'
          },
          {
            id: 3,
            src:'94/4d3ea53c084bad6931a56d5158a48jpeg'
          }
        ],
        multipleSelection: [],   //存放将要打印的数据
      }
    },
    methods: {
      print(row={}) {
        if(row.src){
          this.multipleSelection.push(row)
        }
        this.$nextTick(()=>{
          var bdhtml=window.document.body.innerHTML;       // 获取body的内容
          var jubuData = document.getElementById("printcontent").innerHTML; //获取要打印的区域内容
          window.document.body.innerHTML= jubuData;        
          window.print();                                  // 调用浏览器的打印功能
          window.document.body.innerHTML=bdhtml;           // body替换为原来的内容
          window.location.reload();                        //刷新页面,如果不刷新页面再次点击不生效或打印使用新窗口实现打印
        })
      },
      allPrint(){
        this.print()
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
      }
    }
  }
</script>

<style lang="scss">
  .dashboard-container {
    .table_img {
      width: 50px;
      height: 50px;
    }
    #printcontent{
      display: none;
    }
  }
  //使用媒体查询    设置预览时的样式
  @media print{
    @page {
      margin: 0;
      size: portrait; 
    }
    #printcontent{
      width: 100%;
    }
    .print_img{
      display: block;
      width: 100%;
      height: 100%;
      margin: auto auto;
    }
  }

</style>

大家进行代码简单的修改,即可使用,代码思路来源“前端劝退师™​​​​​​​”,很实用的操作!

<think>我们正在使用Vue3和Element Plus,目标是从表单中删除单条数据。根据引用内容,我们可以参考一些ElementPlus组件的使用方式。步骤:1.表单数据通常是一个数组,每个元素代表一条数据。2.我们需要一个删除操作,比如在每条数据旁边有一个删除按钮。3.当点击删除按钮时,触发一个函数,将该条数据从数组中移除。参考引用[1]中的代码片段,有一个删除函数`deleteData`,我们可以类似地编写一个删除函数。引用[1]中的代码:const deleteData =() =>{console.log("--delete --");};但是,我们需要知道具体删除哪一条数据,所以应该传入一个标识(如索引或id)。另外,引用[3]中展示了表单数据的绑定和校验,但我们的重点是删除操作。假设我们的表单数据存储在`formData`数组中,每条数据有一个唯一标识(如`id`)或其他属性。实现思路:-在模板中,使用`v-for`循环渲染每条数据,并为每条数据添加一个删除按钮。-当点击删除按钮时,调用删除函数并传入该条数据的索引或id。示例代码:模板部分:<template><div v-for="(item, index) informData" :key="item.id"><!--显示每条数据的表单字段--><el-input v-model="item.name"></el-input><!--其他字段...--><el-button@click="deleteData(index)">删除</el-button></div></template>脚本部分:<script setup>import{ ref} from'vue';//表单数据,假设初始有一些数据constformData= ref([{ id:1,name:'数据1'},{ id:2,name:'数据2'},// ...更多数据]);//删除数据的函数constdeleteData= (index)=> {formData.value.splice(index,1);};</script>注意:如果使用id来删除,可以这样写:const deleteData =(id) =>{constindex =formData.value.findIndex(item=> item.id ===id);if(index!== -1){formData.value.splice(index,1);}};然后在模板中传递id:<el-button @click="deleteData(item.id)">删除</el-button>但是,引用[1]中使用了图标,我们也可以使用图标按钮:<el-buttontype="danger":icon="Delete" circle@click="deleteData(item.id)"/>需要先导入Delete图标:`import {Delete }from '@element-plus/icons-vue'`另外,如果表单数据是对象而不是数组(比如是对象数组),那么上述方法适用。如果表单数据是单个对象(不是数组),那么删除单条数据可能意味着重置该条数据的某些字段,或者整个表单重置。但根据问题描述,应该是删除表单中的一条数据(即表单是多条数据组成的列表)。因此,我们按照上述思路实现。但是,如果表单是ElementPlus的`el-form`组件,并且我们是在一个动态表单中(即多条表单项),那么我们可以参考以下结构:<el-form :model="form"><el-form-item v-for="(item, index) inform.items" :key="index"label="Item"><el-input v-model="item.name"></el-input><el-button@click="deleteItem(index)">删除</el-button></el-form-item></el-form>数据:const form= ref({items:[{ name: ''},// ...]});删除函数:constdeleteItem= (index)=> {form.value.items.splice(index,1);};总结:关键在于如何组织表单数据(数组形式),然后通过splice方法删除指定索引的数据。请根据实际的数据结构进行调整。注意:如果数据是响应式的,使用Vue3的ref或reactive,然后操作数组即可,Vue3会检测到数组变化并更新视图。相关问题:1.Vue3中,如何响应式地删除数组中的一项?2.Element Plus动态表单如何实现添加和删除操作?3.使用Vue3和Element Plus开发表单时,如何重置表单?</think>### Vue3 Element Plus 表单删除单条数据实现指南 在 Vue3 和 Element Plus 中删除表单单条数据,需要结合响应式数据管理和 UI 组件操作。以下是实现步骤: #### 1. **数据准备** ```vue <script setup> import { ref } from 'vue' // 表单数据(数组结构) const formData = ref([ { id: 1, name: '数据1', value: '内容1' }, { id: 2, name: '数据2', value: '内容2' }, // ...更多数据 ]) </script> ``` #### 2. **模板渲染** ```vue <template> <el-form :model="formData"> <el-form-item v-for="(item, index) in formData" :key="item.id" :label="item.name" > <el-input v-model="item.value" /> <!-- 删除按钮 --> <el-button type="danger" icon="delete" @click="deleteItem(index)" >删除</el-button> </el-form-item> </el-form> </template> ``` #### 3. **删除函数实现** ```vue <script setup> // 删除单条数据 const deleteItem = (index) => { // 使用 splice 响应式删除 formData.value.splice(index, 1) // 可选:调用 API 接口同步到后端 // axios.delete(`/api/data/${formData.value[index].id}`) } </script> ``` #### 4. **增强功能(可选)** - **删除确认对话框**(使用 Element Plus 的 MessageBox): ```javascript import { ElMessageBox } from 'element-plus' const deleteItem = async (index) => { try { await ElMessageBox.confirm('确定删除这条数据?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }) formData.value.splice(index, 1) } catch (cancel) { // 用户取消操作 } } ``` - **批量删除支持**: ```vue <el-button @click="batchDelete(selectedIds)">批量删除</el-button> ``` #### 关键说明: 1. **响应式处理**:使用 `ref` 或 `reactive` 确保数据变更自动更新视图 2. **唯一标识**:数据项必须包含唯一 `id`(用于 `:key` 绑定) 3. **索引处理**:删除操作传递当前索引或 ID,避免直接操作 DOM 4. **表单验证**:如需在删除前验证,可调用 Element Plus 的表单验证方法[^3] #### 示例效果: 当点击删除按钮时: 1. 弹出确认对话框(如果启用) 2. 从 `formData` 数组中移除对应项 3. 表单自动重新渲染剩余数据 > **注意**:如果使用服务端数据,删除后需要重新获取数据或更新本地状态以保持同步。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值