簡體   English   中英

如何在無狀態組件中使用“this”變量來處理鼠標事件

[英]How to use "this" variables in stateless component to handle mouse events

假設我有這個類組件,我必須在其中檢查鼠標是否按住單擊、跟蹤坐標並執行一些操作。 我曾經創建過一個類,我可以在其中存儲“this”變量以通過組件訪問它們。 如何在不需要創建類的情況下處理功能組件中的這些類型的變量? 我知道舊方法只有在狀態改變時(理想情況)才會重新渲染狀態,使用新方法會有點問題,對吧? 在我的情況下,我需要通過組件中的其他函數使用 this.increment 變量(以及更多)。

class MyComp extends React.Component{
    onMouseDown(e){
        this.isMouseDown = true;
        this.startX = e.clientX
        this.startY = e.clientY
    }
    onMouseMove(e){
        let x = e.clientX;
        let y = e.clientY;
        if (this.isMouseDown){
            this.increment = this.startY - y
            // do stuff with this.startX and this.startY
            // ....
        }
    }
    onMouseUp(){
        this.isMouseDown = false;
    }
    render() {
        return <div onMouseDown={this.onMouseDown.bind(this)}
                    onMouseMove={this.onMouseMove.bind(this)}
                    onMouseUp={this.onMouseUp.bind(this)} />
    }
}

如何使用這樣的功能組件實現相同的功能?

function MyComp ({ text }) {
    return  <div onMouseDown={e => onMouseDown(e)}
                onMouseMove={e => onMouseMove(e)}
                onMouseUp={e => onMouseUp(e)}>
                {text}
            </div>
}

謝謝你的時間!

閱讀有關 useRef 和 useCallback 鈎子的更多信息。 使用這些,您可以在功能組件內創建與狀態無關的變量和回調引用。

React.js 文檔中的鈎子參考

這是重構為使用鈎子的類組件邏輯:

function MyComp ({ text }) {
    const trackData = React.useRef({});

    const onMouseDown = React.useCallback((e) => {
        trackData.current.isMouseDown = true;
        trackData.current.startX = e.clientX
        trackData.current.startY = e.clientY
    }, [trackData]);

    ...

    return  <div onMouseDown={e => onMouseDown(e)}
                onMouseMove={e => onMouseMove(e)}
                onMouseUp={e => onMouseUp(e)}>
                {text}
            </div>
}

JS 允許在函數內部創建函數。 您可以創建一個功能性 React 組件,該組件幾乎沒有可用作您的需求的函數定義,如下所示:

function MyComp ({ text }) {
    const onMouseDown = (evt) => {
        ... //your code goes here
    }
    ... // same for onMouseMove & onMouseUp
    return  <div onMouseDown={e => onMouseDown(e)}
                onMouseMove={e => onMouseMove(e)}
                onMouseUp={e => onMouseUp(e)}>
                {text}
            </div>
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM