Skip to content
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

onMountedかonActivatedのどちらかが呼ばれた時に実行されるコンポーザブルを定義 #1890

Conversation

Hiroshiba
Copy link
Member

内容

KeepAliveとうまいこと向き合うプルリクエストです。

onActivatedが必要になってるのは、DOMを使った初期化コードを実行するためです。
なのにonMountedだけ呼ばれることがあるので困っていました。
ということで、初期化コードを実行するべきタイミングを保持しておいて、onMountedかonActivatedで最初に来た方で実行するコンポーザブルを定義してみました。

そもそもコンポーネントが始まる実行順序はこの3通りだけです。

  • onMounted→onActivated
    • エディタを初めて開いた時
  • onActivatedのみ
    • エディタを2回目に開いた時
  • onMountedのみ
    • v-ifで表示された時

これらのタイミングで1回だけ実行されればいいはず。
あとはonDeactivatedあるいはonUnmounedが呼ばれたらプラグをもう一度立てて再実行すればいいはず。

関連 Issue

resolve #1886

close #1888

その他

個人的には #1888 よりもこっちの方がいい気がしてます 😇

@Hiroshiba Hiroshiba requested a review from a team as a code owner March 2, 2024 19:14
@Hiroshiba Hiroshiba requested review from y-chan and removed request for a team March 2, 2024 19:14
@Hiroshiba Hiroshiba mentioned this pull request Mar 2, 2024
2 tasks
@Hiroshiba
Copy link
Member Author

@sigprogramming これで良さそうか、 #1888 のが良さそうか、ちょっとレビューいただけると・・・ 🙇

@sigprogramming
Copy link
Contributor

あまり良くないかもですが、
トークとソングどちらを開いているかをstoreで持って、

<div v-if="songEditorIsOpen">
  <slot></slot>
</div>

をコンポーネント化して、SequencerPitchの表示の切り替えを

<IfSongEditorIsOpen>
  <SequencerPitch v-if="showPitch" />
</IfSongEditorIsOpen>

のようにするという手もあるかも…?

@Hiroshiba
Copy link
Member Author

@sigprogramming
たしかに親コンポーネントでそうやって制御する手もあるかもですね!!
なにか別の謎挙動が起こるかも、とはちょっと思いました。

DOM等を取ってきてみて、ダメっぽかったら次の機会にリトライする、みたいなコードもできるかもです。
ちょっとVueの勉強がてら1回書いてみようと思います!! 🙇

Copy link
Member Author

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sigprogramming
すみません! 問題直ったと思うので見てもらっても良いでしょうか 🙇 🙇 🙇
(あんま興味なかったら遠慮なくおっしゃってください。。。 🙇 )

構造は前回コメントいただいたときから変わってないです。
いろいろ試したけど戻ってきた感じです。
onMounted時にDOMがなくてエラーになってると思ってたのですが、DOMはあるけどcanvasWidthが0になってたのが問題だったのでそこ変えただけです!

src/components/Sing/SequencerPitch.vue Show resolved Hide resolved
Copy link
Member Author

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なかなかレビューも難しい分野だと思うので、えいやでマージしようかなと思っています!
コンポーネント表示をv-ifで制御し、かつコンポーネント内でonActivatedを使う場合、代わりにこっちを使わないとそこそこレアなケースで問題が起こるという感じです。

あと数日待って特にコメントなければマージしたいと思います 🙏

@Hiroshiba
Copy link
Member Author

マージします・・・!!

@Hiroshiba Hiroshiba merged commit 7b72a50 into VOICEVOX:main Mar 27, 2024
9 checks passed
@Hiroshiba Hiroshiba deleted the onMountedかonActivatedのどちらかが呼ばれた時に実行されるコンポーザブルを定義 branch March 27, 2024 05:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

onActivatedを不要にする
2 participants