在svelte kit中是否有办法在完成__layout.svelte
的onMount
功能后再执行页面的onMount
功能?在__layout.svelte
的onMount
中,我初始化了firebase,在onMount
中,我使用了firebase认证。所以如果没有完成__layput.svelte
的onMount
,我就不能运行它。
firebase函数也不能在load
函数中工作,因为它们需要访问window
对象。
除了这个,还有更好的方法来使用firebase吗?
__layout。苗条的,
onMount(() => {
let fApp: FirebaseApp;
if (getApps().length === 0) {
fApp = initializeApp(firebaseConfig);
} else {
fApp = getApp();
}
const fAuth = getAuth(fApp);
$app = fApp;
$auth = fAuth;
onAuthStateChanged(fAuth, (user) => {
if (user) {
$signedIn = true;
} else {
$signedIn = false;
} //app, auth and signedIn are stores
});
});
在另一个文件中,我想使用firebase认证,但getAuth
返回一个错误,当页面直接导航到时,没有firebase应用程序初始化。应用程序在布局文件的onMount
中初始化,但页面的onMount
在它完成之前被调用。
有一种方法,但我根本不建议使用,因为这会有效地消除任何服务器端呈现的可能性。
简单地把slot
从你的布局包装在一个if块检查hasMounted
标志
<script>
import { onMount } from "svelte";
let hasMounted = false;
onMount(() => {
console.log("layout has mounted");
hasMounted = true;
});
</script>
{#if hasMounted}
<slot />
{/if}
但是因为这个标志只被设置为true在onMount
中,这意味着它永远不会是true服务器端,所以如果你这样做,就不会有更多的服务器端渲染。