react-pdf 实战实例

主要技术 react-pdf, react(lazy Suspense) react-dom节点的插入, 原生Dom节点的插入与删除 

 

  1.  移动端 使用PdfReader:PDF预览组件替换掉embed标签 并替换掉 指定 dom节点
  2.  web端使用 embed标签 直接渲染 PDF文件
  3. 使用web-worker把pdf转换为svg图片(web-worker js文件必须放在网络中不能使用本地资源)

import React, {lazy, Suspense} from "react";
import ReactDOM from "react-dom";
function isMobile(){
	let info = navigator.userAgent;
	let agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPod", "iPad"];
	for(let i = 0; i < agents.length; i++){
		if(info.indexOf(agents[i]) >= 0) return true;
	}
	return false;
}
export default function insertPdfjs(){
	if(!isMobile()){
		return true;
	}
 setTimeout(() => {
		let Doms = document.getElementsByTagName('embed');
		if (Doms && Doms.length) {
			const PdfReader = lazy(() => import ('./index'));
			for (let item of Doms) {
				if (item.className === 'ql-pdf' && item.src) {  // 存在pdf文件 获取元素和 url 并渲染组件
					console.log(item.src);
					let divNew = document.createElement('div');
					item.parentNode.appendChild(divNew);
					ReactDOM.render(<Suspense fallback={<div>加载中</div>}>
							<PdfReader src={item.src}/>
						</Suspense>
						, divNew);
					item.parentNode.removeChild(item);
				}
			}
		}
	}, 4000);
}
  1. import React from 'react';
    import {useState} from 'react';
    import {Document, Page, pdfjs} from 'react-pdf'; // 依赖 版本 react-pdf 5.0及以上 并且依赖pdf js
    import styles from './style.less';
    
    pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
    
    interface prop {
    	src: string | null,
    }
    
    export default function Index({src}: prop) {
    	const [numPages, setNumPages] = useState(0);
    	const [pageNumber, setPageNumber] = useState(1);
    
    	function onDocumentLoadSuccess({numPages}) {
    		setNumPages(numPages);
    	}
    
    	return (<div className={styles.divOutSide}>
    		<Document file={src}
    							onLoadSuccess={onDocumentLoadSuccess}
    							onLoadError={(error) => alert('加载pdf文件失败' + error.message)}
    							renderMode={'svg'}
    		>
    			<Page pageNumber={pageNumber}
    						// width={523}
    			/>
    		</Document>
    		<div className={styles.pageS}>
    			{
    				pageNumber > 1 && <a onClick={() => {
    					setPageNumber(old => old - 1)
    				}}>
    					上一页
    				</a>
    			}
    			{
    				pageNumber < numPages && <a onClick={() => {
    					setPageNumber((old) => old + 1
    					)
    				}}>
    					下一页
    				</a>
    			}
    		</div>
    
    
    	</div>);
    }
    

     

 

 

相关推荐
前言 第1章 React新的前端思维方式1 1.1 初始化一个React项目1 1.2 增加一个新的React组件3 1.2.1 JSX6 1.2.2 JSX是进步还是倒退7 1.3 分解React应用8 1.4 React的工作方式10 1.4.1 jQuery如何工作10 1.4.2 React的理念11 1.4.3 Virtual DOM12 1.4.4 React工作方式的优点13 1.5 本章小结14 第2章 设计高质量的React组件16 2.1 易于维护组件的设计要素16 2.2 React组件的数据17 2.2.1 React的prop18 2.2.2 React的state22 2.2.3 prop和state的对比24 2.3 组件的生命周期25 2.3.1 装载过程25 2.3.2 更新过程30 2.3.3 卸载过程34 2.4 组件向外传递数据34 2.5 React组件state和prop的局限37 2.6 本章小结39 第3章 从Flux到Redux40 3.1 Flux40 3.1.1 MVC框架的缺陷41 3.1.2 Flux应用43 3.1.3 Flux的优势53 3.1.4 Flux的不足54 3.2 Redux56 3.2.1 Redux的基本原则56 3.2.2 Redux实例59 3.2.3 容器组件和傻瓜组件64 3.2.4 组件Context67 3.2.5 React-Redux71 3.3 本章小结73 第4章 模块化React和Redux应用75 4.1 模块化应用要点75 4.2 代码文件的组织方式76 4.2.1 按角色组织76 4.2.2 按功能组织78 4.3 模块接口79 4.4 状态树的设计81 4.4.1 一个状态节点只属于一个模块82 4.4.2 避免冗余数据82 4.4.3 树形结构扁平83 4.5 Todo应用实例83 4.5.1 Todo状态设计84 4.5.2 action构造函数86 4.5.3 组合reducer87 4.5.4 Todo视图90 4.5.5 样式 98 4.5.6 不使用ref99 4.6 开发辅助工具100 4.6.1 Chrome扩展包100 4.6.2 redux-immutable-state-invariant辅助包101 4.6.3 工具应用101 4.7 本章小结103 第5章 React组件的性能优化105 5.1 单个React组件的性能优化105 5.1.1 发现浪费的渲染时间106 5.1.2 性能优化的时机107 5.1.3 React-Redux的should-ComponentUpdate实现108 5.2 多个React组件的性能优化115 5.2.1 React的调和(Reconciliation)过程116 5.2.2 Key的用法120 5.3 用reselect提高数据获取性能122 5.3.1 两阶段选择过程123 5.3.2 范式化状态树125 5.4 本章小结127 第6章 React高级组件129 6.1 高阶组件129 6.1.1 代理方式的高阶组件132 6.1.2 继承方式的高阶组件136 6.1.3 高阶组件的显示名139 6.1.4 曾经的React Mixin139 6.2 以函数为子组件140 6.2.1 实例CountDown142 6.2.2 性能优化问题145 6.3 本章小结146 第7章 Redux和服务器通信147 7.1 React组件访问服务器147 7.1.1 代理功能访问API148 7.1.2 React组件访问服务器的生命周期150 7.1.3 React组件访问服务器的优缺点153 7.2 Redux访问服务器154 7.2.1 redux-thunk中间件154 7.2.2 异步action对象 156 7.2.3 异步操作的模式157 7.2.4 异步操作的中止 163 7.3 Redux异步操作的其他方法165 7.3.1 如何挑选异步操作方式165 7.3.2 利用Promise实现异步操作167 7.4 本章小结 167 第8章 单元测试168 8.1 单元测试的原则168 8.2 单元测试环境搭建170 8.2.1 单元测试框架170 8.2.2 单元测试代码组织172 8.2.3 辅助工具173 8.3 单元测试实例175 8.3.1 action构造函数测试175 8.3.2 异步action构造函数测试176 8.3.3 reducer测试178 8.3.4 无状态React组件测试178 8.3.5 被连接的React组件测试179 8.4 本章小结180 第9章 扩展Redux182 9.2 中间件182 9.1.1 中间件接口183 9.1.2 使用中间件186 9.1.3 Promise中间件187 9.1.4 中间件开发原则190 9.2 Store Enhancer 191 9.2.1 增强器接口191 9.2.2 增强器实例reset192 9.3 本章小结194 第10章 动画195 10.1 动画的实现方式195 10.1.1 CSS3方式195 10.1.2 脚本方式197 10.2 ReactCSSTransitionGroup199 10.2.1 Todo应用动画200 10.2.2 ReactCSSTransitionGroup规则202 10.3 React-Motion动画库205 10.3.1 React-Motion的设计原则205 10.3.2 Todo应用动画206 10.4 本章小结210 第11章 多页面应用211 11.1 单页应用211 11.2 React-Router213 11.2.1 路由213 11.2.2 路由链接和嵌套216 11.2.3 默认链接218 11.2.4 集成Redux219 11.3 代码分片221 11.3.1 弹射和配置webpack224 11.3.2 动态加载分片225 11.3.3 动态更新Store的reducer和状态228 11.4 本章小结234 第12章 同构235 12.1 服务器端渲染vs浏览器端渲染235 12.2 构建渲染动态内容服务器239 12.2.1 设置Node.js和Express240 12.2.2 热加载242 12.3 React同构246 12.3.1 React服务器端渲染HTML247 12.3.2 脱水和注水248 12.3.3 服务器端Redux Store249 12.3.4 支持服务器和浏览器获取共同数据源250 12.3.5 服务器端路由251 12.4 同构实例252 12.5 本章小结257 结语258
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页