inkdrop.contextMenu.addをdisposeできない

こちらで質問していい内容か分からなかったので、違っていたらすみません。

inkdropのアプリを作成してみようと思いいま作成しています。
コピーのイベントをトリガーにして、コピーした内容をコンテキストメニューに追加する、というものを作っていて、追加上限に達したら古いものから削除したいのですが削除できません。
なにか間違ってますでしょうか。
inkdrop.menu.addのほうで試してみたのですが、こちらの場合はいけたのですが・・

const [menuList, setMenuList] = useState([])
途中の処理は省略
editorLayout.addEventListener('copy', (event) => {

   if (追加上限に達したら) {
       menuList[0]. dispose();
   }

    途中の処理は省略
    const cma = inkdrop.contextMenu.add(省略);
    menuList.push(cma);
});

分かりづらい部分が多々あるかと思いますがよろしくお願いいたします。

Tsukasaさん

こんにちは。ご質問ありがとうございます。プラグインを開発されているんですね。
まず Context Menuの挙動自体に問題があるかどうか調べました。以下の検証コードをターミナルで実行したところ、正しくメニューをdispose出来ました:

var menu = inkdrop.contextMenu.add({
  '.CodeMirror': [{
    label: 'History',
    submenu: [
      { label: 'Undo', command: 'core:undo' },
      { label: 'Redo', command: 'core:redo' }
    ]
  }]
})

メニューの削除:

menu.dispose()

この事から、dispose()自体には問題がないと思われます。
提示いただいたコードの断片からは確証が持てませんが、 menuList[0] のリファレンスが何らかの原因で壊れている可能性があります。例えば useCallbackあるいはuseEffect の Dependency array に menuList が入っていないとか。

また、menuList[0] を disposeしても、その配列要素は配列から削除されない事に注意してください。
Array.prototype.shift() などで要素を削除する必要があります。

ご返答ありがとうございます。

ご指摘頂いたとおり返答頂いた menuList[0]が壊れているっぽく、返信頂いたあと色々やってみたのですがうまくいきませんでした・・。
なのですが、ソースを1から見直して作り変えたら上手くいきました。
根本的な原因は分からずじまいなのですが一旦解決しましたのでこれで閉じようと思います。
お手数おかけしてすみません!
ありがとうございました!

1 Like