前端实现PDF分页与Vue中的render函数
背景
提分加项目中遇到了一个需要前端对PDF页面进行分页的需求。该需求是要为每一位学生生成一份PDF的学习报告,起初是采用了前端提供几个页面模板,由java端调用iText去生成PDF,PDF的分页工作也由工具去完成。
但是由于页面中包含大量的数学公式、图片等一些对样式要求较高的元素,iText对很多CSS3属性的支持较差,生成的PDF经常会出现切页的情况。最后决定由前端生成分好页的页面,并提供一个方法导出当前页面的Dom节点,服务端通过访问该页面并调用此方法得到分页后的页面元素,最后调用Node的一个工具生成PDF。
而对于前端PDF分页的思路,大致分以下四步:
- 首先获取后台数据渲染页面
- 页面渲染好之后获取每个元素的高度,通过一定的算法判断各个元素应该在哪一页
- 对于跨页的元素,采用前页隐藏后页定位的模式,使之在视觉上刚好能接起来
- 完成分页
而在这个过程中因为每一页的元素是有分页后的数据所决定的,所以使用到了render函数。
代码
拿出一个模块的代码来,类似的思路就是这样,通过数据判断当前页应当渲染的元素,然后通过render函数中的createElement方法创建页面元素。
<script>
import { mapActions, mapGetters, mapState } from "vuex";
import Top from "./components/Top.vue";
import Charts from "./components/Charts.vue";
import Table from "./components/Table.vue";
export default {name: "global-analysis",props: {page: { type: [Object], required: true },},components: { Top, Charts, Table },computed: {positionStyle () {return {position: 'absolute',width: '100%',top: -this.page.top + 'px',padding: '0px 28px',}},hiddenStyle () {return {position: 'relative',width: '100%',height: (1170 - this.page.hidden) + 'px',overflow: 'hidden'}}},render (createElement) {const children = []//根据数据加载指定模块this.page.blocks.forEach((block, index) => {let component = ''if (block.name === 'global-analysis-top') {component = 'Top'} else if (block.name === 'global-analysis-charts') {component = 'Charts'} else if (block.name === 'global-analysis-table') {component = 'Table'} else {return}children.push(createElement(component, { props: { data: block.data } }))})//将模块放入定位层const positionContainer = createElement('div',{ style: this.positionStyle, class: 'container-position', ref: 'position' },children)//将定位层放入遮罩层并返回return createElement('div',{ style: this.hiddenStyle, class: 'container-hidden', ref: 'hidden' },[positionContainer])}
}
</script>
其中createElement可以接收三个参数,第一个为所创建的html元素,第二个为相关属性的数据对象,第三个为子节点。
具体教程可参考官方文档:渲染函数 & JSX
前端实现PDF分页与Vue中的render函数相关推荐
- vue中的render函数
vue中的render函数的使用 我们先看一个例子: render: function (createElement) {return createElement('h1', this.blogTit ...
- vue中的render函数、h()函数、函数式组件
一.什么是render 官网:用于编程式地创建组件虚拟 DOM 树的函数. 在我们使用webpack脚手架创建项目时,都能在main.js中看到一个render函数 import Vue from ' ...
- vue中的render函数介绍
render函数是什么 简单的说,在 vue 中我们使用模板HTML语法组建页面的,使用 render 函数我们可以用js语言来构建DOM. 因为vue是虚拟DOM,所以在拿到template模板时也 ...
- 前端进阶必备技能:Vue中如何定制动画效果
作为前端程序员,前端火起来的短短几年里技术更新迭代特别快,不仅是新的框架繁多,Vue,React,Angular轮番上场,各种工具,插件,库也是琳琅满目,就连基础的JavaScript语法的更新也是年 ...
- vue 执行函数this_在vue中使用回调函数,this调用无效的解决
let self = this //使用新变量替换this,以免this无效 //updatestudentinfotoserver是一个将本身部分数据异步上传的接口,接收三个参数,其中第一个是数据, ...
- vue中class绑定函数
vue中class绑定函数 vue+class类应用函数,增加class类名 相关博客: v-for循环.v-if 动态判断+动态赋值+操作class类:(计算属性)强制绑定函数 以上就是关于&quo ...
- mounted钩子函数_怎样实现Vue中mounted钩子函数获取节点高度
这次给大家带来怎样实现Vue中mounted钩子函数获取节点高度,实现Vue中mounted钩子函数获取节点高度的注意事项有哪些,下面就是实战案例,一起来看一下. 遇到的问题 最近在开发一个Vue的项 ...
- Vue中使用find函数
Vue中使用find函数 find函数基本使用方法: // An highlighted block this.result = this.imgItems.find(item => item. ...
- Vue中的 h 函数
Vue中的 h 函数 在了解 h 函数之前,我们需要先了解 虚拟DOM, 什么是 虚拟DOM? 虚拟DOM 是使用JS 对象模拟真实的DOM结构,用JavaScript 对象描述DOM 的层次结构.D ...
- vue 前端显示图片加token_前端甩锅神器:vue中的mock使用
首先声明,本文所介绍的方法,只是用于,在做好前端联调的本分工作之余,把前后端联调责任划清界限,并不用于帮后端定位问题(当然,mock也有更全面的方法促进项目的进行,小女不才,在此不提供介绍): 跟陌生 ...
最新文章
- 一个synchronized跟面试官扯了半个小时
- 拼接多个 wchar_t *
- 如何用python画数据图-python怎么对动态数据在同一张图上画出来
- 问题之传递参数名和接收参数名要一致。
- gluon_带有Gluon Ignite和Dagger的JavaFX中的依赖注入
- sublime text3运行python不显示内容_sublime text 运行python无法出结果
- wordpress 添加小工具分类
- Redis学习笔记01---配置文件
- 实战:MongoDB 分片集群Shard Cluster 搭建(1台路由节点,3台配置节点,9台分片节点)
- Java垃圾回收器的工作原理
- mpvue解析富文本mpvue-wxParse
- Arrays.copyOf()方法详解-jdk1.8
- linux basename学习
- Biztalk中Host Instance线程控制
- 理解numpy dot函数
- 剑指MBA?Acer发布全高清触控Win8平板Aspire S7
- Android基础入门教程——7.5.4 WebView文件下载
- 2022低压电工操作证考试题模拟考试平台操作
- 如何理解电容、电感产生的相位差
- interactive governor study for android