Rumah > Soal Jawab > teks badan
P粉5010077682023-09-03 00:25:16
useStateRef
nampaknya anti-corak. Anda memutuskan keadaan baharu itu, jadi jika anda memerlukan rujukan lain kepadanya, anda sentiasa boleh menciptanya sendiri. Saya mengesyorkan meminimumkan sifat pada kanvas untuk mengelakkan pemaparan semula yang tidak perlu.
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>
Atau mungkin tiada sebab untuk menyimpan warna sebagai keadaan. Anda boleh mencipta sendiri fungsi setColor
dan melampirkannya sebagai pendengar acara -
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>
Saya juga mengesyorkan anda menyemak SVG. Saya mendapati bahawa API SVG lebih sesuai dengan corak React daripada API Kanvas. Keupayaan setiap satu adalah berbeza, tetapi jika SVG berfungsi untuk keperluan anda, ia patut dipertimbangkan.