Maison > Questions et réponses > le corps du texte
P粉5010077682023-09-03 00:25:16
useStateRef
semble être un anti-modèle. Vous décidez quel est le nouvel état, donc si vous avez besoin d’une autre référence, vous pouvez toujours en créer une vous-même. Je recommande de minimiser les propriétés sur le canevas pour éviter un nouveau rendu inutile.
function App({ width, height }) { const canvas = React.useRef() const [color, setColor] = React.useState("white") // when color changes.. React.useEffect(() => { if (canvas.current) { const context = canvas.current.getContext('2d'); context.fillStyle = color context.fillRect(0, 0, width, height) } }, [color, width, height]) return <div> <canvas ref={canvas} width={width} height={height} /> <button onClick={_ => setColor("blue")} children="blue" /> <button onClick={_ => setColor("green")} children="green" /> <button onClick={_ => setColor("red")} children="red" /> </div> } ReactDOM.createRoot(document.querySelector("#app")).render(<App width={200} height={150} />)
canvas { display: block; border: 1px solid black; }
<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="app"></div>
Ou peut-être qu'il n'y a aucune raison de stocker les couleurs en tant qu'état. Vous pouvez créer vous-même la fonction setColor
et la joindre en tant qu'écouteur d'événement -
function App({ width, height }) { const canvas = React.useRef() const setColor = color => event => { if (canvas.current) { const context = canvas.current.getContext('2d'); context.fillStyle = color context.fillRect(0, 0, width, height) } } return <div> <canvas ref={canvas} width={width} height={height} /> <button onClick={setColor("blue")} children="blue" /> <button onClick={setColor("green")} children="green" /> <button onClick={setColor("red")} children="red" /> </div> } ReactDOM.createRoot(document.querySelector("#app")).render(<App width={200} height={150} />)
canvas { display: block; border: 1px solid black; }
<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="app"></div>
Je recommande également de consulter SVG. Je trouve que l'API SVG correspond mieux au modèle React que l'API Canvas. Les capacités de chacun sont différentes, mais si SVG répond à vos besoins, cela vaut la peine d'y réfléchir.