Skip to content
On this page

Фетчинг данных

flue3 не предоставляет из коробки HTTP клиент, но имеет полифил для работы с Fetch API на сервере.

При инициализации

При инициализации приложения, вы можете запросить некоторые данные и сохранить их в стейт с помощью useState с последующем использованием в компонентах.

src/app.ts

typescript
import {createApp, useState} from 'flue3';

import App from '@/App.vue';

export default createApp(App, {}, async () => {
    const user = useState('user');
    
    /*
    Так как эта функция вызывается на сервере и клиенте,
    то если мы вызоваем эту функция снова на клиенте,
    когда она уже отработала на сервере,
    то нет смысла запрашивать данные второй раз,
    так как на клиенте state.user уже будет в себе содержать данные.
     */
    if(!user.value) {
        try {
            /* запрашивает данные с api */
            const userRes = await fetch('/api/user')
                .then((response) => response.json());

            /* сохраняем данные в глобальном стейте */
            user.value = userRes;
        } catch (err) {
           /*
           Здесь мы можем вызвать appContext.error(...),
           если хотим показать страницу ошибки.
           */
           console.error('failed to fetch user', err);
        }
    }
});

После в setup функциях, мы можем воспользоваться так же useState для получениях данных из глобального стейте.

src/App.vue

vue
<template>
    <div>
        <!--
        при первой отрисовки компонента
        данные уже доступны и готовы к использованию
        -->
        {{ user }}
    </div>
</template>

<script lang="ts" setup>
import {useState} from 'flue3';

const user = useState('user');
</script>

В setup функциях

В setup функциях можно воспользоваться функцией useAsyncData что бы не заботиться о переиспользовании и гидрации стейта с сервера на клиент.

vue
<template>
    <div>
        <!--
        при первой отрисовки компонента
        данные уже доступны и готовы к использованию
        -->
        {{ user }}
    </div>
</template>

<script lang="ts" setup>
import {useAsyncData} from 'flue3';

const { data: user } = await useAsyncData('user', async () => {
    const user = await fetch('/api/user')
        .then((response) => response.json());

    return user;
});
</script>

Лицензия MIT. Используй как хочешь. Если хочешь...