@abcda2015201

Как использовать хук после рендера?

Повторяю по 1 видео рисовалку, но тк там пишется на mobx + canvas = Все его инструменты и кисти написаны с помощью классов. Вопрос как мне после рендера компонентов:
return (
        <Provider store={store}>
            <div className="App">
                <ToolBar></ToolBar>
                <SettingBar></SettingBar>
                <Canvas></Canvas>
            </div>
        </Provider>
    );

А именно Canvas - где я через useEffect диспачу ссылку на canvas, использовать мой хук который требует в виде аргумента ссылку на неё.
const dispatch = useDispatch()
    const canvasRef = useSelector((state) => state.canvas.canvasRef)

    useEffect(() => {
        if(canvasRef){
            const {} = useBrush(canvasRef)
        }
    }, [canvasRef]);

Это внутри Toolbar, но тк хук в хуке нельзя использовать я не понимаю как это можно реализовать. Проблема в том что useBrush в итоге получает все кроме ссылки, и как я понял суть в том что хук юзается раньше чем я получу ссылку, прошу помощи, вот сам хук если нужно:
import { useEffect, useRef } from 'react';

const useBrush = (canvas) => {
    const ctxRef = useRef(null);
    const mouseDownRef = useRef(false);

    useEffect(() => {
        const ctx = canvas.getContext('2d');
        ctxRef.current = ctx;

        const mouseUpHandler = () => {
            mouseDownRef.current = false;
        };

        const mouseDownHandler = (e) => {
            mouseDownRef.current = true;
            ctx.beginPath();
            ctx.moveTo(e.pageX - e.target.offsetLeft, e.pageY - e.target.offsetTop);
        };

        const mouseMoveHandler = (e) => {
            if (mouseDownRef.current) {
                draw(e.pageX - e.target.offsetLeft, e.pageY - e.target.offsetTop);
            }
        };

        const draw = (x, y) => {
            ctx.lineTo(x, y);
            ctx.stroke();
        };

        canvas.addEventListener('mouseup', mouseUpHandler);
        canvas.addEventListener('mousedown', mouseDownHandler);
        canvas.addEventListener('mousemove', mouseMoveHandler);

        return () => {
            canvas.removeEventListener('mouseup', mouseUpHandler);
            canvas.removeEventListener('mousedown', mouseDownHandler);
            canvas.removeEventListener('mousemove', mouseMoveHandler);
        };
    }, [canvas]);

    return {
        setFillColor: (color) => {
            ctxRef.current.fillStyle = color;
        },
        setStrokeColor: (color) => {
            ctxRef.current.strokeStyle = color;
        },
        setLineWidth: (width) => {
            ctxRef.current.lineWidth = width;
        }
    };
}

export default useBrush;
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы