Bonjour,
Voila je rencontre un petit problème avec mon code.
Voila, je suis entrain de suivre le tutoriel Laravel - Partie 2 : VueJS. vers les 30min de la vidéo, Grafikart parle de mapGetters.
Il me semble suivre son tutoriel à la lettre (mais du coup je ne suis plus très sur).
Via la méthode ...mapGetters je veux obtenir la liste des utilisateurs à travers l'API.
{
"2": {
"name" : "John Doe 1",
"id":2 },
"3": {
"name" : "John Doe 2",
"id":3 },
"4": {
"name" : "John Doe 3",
"id":4 },
...
}
Sauf que j'obtiens une liste vide
{}
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const get = async function (url) {
let response = await fetch(url, {
credentials: 'same-origin',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
}
})
if (response.ok) {
return response.json()
} else {
let error = await response.json()
throw new Error(error.message)
}
}
/**
* {
* 1: {
* id: 1,
* name: 'John Doe 1',
* unread: 0,
* count: 100,
messages: [{
id,
from_id,
to_id...
}]
* }
* }
*/
export default new Vuex.Store({
strict: true,
state: {
conversations: {}
},
getters: {
conversations: function(state) {
return state.conversations
}
},
mutations: {
addMessages: function (state, {conversations}) {
let obj = {}
conversations.forEach(function (conversation) {
obj[conversation.id] = conversation
})
state.conversations = obj
}
},
actions: {
loadConversations: async function (context) {
let response = await get('/api/conversations')
context.commit('addMessages', {conversations: response.conversations})
}
}
})
MessagerieComponent.vue
<template>
<div class="row">
<div class="col-md-3">
<div class="list-group">
<a class="list-group-item d-flex justify-content-between align-items-center">
John Doe {{ user }}
<span class="badge badge-pill badge-primary">0</span>
</a>
{{ conversations }}
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
props: {
user: Number
},
computed: {
...mapGetters([
'conversations'
])
},
mounted() {
this.$store.dispatch('loadConversations')
},
}
</script>
Auriez-vous une idée ?
Merci par avance
Yop. Est-ce que tu as des données qui te sont retournées au moins par ta requête?
Que vaut response
(in loadConversations
)?
Hello, il manque le await devant ton responce.json()
...
if (response.ok) {
return await response.json()
}
...
Par contre la méthode get n'apporte pas grand chose tu peux appeler fetch directement dans un try catch pour catcher l'erreur.
@PhiSyx, Voici un console.log(response dans ma finction loadConversation :
{…}
conversations: (9) […]
0: Object { name: Getter & Setter, id: Getter & Setter, … }
1: Object { name: Getter & Setter, id: Getter & Setter, … }
2: Object { name: Getter & Setter, id: Getter & Setter, … }
3: Object { name: Getter & Setter, id: Getter & Setter, … }
4: Object { name: Getter & Setter, id: Getter & Setter, … }
5: Object { name: Getter & Setter, id: Getter & Setter, … }
6: Object { name: Getter & Setter, id: Getter & Setter, … }
7: Object { name: Getter & Setter, id: Getter & Setter, … }
8: Object { name: Getter & Setter, id: Getter & Setter, … }
length: 9
__proto__: Array []
__proto__: Object { … }
Il me retourne bien le nombre d'élément que je souhaite retourner dans mon MessagerieConversation.vue
@Alban Lautie, c'est surement vraie. Je suis le tuto de Grafikart pour apprendre donc certainement qu'il doit y avoir plusieurs solutions.
merci pour le await absent ;)