2

サッパーのセッションが書き込み可能なストアであることは知っています。次のように書き込めます。

<script>
    import { stores } from "@sapper/app"
    const { session } = stores()
    session.set("new value")
</script>

ただし、プリロード関数内に書き込むのに苦労しています。

<script context="module">
    export async function preload(page, session) {
        session = "new value" // not working, this is just a value, not a store
    }
</script>

_layout.svelteプリロード中にデータを設定する必要があります。サポートされている方法はありますか?

EDIT セッションをまったく使用せず、単純な書き込み可能なストアにしました。それほどきれいではありませんが、目的には役立ちます。誰かが方法を見つけた場合、または将来サポートされるようになった場合は、これを開いたままにしておきます。

4

2 に答える 2

2

前述のように、プリロードのセッション変数はセッション ストアと同じではありません...それらはたまたま同じ名前を共有しており、スコープによって互いに分離されているため機能します。

sapper によって提供されるプリロード機能は、クライアントとサーバーの両方で実行されますが、ストアは、svelte の一部であるため、クライアントにのみ存在するため、プリロードにストアをインポートすることはできません。わかっている。

私の場合、最初にアプリにアクセスしたときに、HttpOnly Cookie を使用してクライアントのセッションが既に存在する場合は、セッションを更新したいと考えました。私にとって、このコードが存在する最も明白な場所は _layout.svelte ファイルです。

私の回避策は、currentSession変数を作成し、次のようにセッションデータを割り当てることになりました。

<script context="module">
    export async function preload(page, session) {
        let currentSession = session;
        return { currentSession };
    }
</script>

次に、メインのスクリプトタグで

<script>
export let currentSession; // <-- Needs export because it's a prop.
import { session } from '../stores.js';
session.set(currentSession);

// ...Do more stuff...
</script>

これは理想的なことではありません-私たち二人が望んでいる-つまり、セッション変数はインポート時にセッションデータのストアとして既に存在しますが、それは私が推測する次善の策です。主な利点は、次のようなものでストアを初期化すると、コンポーネントがロードされるlet session = writeable(null);までに$sessionなくなることです。null

良い方法を思いついたら、教えてください。ありがとう。

于 2020-12-15T13:52:06.243 に答える