-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
辞書の単語・読み入力欄で右クリックメニューを使えるようにする #2156
辞書の単語・読み入力欄で右クリックメニューを使えるようにする #2156
Conversation
コンポーザブルを追加し、右クリックメニューに関する処理のほとんどをそちらに移動させました。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ちょっとこっちでも調べてみたんですが、なぜnativeElがundefinedになるのかよくわかんないですね・・・・・・。
もしかしたらQInputがv-model
指定されている状態だと、refで得られるものがQInput
じゃなくて直接HTMLInputになってるかも・・・?
なのでconst nativeEl = this.textfield.value?.nativeEl
となっている部分をconst nativeEl = this.textfield.value
にすればとりあえず動きました・・・。
何か参考になれば 🙇
@Hiroshiba |
設計方針についてコメントです 🙏 現状 で、たぶん あと だいぶVueに慣れている自分からのコメントなので、結構説明が短絡的になってるかもです。 |
@Hiroshiba
|
@jdkfx
|
f8763b7
to
3ce1f1f
Compare
@Hiroshiba |
お! 現象としてどういうことが起こってる感じでしょうか 👀 |
2024-08-07.2.07.57.mov言葉での説明が難しいので、キャプチャを用いて説明します。
過去にコピー貼り付け動作を行った内容が、別の単語読み辞書でも反映されてしまうといえばいいのかなと考えています。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
詳しくありがとうございます!!!
見てみました!
実際にどういうコードを書いたのか↓でプルリクエストを出してみました!
コード共有の意図なので適当にクローズしていただければ 🙏
原因はなかなか難しいのですが、こういう感じです!
- Vueのv-ifはon/offになるたびにDOMを作り直す
- 辞書登録用の右側のパネルはv-ifで表示を制御してる
- なのでパネルの中にあるsurfaceInputなどは、開いたり閉じたりするたびにDOMが再構成されてる
- QInputSelectorは辞書ダイアログが開かれた時に1回だけ呼ばれる
- その後初めて右クリックでコンテキストメニューが開かれた時にQInputのを取得してnativeElをキャッシュする
- キャッシュしてしまってるので、一度閉じて開いたら、すでに画面上にないQInputの選択範囲を取ろうとし、空の文字列を得る
- 今のコードだと空の文字列の場合でも、選択している文字列を上書きしないコードになってるので、以前選択したものがそのまま現れる
- まあそんなこんなで不可解な挙動になってる
解決策はいくつかありそうです!
その筋の良さも合わせてご紹介したいと思います。
- v-ifを使わず、v-showにする
- ここのコードをv-showにする
- 要素の再生成がされなくなるので、結構正しい動きをするようになるはず
- ただ別のところでv-ifされるようになると同じようにバグってしまうのでちょっと微妙
- QInputSelector内でnativeElのキャッシュを取らないようにする
- 消えてしまったQInputのキャッシュを持ち続けてしまっているのもよくない
- なのでnativeElのキャッシュを取らないように、毎回現在のQInputから取得するようにすればうまく動くはず?(試してないですが)
- これも微妙に根本の解決とはずれてる
- 右側のパネルを別コンポーネントにする
- そもそも問題なのは、v-ifで消えたり現れたりするものを、コンポーネントとして切り分けずダイアログ全体で管理してること
- v-ifで聞いたり現れたりするもの全部を別コンポーネントに分ければ良い
- そのコンポーネントの中で
useRightClickContextMenu
を使う - そうするとDOMが再度現れるたびに
useRightClickContextMenu
が実行されるようになる - 多分これが一番綺麗・・・というかコンポーネントで分けていく思想に合ってるんだけど、Vueに慣れていないとちょっと大変
という感じです!!
これは提案なのですが、もしVueなどのWeb UIフレームワークに慣れることが目的なのでしたら、このコンポーネント切り出しに挑戦してみるのも勉強になると思います!!
コンポーネント側に単語や読みの情報を渡したり、逆にコンポーネント側からイベントをemitしてもらったりする必要があるので結構大変ではあるかもですが、どれもそこそこ基本的なことなので勉強になるかなと!
その時はコンポーネントを切り出すだけの別のプルリクエストを作っていただけるとちょっとありがたいです!
もし時間がなければ他の方法でも、あるいは他のissueにチャレンジしてみるのもありだと思います!
また困ったことがあったら何でも聞いてください!!
@Hiroshiba
ちょうど、詰まってしまったので気分転換にやっていたコンポーネント切り出しのIssueがうまくいきそうでしたので、こちらも併せてどこかでPRを出せればいいかなと思っています! |
@Hiroshiba |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
変更ありがとうございます! レビューしました!!
1点ちょっと設計を迷ってる点を。
今QInput1つとuseRightClickContextMenu1つの2つを定義して、関数とかを代入してますよね。
これらをまとめちゃって1つの新しいコンポーネントを作った方がいいのか分からないでいます。
気軽に右クリックコンテキストメニューが使えるInputコンポーネントが欲しい気がするので、まとめたものも用意すると便利なのかなぁ・・・みたいな。
(少なくともこのプルリクエストは今の実装で問題ないはず。新しくコンポーネントを作るべきかどうかという観点です。)
確かに言われてみれば便利そうな気がします!! |
d738f95
to
0680595
Compare
@Hiroshiba |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ほぼLGTMです!!!
あとは細かい部分だけ・・・!!!
ほんとに細かいとこもコメントしているので、ご面倒であれば残しといていただければこっちでやっちゃいます! 🙏
@Hiroshiba |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
根気よく付き合ってくださってありがとうございました!!
しっかりしたコンポーザブルができたと思います!!
もしよかったらぜひまた要素切り出しにチャレンジしてみてください!!
いつもながらですが、不明な点があればissueとかでいつでもお聞きください 🙏
@Hiroshiba |
内容
関連 Issue
close #747
スクリーンショット・動画など
2024-08-15.3.12.57.mov
その他
今後の課題