2
votes

Appel de la méthode de service dans un modèle Vue

j'ai

import axios from 'axios';
import router from '@/router';

const ApiService = {

    init(baseURL) {
        axios.defaults.baseURL = baseURL;
    },

    //...

    doSomething() {
        router.push({ path: '/goSomewhere' });
    },

}

export default ApiService

Si je le raccourcis (comme je suis utilisé dans Angular):

<template>
  <button @click="ApiService.doSomething">...</button>
</template>

<script>
import ApiService from '../service/api.service';
</script>

Cela ne fonctionne pas, génère une erreur d'exécution. (Cela ne fonctionne pas même si j'essaye en tant qu'appel de fonction: @ click = "ApiService.doSomething ()"

Pouvez-vous aider, comment gagner du temps / code et appeler directement ApiService.doSomething juste dans un modèle?


PS, ils m'ont demandé de publier également ApiService alors le voici: api.service.js:

<template>
  <button @click="doSomething">...</button>
</template>

<script>
import ApiService from '../service/api.service';
export default {
  setup() {
      function doSomething() {
        ApiService.doSomething();
      }
      return {
        doSomething
      }
  }
}
</script>


0 commentaires

3 Réponses :


0
votes

Pourriez-vous essayer d'ajouter des parenthèses à l'appel de fonction?

<template>
  <button @click="ApiService.doSomething()">...</button>
</template>

<script>
import ApiService from '../service/api.service';
</script>


1 commentaires

Non, ça ne marche pas. Cependant, je modifierai la question



5
votes

Cela ne fonctionne pas car vous devez le faire passer par la fonction de setup pour être disponible dans le modèle.

vous pouvez le faire cependant:

<template>
  <button @click="ApiService.doSomething">...</button>
</template>

<script setup>
import ApiService from '../service/api.service';
export ApiService;
</script>

Alternativement, vous pouvez également utiliser l'attribut setup pour le script, qui fait de la magie de levage pour vous. ( lien rfc )

<template>
  <button @click="ApiService.doSomething">...</button>
</template>

<script>
import ApiService from '../service/api.service';
export default {
  setup() {
      return { ApiService }
  }
}
</script>


10 commentaires

Mais pour la deuxième solution, j'obtiens l'erreur du compilateur "'ApiService' est défini mais jamais utilisé"


mon mauvais, j'ai raté l'exportation


Fonctionne, mais j'ai dû mettre ApiService entre crochets: export {ApiService} sinon il a renvoyé une erreur: jeton inattendu, attendu "{"


Cette dernière solution renvoie une erreur: Cette syntaxe expérimentale nécessite l'activation du plugin parser: 'exportDefaultFrom'


La version précédente de votre deuxième solution était correcte, si j'enveloppe ApiService entre crochets.


intéressant. 🤔 selon github.com/vuejs/rfcs/blob/sfc-improvements/active-rfcs/ ... cela aurait dû fonctionner. Je l'ai rétabli


Mais cela ne fonctionne pas de cette façon; la deuxième ligne devrait être: export {ApiService}. Je sais que c'est bizarre et ce compilateur me rend fou


peut-être que la différence réside dans le {___ as ___} 🤷‍♂️. Une des raisons pour lesquelles je préfère des définitions plus explicites.


vous pouvez également export {...ApiService} si vous voulez que toutes les fonctions soient disponibles sans l '"espace de noms"


Nan. Cela génère: "Erreur d'analyse: jeton inattendu"



1
votes

Vous pouvez diffuser ces fonctions de service dans les méthodes d'option des methods:{...ApiService } :

const ApiService = {
  doSomething() {
    console.log("doing something");
  },

  doSomething2() {
    console.log("doing something 2");
  },

  doSomething3() {
    console.log("doing something 3");
  }
};

export default ApiService;

api.service.js

<template>
  <button @click="doSomething">...</button>
</template>

<script>
import  ApiService from '../service/api.service';
export default {
methods:{
  ...ApiService
}
}
</script>

DÉMO EN DIRECT


12 commentaires

Comme Daniel l'a prouvé dans sa première solution, c'est possible.


Ok, qu'en est-il de ma suggestion?


Je ne veux pas utiliser comme 20 méthodes pour importer une par une ... (import {doSomething, doSomething2, doSomething3}) ... J'ai besoin de méthodes ApiService, c'est pourquoi c'est un service.


qu'en est-il de la diffusion de ce service dans les méthodes option methods:{...ApiService }


Que faire si j'ai besoin de "doSomething" dans ma vue actuelle et que j'utilise également doSomething du service? Mais veuillez mettre à jour la réponse avec le code complet pour que je puisse l'essayer, car votre solution initiale lève de toute façon une erreur d'exécution dans runtime-core.esm-bundler: impossible de lire la propriété 'apply' de undefined


de rien, veuillez vérifier ma réponse modifiée


Merci, mais je dois ensuite modifier tout mon ApiService. J'ai un POJO const ApiService = {...}, puis à la fin: exporter ApiService par défaut


veuillez partager un extrait de votre objet ApiService qui montre sa structure


il est également valable avec la syntaxe de votre objet import ApiService from '../service/api.service'; et methods:{...ApiService} veuillez consulter cette démo


Merci, cela fonctionne donc je vais donner votre commentaire ci-dessus un autre vote positif. Cependant, votre réponse ne reçoit pas de vote pour plusieurs raisons: je voulais une solution Vue3 avec setup (). Deuxièmement, je ne peux pas utiliser la méthode "doSomething" localement de cette façon à cause d'un conflit avec le même nom, je voulais spécifiquement avoir un appel "ApiService.doSomething" comme je l'ai mentionné dans ma question. Troisièmement, la solution Daniel était plus simple et correspondait à ce que je voulais et attendais de Vue3. Merci quand même.


vous êtes le bienvenu, j'ai essayé de fournir un code plus court comme vous l'avez demandé, j'ai suggéré la diffusion afin d'éviter d'appeler AppService.methodName chaque fois, si vous préférez l'API de composition, vous pouvez faire setup(){ return{...ApiService}} puis @click="doSomething"


mon approche est la même que mapActions de vuex lorsque vous répartissez les actions de magasin dans l'option de méthodes