No More Posting New Topics!

If you have a question or an issue, please start a thread in our Github Discussions Forum.
This forum is closed for new threads/ topics.

Navigation

    Quasar Framework

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search

    Use Plugin inside Vuex module action

    Help
    10
    13
    11426
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      danielo515 last edited by

      None of the above ways of doing it seems like a good alternative.
      If you are using vuex seems that you shouldn’t use plugins at all, at least not for things that should be used from actions. Having logic both on components and store does not seems like a good idea.

      1 Reply Last reply Reply Quote 0
      • M
        michael999 last edited by

        You can use this simple plugin https://github.com/imcvampire/vue-axios. (This wrapper bind axios to Vue or this if you’re using single file component)

        Then you can use axios like this :

        import Vue from 'vue'
        import { Notify, Loading } from 'quasar'
        /*
        export const someAction = (state) => {
        }
        */
        export const doLogin = (state,creds) => {
          state.commit('LOGIN')
          let email=creds.email
          let password=creds.password
          console.log(this.$axios)
          return Vue.axios
            .post('/auth/signin', {
              email,
              password
            })
            .then(r => {
              //console.log(r)
              //localStorage.setItem("token", "JWT");
              commit('LOGIN_SUCCESS')
              return r
            })
            .catch(e => {
              //console.log(e.response)
              Notify.create("Error: " + e.response.status)
              //localStorage.removeItem("token")
              commit('LOGOUT')
              return e
            })
        }
        
        export const doLogout = (state) => {
          localStorage.removeItem("token")
          commit(LOGOUT)
        }
        
        1 Reply Last reply Reply Quote 0
        • marcelo
          marcelo last edited by

          pass this to dispatch works, but looks terrible… any elegant solution?

          1 Reply Last reply Reply Quote 0
          • benoitranque
            benoitranque last edited by

            You could also use this._vm.$axios …

            S 1 Reply Last reply Reply Quote 4
            • S
              steve last edited by steve

              Thanks @benoitranque for this tid bit: http://forum.quasar-framework.org/topic/1898/services-and-axios-plugin

              In order to use axios without passing in ‘this’ in the vuex store actions, you can do this:

              import Vue from 'vue'
              
              export const AUTH_REQUEST = ({ commit, dispatch }, creds) => {
                return new Promise((resolve, reject) => {
                  Vue.prototype.$axios({ .... })
               }
              })
              marcelo J 2 Replies Last reply Reply Quote 2
              • marcelo
                marcelo @steve last edited by

                @steve said in Use Plugin inside Vuex module action:

                Vue.prototype

                An elegant solution, thanks!

                1 Reply Last reply Reply Quote 0
                • J
                  jtktam @steve last edited by

                  @steve said in Use Plugin inside Vuex module action:

                  Thanks @benoitranque for this tid bit: http://forum.quasar-framework.org/topic/1898/services-and-axios-plugin

                  In order to use axios without passing in ‘this’ in the vuex store actions, you can do this:

                  import Vue from 'vue'
                  
                  export const AUTH_REQUEST = ({ commit, dispatch }, creds) => {
                    return new Promise((resolve, reject) => {
                      Vue.prototype.$axios({ .... })
                   }
                  })
                  

                  I was scratching my head when I was writing some common library code to access this.$axios from my static plain javascript libs

                  this tip saved me having to pass in this or this.$axios … thanks!

                  1 Reply Last reply Reply Quote 0
                  • L
                    Lou Rectoret last edited by Lou Rectoret

                    Here’s my solution! Set axios.js as a plugin as usual but expose the instance, this way:

                    import axios from 'axios'
                    
                    const baseURL = 'https://dev.api.insylo.io/v2'
                    const BEARER = localStorageAuth === null ? '' : 'bearer' + JSON.parse(localStorageAuth).token
                    
                    export const axiosHTTP = axios.create({
                        Authorization: BEARER,
                        baseURL
                    })
                    
                    export default ({ Vue }) => {
                        Vue.prototype.$axios = axiosHTTP
                    }
                    

                    Then from your Vuex module :

                    import { axiosHTTP } from '../plugins/axios'
                    
                    export function Login (context, payload) {
                        return axiosHTTP({
                            method: 'post',
                            url: '/login/',
                            data: payload
                        })
                    }
                    
                    qyloxe 1 Reply Last reply Reply Quote 0
                    • S
                      Serhioromano @benoitranque last edited by

                      @benoitranque said in Use Plugin inside Vuex module action:

                      You could also use this._vm.$axios …

                      this is a perfect solution because it is not only $axios. Sometimes you need to access notifications, loading bar, … This approach gives it all. Deep thanks!

                      1 Reply Last reply Reply Quote 0
                      • qyloxe
                        qyloxe @Lou Rectoret last edited by

                        @Lou-Rectoret said in Use Plugin inside Vuex module action:

                        instead of this:

                        const BEARER = localStorageAuth === null ? ‘’ : ‘bearer’ + JSON.parse(localStorageAuth).token

                        it should be that:

                        const BEARER = localStorageAuth === null ? '' : 'bearer ' + JSON.parse(localStorageAuth).token
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post