リアクティブコンテキスト内で実行できない関数が、リアクティブコンテキスト内から呼び出されました。
たとえば、effect
はcomputed
またはアクティブに実行されているeffect
内からスケジュールできません。
テンプレート式の内部でeffect
のような関数を呼び出すのは避けてください。これらの関数は、独自のリアクティブコンテキストで実行されます。
計算式は、純粋であることが期待されます。
純粋とは、式が副作用を発生させないことを意味します。
副作用とは、afterRender
のスケジュール、新しいeffect
の作成、またはObservableの購読などの操作です。
いくつかの操作は、一般的な落とし穴を回避するために、リアクティブコンテキスト内では明示的に禁止されています。
たとえば、computed
内からafterRender
を使用すると、計算式が評価されるたびに新しいレンダリングフックがスケジュールされます。
これは意図されたものでなく、アプリケーションのパフォーマンスを低下させる可能性があります。
エラーの修正
このエラーガイドは網羅的なものではありません。 いくつかの一般的なシナリオとエラーの対処方法を説明しています。
afterRender
afterRender
の呼び出しをリアクティブコンテキストの外に移します。
afterRender
フックをスケジュールする適切な場所は、コンポーネントのクラスコンストラクターです。
または、untracked
を使用してリアクティブコンテキストを離れ、明示的にこのエラーを回避します。
effect
effect
の呼び出しをリアクティブコンテキストの外に移します。
effect
をスケジュールする適切な場所は、@Component
のクラスコンストラクターです。
toSignal
toSignal
の呼び出しをリアクティブコンテキストの外に移します。
result = computed(() => { const dataSignal = toSignal(dataObservable$); return doSomething(dataSignal());});
これは、次のようにリファクタリングできます。
dataSignal = toSignal(dataObservable$);result = computed(() => doSomething(dataSignal()));
または、これが不可能な場合は、Observableを手動で購読することを検討してください。
最終手段として、untracked
を使用してリアクティブコンテキストを離れます。
リアクティブコンテキストを離れると、untracked
内のシグナル読み取りが無視される可能性があるため、注意してください。
@debugging
エラーメッセージには、予期せず呼び出された関数が記載されています。 アプリケーションコード内でこの関数呼び出しを探します。
または、ブラウザのスタックトレースは、関数が呼び出された場所と関数が配置されている場所を示します。