使用Svelte组件访问异步函数的返回值
P粉463824410
P粉463824410 2023-08-16 00:11:05
0
1
556
<p>我有以下的代码片段(+layout.svelte):</p> <pre class="brush:js;toolbar:false;">import { getLang } from "$lib/locale"; import { browser } from "$app/environment"; const loadLang = async () => { if (browser) { // return await getLang(document.documentElement.lang, "home").then( function (data: any) { // const nav = JSON.stringify(data.nav); // console.log(nav) // return nav; // }); const initLocale= await getLang(document.documentElement.lang, "home"); return initLocale.json(); } }; const a = loadLang(); console.log(a); </pre> <p>这段代码的作用是检测浏览器语言和请求的路由,然后搜索与语言和页面对应的正确的JSON文件。但是有一个问题,我无法访问异步<code>loadLang()</code>的语言数据,以便在组件的HTML元素中使用它,除了这里提到的许多答案(这不是我要找的),我想要的是一种访问上述函数的返回值并在HTML元素中使用它的方法?</p>
P粉463824410
P粉463824410

全部回复(1)
P粉174151913

在标记中,有原生语法(有很多变体)可以用于等待承诺:

{#await loadLang() then lang}
  <span>{lang.someValue}</span>
{/await}

另一种选择是在顶层范围声明一个变量,并在数据加载后设置它。当然,它首先会是未定义的,或者是您初始化的其他任何值。然后通常会与{#if}结合使用:

let lang;
loadLang().then(l => lang = l);
{#if lang}
  <span>{lang.someValue}</span>
{/if}

browser上有一个守卫并不好。您可能希望将数据加载移到+layout加载函数中,以便将其作为data属性传递,并且可以在SSR和CSR期间使用,并且对使用布局的每个页面都可用。

不要使用document.documentElement.lang,而是在服务器上使用请求的Accept-Language头。

在页面提供/渲染之前加载数据还可以防止潜在的布局变化或加载指示器。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板