J'essaye d'obtenir des données d'une API dans un composant Laravel Vue. J'obtiens cette erreur dans la console:
TypeError: Impossible de définir la propriété 'continents' sur undefined
Que me manque-t-il?
Voici mon code:
<script> export default { mounted() { console.log('Component mounted.'); }, created(){ this.loadData(); }, data() { return { continents: [], } }, methods: { loadData: function() { axios.get('/api/continents') .then(function (response) { // handle success console.log(response.data); this.continents = response.data; }) .catch(function (error) { // handle error console.log(error); }) .then(function () { // always executed }); }, }, } </script>
3 Réponses :
Vous devez utiliser la fonction fléchée dans votre appel car cette instance n'est pas disponible dans votre. puis fonction de promesse . Essayez donc comme ci-dessous.
En savoir plus sur les fonctions fléchées ici .
methods: { loadData: function() { axios.get('/api/continents') .then((response) => { // handle success console.log(response.data); this.continents = response.data; }) .catch(function (error) { // handle error console.log(error); }) .then(function () { // always executed }); }, },
Dans les méthodes, vous devez utiliser la syntaxe des fonctions fléchées dans les fonctions de rappel, pour garder votre propriété de données accessible. Lorsque vous déclarez la fonction avec une syntaxe normale, vous ajoutez une "portée enfant" et this.components dans votre rappel fait référence à "this" dans votre fonction de rappel.
Changez votre méthode en:
loadData() { axios.get('/api/continents') .then((response) => { // handle success console.log(response.data); //now this refers to your vue instance and this can access you data property this.continents = response.data; }) .catch((error) => { // handle error console.log(error); }) .then(() => { // always executed }); },
Voici la démonstration de fonctionnement simple de axios.get
request
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue"></script> <div id="app"> <ol> <li v-if="users.length>0" v-for="user in users"> {{ user.name }} </li> </ol> </div>
var app = new Vue({ el: '#app', data: { users:[] }, mounted(){ this.loadData(); }, methods:{ loadData:function(){ axios.get('https://jsonplaceholder.typicode.com/users').then(res=>{ if(res.status==200){ this.users=res.data; } }).catch(err=>{ console.log(err) }); } } })