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 ;)