如何在 Typescript 中使用 react-pdf 库
How to use react-pdf library with Typescript
我正在尝试使用一个 npm 库来帮助我呈现 pdf 文档。我找到了 react-pdf,但它还没有 TypeScript 的类型,所以我正在使用它,如下所示:
let Document = require('react-pdf');
let Page = require('react-pdf');
class PdfViewer extends React.Component<PdfViewer.Props, PdfViewer.State> {
constructor(props: PdfViewer.Props) {
super(props);
this.state = {
numPages: null,
pageNumber: 1,
};
}
onDocumentLoadSuccess = ( numPages: number ) => {
this.setState({ numPages });
}
componentWillReceiveProps(nextProps: PdfViewer.Props) {
// this.setState(CsvViewer.parse(nextProps.data));
}
render() {
const {url} = this.props;
const { pageNumber, numPages } = this.state;
const buffer = data as ArrayBuffer;
return (
<div>
<Document
file={url}
onLoadSuccess={this.onDocumentLoadSuccess}
>
<Page pageNumber={pageNumber} />
</Document>
<p>Page {pageNumber} of {numPages}</p>
</div>
);
}
}
但是它抛出了这个错误:
Element type is invalid: expected a string (for built-in components)
or a class/function (for composite components) but got: object.
我在 GitHub 中找到了 this,但它对我帮助不大。
我去了图书馆的documentation,我在文件参数中传递了一个对象,正如他们所展示的那样,但出现了同样的错误。我认为是另外一回事。
我去了 react-pdf
库的源代码,我认为这是他们用来从参数获取文件的函数:
findDocumentSource = async () => {
const { file } = this.props;
if (!file) {
return null;
}
// File is a string
if (typeof file === 'string') {
if (isDataURI(file)) {
const fileUint8Array = dataURItoUint8Array(file);
return { data: fileUint8Array };
}
displayCORSWarning();
return { url: file };
}
// File is PDFDataRangeTransport
if (file instanceof PDFDataRangeTransport) {
return { range: file };
}
// File is an ArrayBuffer
if (isArrayBuffer(file)) {
return { data: file };
}
/**
* The cases below are browser-only.
* If you're running on a non-browser environment, these cases will be of no use.
*/
if (isBrowser) {
// File is a Blob
if (isBlob(file) || isFile(file)) {
return { data: await loadFromFile(file) };
}
}
// At this point, file must be an object
if (typeof file !== 'object') {
throw new Error('Invalid parameter in file, need either Uint8Array, string or a parameter object');
}
if (!file.url && !file.data && !file.range) {
throw new Error('Invalid parameter object: need either .data, .range or .url');
}
// File .url is a string
if (typeof file.url === 'string') {
if (isDataURI(file.url)) {
const { url, ...otherParams } = file;
const fileUint8Array = dataURItoUint8Array(url);
return { data: fileUint8Array, ...otherParams };
}
displayCORSWarning();
}
return file;
};
但我怀疑这里有错误,但我无法弄清楚可能是什么。 react
我使用的版本是 16.8.2 和 4.0.2 for react-pdf
这是不正确的:
let Document = require('react-pdf');
let Page = require('react-pdf');
您在执行此操作时将导入 整个 模块。这意味着 Document
和 Page
都包含 react-pdf
的所有模块。相反,您想要做的是导入 ReactPDF 并引用这些模块:
const ReactPDF = require('react-pdf');
<ReactPDF.Document />
<ReactPDF.Page />
或你可以使用解构:
import { Document, Page } from 'react-pdf';
//or
const { Document, Page } = require('react-pdf');
如果 TypeScript 抱怨缺少声明,只需将 @types
文件夹添加到您的项目,在其中创建一个名为 react-pdf
的子文件夹,并在名为 index.d.ts
的文件夹中创建一个文件行:
declare module "react-pdf"
我正在尝试使用一个 npm 库来帮助我呈现 pdf 文档。我找到了 react-pdf,但它还没有 TypeScript 的类型,所以我正在使用它,如下所示:
let Document = require('react-pdf');
let Page = require('react-pdf');
class PdfViewer extends React.Component<PdfViewer.Props, PdfViewer.State> {
constructor(props: PdfViewer.Props) {
super(props);
this.state = {
numPages: null,
pageNumber: 1,
};
}
onDocumentLoadSuccess = ( numPages: number ) => {
this.setState({ numPages });
}
componentWillReceiveProps(nextProps: PdfViewer.Props) {
// this.setState(CsvViewer.parse(nextProps.data));
}
render() {
const {url} = this.props;
const { pageNumber, numPages } = this.state;
const buffer = data as ArrayBuffer;
return (
<div>
<Document
file={url}
onLoadSuccess={this.onDocumentLoadSuccess}
>
<Page pageNumber={pageNumber} />
</Document>
<p>Page {pageNumber} of {numPages}</p>
</div>
);
}
}
但是它抛出了这个错误:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.
我在 GitHub 中找到了 this,但它对我帮助不大。
我去了图书馆的documentation,我在文件参数中传递了一个对象,正如他们所展示的那样,但出现了同样的错误。我认为是另外一回事。
我去了 react-pdf
库的源代码,我认为这是他们用来从参数获取文件的函数:
findDocumentSource = async () => {
const { file } = this.props;
if (!file) {
return null;
}
// File is a string
if (typeof file === 'string') {
if (isDataURI(file)) {
const fileUint8Array = dataURItoUint8Array(file);
return { data: fileUint8Array };
}
displayCORSWarning();
return { url: file };
}
// File is PDFDataRangeTransport
if (file instanceof PDFDataRangeTransport) {
return { range: file };
}
// File is an ArrayBuffer
if (isArrayBuffer(file)) {
return { data: file };
}
/**
* The cases below are browser-only.
* If you're running on a non-browser environment, these cases will be of no use.
*/
if (isBrowser) {
// File is a Blob
if (isBlob(file) || isFile(file)) {
return { data: await loadFromFile(file) };
}
}
// At this point, file must be an object
if (typeof file !== 'object') {
throw new Error('Invalid parameter in file, need either Uint8Array, string or a parameter object');
}
if (!file.url && !file.data && !file.range) {
throw new Error('Invalid parameter object: need either .data, .range or .url');
}
// File .url is a string
if (typeof file.url === 'string') {
if (isDataURI(file.url)) {
const { url, ...otherParams } = file;
const fileUint8Array = dataURItoUint8Array(url);
return { data: fileUint8Array, ...otherParams };
}
displayCORSWarning();
}
return file;
};
但我怀疑这里有错误,但我无法弄清楚可能是什么。 react
我使用的版本是 16.8.2 和 4.0.2 for react-pdf
这是不正确的:
let Document = require('react-pdf');
let Page = require('react-pdf');
您在执行此操作时将导入 整个 模块。这意味着 Document
和 Page
都包含 react-pdf
的所有模块。相反,您想要做的是导入 ReactPDF 并引用这些模块:
const ReactPDF = require('react-pdf');
<ReactPDF.Document />
<ReactPDF.Page />
或你可以使用解构:
import { Document, Page } from 'react-pdf';
//or
const { Document, Page } = require('react-pdf');
如果 TypeScript 抱怨缺少声明,只需将 @types
文件夹添加到您的项目,在其中创建一个名为 react-pdf
的子文件夹,并在名为 index.d.ts
的文件夹中创建一个文件行:
declare module "react-pdf"