Vue 3 - inject() can only be used inside setup or functional components
Asked Answered
H

1

21

I can't understand why I'm getting this error. I am trying to use the Vuex store in a composition function but it keeps throwing me this error about inject (I'm not even using inject). My app makes an await api call to the backend and if there is an error calls my composition function.

[Vue warn]: inject() can only be used inside setup() or functional components.
inject    @ runtime-dom.esm-bundler-9db29fbd.js:6611
useStore  @ vuex.esm-bundler.js:13
useErrorHandling @  useErrorHandling.js:5
checkUserExists  @  auth.js:53

Here is my composition function

import { useStore } from 'vuex'

function useErrorHandling()
{
    const store = useStore()  // <-- this line

    function showError(errorMessage) {
        console.log(errorMessage)
    }

    return { showError }
}

export default useErrorHandling

If I remove this line then it doesn't throw that error

// const store = useStore()  // <-- this line

UPDATE: this is how the function is called.

/**
     * Check if a user exists in database
     */
    static async checkUserExists(data)
    {
        const { env } = useEnv()
        const { jsonHeaders } = useHTTP()
        const { showError } = useErrorHandling()
        
        try {
            let response = await fetch(`${env('VITE_SERVER_URL')}/auth/check-user-exists`, {
                method: 'POST',
                body: JSON.stringify(data),
                headers: jsonHeaders,
            })

            if (!response.ok) {
                let errorMessage = {
                    statusText: response.statusText,
                    statusCode: response.status,
                    body: '',
                    url: response.url,
                    clientAPI: 'api/auth.js @ checkUserExists',
                }
                
                const text = await response.text()
                errorMessage.body = text

                showError(errorMessage) // <-- here
                return
            }

            response =  await response.json()
            return response.user_exists
        } catch (error) {
            alert('Error occured!')
            console.log(error)
        }
    }
Hyp answered 17/12, 2020 at 12:27 Comment(4)
Can you show the code where you are using this file?Thy
It is not a setup(){} You cannot use const store = useStore()' out of the setup().Thy
@Thy then how can I use store in a composition function?Hyp
You can use it the same way as you have done it in your file.Thy
A
25

The error is telling you that useStore is only for use inside of components, since the module isn't a component. From the docs:

To access the store within the setup hook, you can call the useStore function. This is the equivalent of retrieving this.$store within a component using the Option API.

To use the store in a module, you can import { store } from the module where it was created:

store.js

export const store = createStore({
...
})

Other module

import { store } from './store'
Arabel answered 17/12, 2020 at 13:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.