💬

Fluent UI React で Context Menu を表示する

に公開

リリックドラゴンRPGエディタ というプロジェクトでゲームエンジンを作っています。

少し前に こちら の記事でフロントエンドのコンポーネントライブラリを Fluent UI に移行しました。
今回はコンテキストメニューを指定位置に表示する方法を調べたので、そのメモです。

と言っても検索してもパッと出てこないし、AIに聞いてもDOM直接いじるとか怪しい回答しかないしで、結局 聞きました。超絶早速の返信に感謝です。

要点だけ書くと次のようになります。 回答先のリンク は Tooltip を使っていますが、併せてご参照ください。

export const ContextMenu = () => {
    const targetOffset = { x: 100, y: 200 }; // 目的の位置
    const positioningRef = React.useRef<PositioningImperativeRef>(null);

    React.useEffect(() => {
        const x = targetOffset.x;
        const y = targetOffset.y;
        const virtualElement: PositioningVirtualElement = {
            getBoundingClientRect: () => ({
                width: 0,
                height: 0,
                top: y,
                right: x,
                bottom: y,
                left: x,
                x,
                y,
            }),
        };
        positioningRef.current?.setTarget(virtualElement);
    }, [positioningRef, targetOffset]);

    return (
        <Menu
            positioning={{
                positioningRef: positioningRef,
            }}
        >
            ...
        </Menu>
    );
};

targetOffset をマウス位置にすることで、次のように表示できました。

うん、きれい。よきよき。

Discussion