I’m having difficulty in getting an axios call to my database being initiated after a user has logged into my SPA.
A route (gaplist/3) brings the user to a page (gaplist.vue) which
detects if the user is logged in or not.
If not logged in, a login form is presented.
Once the entered username/password combo is accepted, the user is “pushed” to the same page (gaplist/3)
Here, the logged in status is detected and - this is where it all falls down - a call to the database would return a bunch of records associated with the user and the parameter “3”.
Unfortunately, the last step doesn’t fully happen. The logged in status is detected, but the database call is not made. Only if I refresh the page is the call made and the results presented.
What concept am I not grasping here?
Thanks, Tom.
My code is as follows:
GapList.vue.js (route: gaplist/3)
<template>
<v-content>
<v-container fluid fill-height>
<v-layout justify-center>
<v-flex xs12 sm6>
<h1>Production and sale of produce</h1>
<v-card flat>
<div v-if=”isIn”>
<p v-for=”(card, id) in cards”>{card.product}</p>
<logout-button></logout-button>
</div>
<div v-else>
<gap-login :gapid=gapid></gap-login>
</div>
</v-card>
</v-flex>
</v-layout>
</v-container>
</v-content>
</template>
<script>
import GapLogin from ‘../components/gap/GapLogin’;
import LogoutButton from ‘../components/gap/LogoutButton’
export default {
name: ‘GapList’,
components: {
GapLogin,
LogoutButton
},
data () {
return {
gapid: this.$route.params.id,
cards: [],
lang: this.$i18n.locale,
bNoRecords: false,
}
},
created(){
this.loadCrops(this.gapid,this.lang)
},
computed: {
isIn : function(){ return this.$store.getters.isLoggedIn},
},
methods: {
loadCrops(gapid,lang){
var vm = this;
if (this.isIn){
axios.get(‘/gapcroplist/‘ + gapid)
.then(function (resp) {
vm.cards = resp.data;
})
.catch(function (resp) {
vm.bNoRecords = true;
});
}
},
}
}
</script>
GapLogin.vue
<template>
<div class=”formdiv”>
<v-layout justify-center>
<h3>Login</h3>
<v-card flat>
<v-alert
v-if=”loginError”
:value=”true”
type=”error”
transition=”scale-transition”
dismissible
\>
You didn’t enter correct information
</v-alert>
<v-form class=”login” @submit.prevent=”login”>
<v-text-field
v-model=”form.email”
type=”email”
label=”Email”
required
autofocus
\></v-text-field>
<v-text-field
v-model=”form.password”
type=”password”
label=”Password”
required
\></v-text-field>
<v-btn
type=”submit”
\>Login in </v-btn>
</v-form>
</v-card>
</v-layout>
</div>
</template>
<script>
export default {
name: “GapLogin”,
props: [‘gapid’],
data() {
return {
form: {
email: null,
password: null
},
loginError:false
}
},
methods: {
login: function () {
this.loginError = false
this.$store.dispatch(‘login’, this.form)
.then(() =>
{this.$router.push({path: ‘/gaplist/‘ + this.gapid})
})
.catch(err => {
this.loginError = true
}
)
},
}
}
</script>
Solution :
Updated answer:
created hook will not be called again. Using updated will result in an error as well, as you would trigger another update and have an endless loop.
Instead of pushing to same route I would suggest that you emit a completed event:
In the login method in then instead of $router.push:
this.$emit(‘completed’)
And register the event on the gap-login-component:
<gap-login @completed=”completed” :gapid=gapid></gap-login>
And add that method to the GapList.vue-file:
completed () {
this.loadCrops(this.gapid, this.lang)
}
You are using axios in a global context, but it doesn’t exists, it seems.
Try using this.$axios:
this.$axios.get(‘/gapcroplist/‘ + gapid)