特定のルートのページをレンダリングする前に、まず必要なデータを同期的に取得したいと考えています。理想的にはページコンポーネントでデータを取得したいのですが、ルーターファイルでそれを行うことに反対しません。私はさまざまなアプローチを読んだり試したりしてきましたが、課題の一部は、コンポーネントを構築する方法が複数あり、特定の機能の使用方法が異なるという事実から来ています。
私の場合は、Composition API と を使用します。
语法构建单文件组件。 Vue Router 文档链接讨论了“导航前获取”,其中我可以访问 beforeRouteEnter
或 beforeRouteUpdate
,但这是使用选项 API 显示的。他们确实有 Composition API 的页面,提到我可以使用 onBeforeRouteUpdate
,但它使用 setup()
函数。我想无论如何我都会尝试使用
:
<script setup> import { onBeforeRouteUpdate } from 'vue-router' onBeforeRouteUpdate(() => { console.log('onBeforeRouteUpdate') }) </script>
但是,这不会执行。我尝试过的最接近的方法是使用 beforeEnter
防护来获取路由器中的数据,并将数据设置到 meta
属性上,然后可以在组件中的路由实例上访问该属性: p>
beforeEnter: (to, from, next) => { fetch('https://pokeapi.co/api/v2/pokemon/ditto') .then(res => res.json()) .then(res => { to.meta.pokemon = res; next(); }); }
但是有了这个,文档中指出, beforeEnter
仅在输入路由时触发。参数更改不会重新触发此问题,这意味着我必须在组件中的路线上设置一个观察程序。我还不如将所有这些逻辑都放在组件本身中。
我似乎找不到一个好的方法来做到这一点,但我可能忽略了一些事情。如果有人有一些指示或建议,我将不胜感激。提前致谢。
P粉5462579132023-11-18 12:39:56
まず第一に、beforeRouteUpdate
は実際のルートが更新されたときにのみトリガーされますが、公式の がここで に伝えるように、別のコンポーネント/ページには移動しません。
ライフサイクル フックをトリガーする可能性のあるものの例は次のとおりです。 リーリー
onBeforeRouteLeave あるページから別のページに移動するときは、ご想像のとおり、完璧に機能します。
Nuxt が するような、何らかの種類の ルーター ミドルウェア を実装できます。このようにして、 HTTP 呼び出しを待機し、 その後初めて
実際のナビゲーションを許可します。したがって、ブロック ナビゲーション効果を作成することはほぼ可能です。
Comboposition API を使用してこれを記述する方法はわかりませんが、Options API で完全に動作することはわかっています (利用可能なブログ投稿がたくさんあります)。
自体は独自のライフサイクル方法で実行され、多くのことがかなりトリッキーだと思います。
TLDR: 私の意見では、優れたルーター ミドルウェア ページ ラッパー (レイアウトなど) があなたの場合には完璧な組み合わせです。そこでは、同時にかなりの数のページに対してオブザーバーを設定できます。
しかし、すべては自分自身をどのように整理し、コードを構造化したいかによって決まります。
スケルトン画面はブロックするよりも速い印象を与えますが、一般に、
(これもデフォルトで Nuxt に同梱されています) を使用してヒントを取得することもできます。場合によっては、それらをロードする前に特定のリソースが必要です。 (ネットワークリクエストを高速化するための同じドメイン内の他のトリック)
P粉5459565972023-11-18 11:49:37
解決策があります - トップレベルの await を使用します - https://vuejs.org/api/sfc-script-setup.html#top-level-await
以下に示すように、RouterView コンポーネントを Suspense コンポーネントでラップするだけです - https://vuejs.org/guide/built-ins/suspense.html#combining-with-other-components( Don'不要なコンポーネントは使用しないでください)
唯一注意すべき点は、最初のリクエストで「読み込み画面」が表示されることです。
小さなデモを作成しましたので、試してみてください - https://github.com/ileue/vue-top-level-await-demo