Skip to content

useTauriInvoke ​

Le composable useTauriInvoke vous permet d'exécuter des commandes Tauri avec une gestion d'état réactive, fournissant un pont transparent entre votre frontend Vue et votre backend Rust.

Signature ​

typescript
function useTauriInvoke<T = unknown>(
    command: string,
    args?: Record<string, unknown>,
    options?: { immediate?: boolean }
): TauriInvokeReturn<T>;

Paramètres ​

command ​

  • Type : string
  • Requis : Oui
  • Description : Le nom de la commande Tauri à invoquer

args ​

  • Type : Record<string, unknown>
  • Requis : Non
  • Défaut : undefined
  • Description : Arguments à passer à la commande Tauri

options ​

  • Type : { immediate?: boolean }
  • Requis : Non
  • Défaut : { immediate: false }
  • Description : Options de configuration pour le composable

options.immediate ​

  • Type : boolean
  • Défaut : false
  • Description : Détermine si la commande doit être exécutée immédiatement lors de la création du composable

Valeur de Retour ​

Le composable retourne un objet avec les propriétés suivantes :

data ​

  • Type : Readonly<Ref<T | null>>
  • Description : Référence réactive contenant le résultat de la commande

pending ​

  • Type : Readonly<Ref<boolean>>
  • Description : Référence réactive indiquant si la commande est en cours d'exécution

error ​

  • Type : Readonly<Ref<Error | null>>
  • Description : Référence réactive contenant toute erreur survenue pendant l'exécution

execute ​

  • Type : () => Promise<void>
  • Description : Fonction pour exécuter manuellement la commande

refresh ​

  • Type : () => Promise<void>
  • Description : Alias pour la fonction execute

Exemples d'Usage ​

Usage Basique ​

vue
<template>
    <div>
        <button @click="execute" :disabled="pending">
            {{ pending ? "Chargement..." : "Récupérer les données" }}
        </button>

        <div v-if="error" class="error">Erreur : {{ error.message }}</div>

        <div v-if="data">Résultat : {{ data }}</div>
    </div>
</template>

<script setup>
const { data, pending, error, execute } = useTauriInvoke("get_app_version");
</script>

Avec Arguments ​

vue
<template>
    <div>
        <input v-model="userId" type="number" placeholder="ID Utilisateur" />
        <button @click="fetchUser" :disabled="pending">
            {{ pending ? "Chargement..." : "Récupérer l'utilisateur" }}
        </button>

        <div v-if="error" class="error">Erreur : {{ error.message }}</div>

        <div v-if="data">
            <h3>{{ data.name }}</h3>
            <p>{{ data.email }}</p>
        </div>
    </div>
</template>

<script setup>
const userId = ref(1);

const {
    data,
    pending,
    error,
    execute: fetchUser,
} = useTauriInvoke(
    "get_user",
    computed(() => ({ id: userId.value }))
);
</script>

Avec TypeScript ​

vue
<template>
    <div>
        <button @click="execute" :disabled="pending">
            Récupérer l'utilisateur
        </button>

        <!-- TypeScript assure que data est correctement typé -->
        <div v-if="data">
            <h3>{{ data.name }}</h3>
            <p>{{ data.email }}</p>
            <span>{{ data.isActive ? "Actif" : "Inactif" }}</span>
        </div>
    </div>
</template>

<script setup>
interface User {
  id: number
  name: string
  email: string
  isActive: boolean
}

const { data, pending, error, execute } = useTauriInvoke<User>('get_user', { id: 1 })
</script>

Exécution Immédiate ​

vue
<template>
    <div>
        <!-- Les données se chargent immédiatement au montage du composant -->
        <div v-if="pending">Chargement de la configuration...</div>

        <div v-if="error" class="error">
            Échec du chargement de la configuration : {{ error.message }}
        </div>

        <div v-if="data">
            <h3>Configuration de l'Application</h3>
            <pre>{{ JSON.stringify(data, null, 2) }}</pre>
        </div>
    </div>
</template>

<script setup>
interface AppConfig {
  theme: string
  language: string
  autoSave: boolean
}

const { data, pending, error } = useTauriInvoke<AppConfig>(
  'get_app_config',
  {},
  { immediate: true }
)
</script>

Gestion d'Erreurs ​

vue
<template>
    <div>
        <button @click="execute" :disabled="pending">Opération Risquée</button>

        <div v-if="error" class="error">
            <h4>Échec de l'Opération</h4>
            <p>{{ error.message }}</p>
            <button @click="execute">Réessayer</button>
        </div>

        <div v-if="data" class="success">Opération terminée avec succès !</div>
    </div>
</template>

<script setup>
const { data, pending, error, execute } = useTauriInvoke("risky_operation");

// Observer les erreurs et les gérer
watchEffect(() => {
    if (error.value) {
        console.error("Échec de l'opération:", error.value);

        // Vous pourriez aussi afficher une notification toast
        // showToast({ type: 'error', message: error.value.message })
    }
});
</script>

Arguments Réactifs ​

vue
<template>
    <div>
        <input v-model="searchQuery" placeholder="Rechercher..." />
        <button @click="search" :disabled="pending || !searchQuery">
            Rechercher
        </button>

        <div v-if="pending">Recherche en cours...</div>

        <div v-if="results">
            <h3>{{ results.length }} résultats trouvés</h3>
            <ul>
                <li v-for="result in results" :key="result.id">
                    {{ result.title }}
                </li>
            </ul>
        </div>
    </div>
</template>

<script setup>
const searchQuery = ref("");

const {
    data: results,
    pending,
    error,
    execute: search,
} = useTauriInvoke(
    "search",
    computed(() => ({ query: searchQuery.value }))
);
</script>

Gestion d'Erreurs ​

Le composable attrape et gère automatiquement les erreurs :

  • API Tauri non disponible : Lors de l'exécution dans un environnement navigateur
  • Commande introuvable : Quand la commande Rust n'existe pas
  • Erreurs d'exécution de commande : Toute erreur lancée par votre commande Rust
typescript
// Exemple de gestion de types d'erreurs spécifiques
watchEffect(() => {
    if (error.value) {
        if (error.value.message.includes("Tauri API not available")) {
            console.log("Fonctionnement en mode navigateur");
        } else if (error.value.message.includes("command not found")) {
            console.error("Commande Rust non enregistrée");
        } else {
            console.error("Erreur d'exécution de commande:", error.value);
        }
    }
});

Bonnes Pratiques ​

1. Utiliser TypeScript ​

Fournissez toujours des paramètres de type pour une meilleure expérience de développement :

typescript
const { data } = useTauriInvoke<MonTypeDeData>("ma_commande");

2. Gérer les États de Chargement ​

Fournissez toujours un retour pendant l'exécution de la commande :

vue
<button :disabled="pending">
  {{ pending ? 'Chargement...' : 'Exécuter' }}
</button>

3. Gérer les Erreurs avec Élégance ​

Fournissez des messages d'erreur significatifs aux utilisateurs :

vue
<div v-if="error" class="error">
  Quelque chose s'est mal passé. Veuillez réessayer.
</div>

4. Utiliser des Arguments Computed ​

Pour des arguments réactifs, utilisez des propriétés computed :

typescript
const args = computed(() => ({ id: userId.value }));
const { data } = useTauriInvoke("get_user", args);

Articles Liés ​