import React, { useCallback, useContext, useEffect, useState } from 'react'; import { Texture } from 'fabric-texture'; import Skew from 'fabric-texture/modes/skew' import styles from './style.less'; import { DocsContext } from 'docs/docs'; const canvasToURL = async (canvas: HTMLCanvasElement) => new Promise((resolve) => { canvas.toBlob((blob) => { if (blob) { const url = URL.createObjectURL(blob); resolve(url); } }); }); function Principle() { const { placeholder } = useContext(DocsContext); const [previews, setPreviews] = useState([]); const run = useCallback(async (image: HTMLImageElement) => { const canvases: HTMLCanvasElement[] = []; const texture = new Texture(image); texture.setSplitUnit(0.2).setInputLimitSize({ width: 400 }).setSplitStrategy({ name: 'skew', execute: Skew.execute, }); // 原图 canvases.push(texture.create()); // 显示分割线 texture.setRenderOptions({ showGrid: true }); canvases.push(texture.create()); // 透视效果 texture .setVertexCoord(0, 0, 'tl', { x: image.naturalWidth * 0.2, y: 0 }) .setVertexCoord(0, 0, 'tr', { x: image.naturalWidth * 1.2, y: 0 }); canvases.push(texture.create()); // 隐藏分割线 texture.setRenderOptions({ showGrid: false }); canvases.push(texture.create()); setPreviews(await Promise.all(canvases.map(canvasToURL))); }, []); useEffect(() => { if (placeholder) run(placeholder); }, [placeholder]); return (
{previews.map((image, index) => (
步骤{index + 1}
))}
); } export default Principle;