effectScope() 副作用をスコープにまとめて管理する

最終更新:2026-10-22

effectScope() 副作用をスコープにまとめて管理する

effectScope() は複数のウォッチャーや算出プロパティを 1 つのスコープにまとめ、一括で開始・停止できます。個別の stop 関数を管理する手間がなくなります。

グループリアクティビティ: 応用
種類API
スコープコンポーネント内
Vue バージョン3.0+
SSR 対応対応

📝 構文

const scope = effectScope()
scope.run(() => {
  watch(a, fn)
  watchEffect(fn2)
})
scope.stop()   // スコープ内の全副作用を一度に停止

⚙️ 引数

detachedtrue にすると親スコープから切り離します(デフォルトは false で親と一緒に停止)

戻り値:スコープオブジェクト:run(cb) / stop() / on() / off() / pause() / resume()

▶ 例

以下のコードを編集して結果を確認しましょう:

出力:

Both logs follow changes until stopAll() is clicked, then neither updates.

💡 ポイント

💡 ヒント コンポーザブル内で使うと、呼び出し側は 1 つの stop(スコープのハンドル)だけで全体を破棄できます。
ℹ️ 補足 コンポーネント内ではデフォルトでコンポーネントのスコープに紐づきます。detached: true にすればコンポーネントを越えて独立して生存できます。
⚠️ 注意 スコープに収集されるのは、そのスコープが実行中に作成された computed / watch だけです。
関連ケースは近日公開予定。

📚 関連チュートリアル

❓ よくある質問

Q なくても済みますか?
A 1 つのウォッチャーなら返りの stop で十分です。複数の副作用をまとめて管理する場面では、ボイラープレートを大幅に減らせます。
Q detached はいつ使うのですか?
A コンポーネントのライフサイクルを越えて生存する状態管理(Pinia の内部など)で使われます。
Q 一時停止できますか?
A 3.4 以降は pause() / resume() が提供され、スコープ内の全副作用を一時的に停止・再開できます。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%