Saya sedang mencipta kanvas dan butang fabrik, bentuk yang ditunjukkan oleh butang ini harus boleh dipilih. Saya tidak faham mengapa komponen saya dipaparkan semula dua kali dalam situasi berikut. Oleh itu, bentuk kain saya tidak boleh dipilih. Walau bagaimanapun, apabila saya mengalih keluar
时,渲染只发生一次,我的形状是可选择的。我可以移除
daripada fail index.tsx saya, saya tidak fikir ini adalah penyelesaian terbaik. Inilah demonya:
const { Fragment, StrictMode, useEffect, useRef } = React; const { createRoot } = ReactDOM; const styles = {}; const CanvasComponent = ({ id }) => { const canvasRef = useRef(null); useEffect(() => { console.log('init canvas'); // displayed twice with <React.StrictMode> canvasRef.current = initCanvas(); }, []); const initCanvas = () => ( canvasRef.current = new fabric.Canvas(`canvas-${id}`, { width: 800, height: 400, }) ); const addShape = (shapeType: string) => { let shape: fabric.Object; switch (shapeType) { case 'circle': shape = new fabric.Circle({ radius: 30, fill: 'red', left: 100, top: 100 }); break; case 'rectangle': shape = new fabric.Rect({ width: 60, height: 70, fill: 'green', left: 100, top: 100 }); break; default: return; } canvasRef.current.add(shape); }; return ( <div> <button onClick={() => addShape('circle')}>Add Circle</button> <button onClick={() => addShape('rectangle')}>Add Rectangle</button> <div className={styles.canvasContainer}> <canvas id={`canvas-${id}`}></canvas> </div> </div> ); } function StrictModeEnabled() { return <StrictMode><h1>Strict Mode Enabled</h1><CanvasComponent id={1} /></StrictMode>; } function StrictModeDisabled() { return <Fragment><h1>Strict Mode Disabled</h1><CanvasComponent id={2} /></Fragment>; } const strictModeEnabledRoot = createRoot(document.getElementById("strict-mode-enabled")); strictModeEnabledRoot.render(<StrictModeEnabled />); const strictModeDisabledRoot = createRoot(document.getElementById("strict-mode-disabled")); strictModeDisabledRoot.render(<StrictModeDisabled />);
<script crossorigin src="https://www.unpkg.com/fabric@5.3.0/dist/fabric.js"></script> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <div id="strict-mode-enabled"></div> <div id="strict-mode-disabled"></div>
Soalan
Mengapa useEffect berjalan dua kali dalam React dan bagaimana untuk menanganinya? Soalan ini mempunyai jawapan yang baik yang menerangkan mengapa ini berlaku dan penyelesaian umum.
Penyelesaian
Dalam kes anda, anda perlu membersihkan kanvas instan. Saya tidak biasa dengan Fabrik, tetapi daripada membaca dokumentasi, kaedah
dispose
nampaknya sesuai:Adalah amalan yang baik yang anda perlukan untuk mengembalikan fungsi daripada
useEffect
返回一个调用上述方法的函数。从链接的问题中可以看出,从useEffect
yang melakukan pembersihan. Terdapat juga contoh yang berfungsi di bawah: