I have a todosStore pinia store that performs actions (CRUD operations) against the backend. In this todosStore, I need to use another pinia store bannerStore for updating the bootstrap alert component's message and class in the template.
If I use the bannerStore in the todosStore.js like below, I get the following error Uncaught Error: []: "getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"?
import { useBanner } from "./bannerStore";
const bannerStore = useBanner()
export const useTodos = defineStore("todos", {
state: () => ({
...
}),
actions: {
},
})
If I use the store inside each action like below, then it works properly.
export const useTodos = defineStore("todos", {
state: () => ({
todos: [],
}),
actions: {
async fetchAllTodos() {
try {
const res = await todoService.getAllTodos()
if (res.status === 200) {
this.todos = res.data
}
} catch (error) {
const bannerStore = useBanner()
bannerStore.setBanner(`Failed to retrieve all todos: ${error}`, 'error')
}
},
async addTodo(todo) {
const bannerStore = useBanner()
try {
const res = await todoService.addTodo(todo)
if (res.status === 201) {
this.todos.push(todo)
bannerStore.setBanner("Todo added successfully!", 'success')
}
} catch (error) {
bannerStore.setBanner(`Failed To add todo item ${todo}: ${error}`, 'error')
}
},
async deleteTodoById(todoId) {
const bannerStore = useBanner()
try {
const res = await todoService.deleteTodo(todoId)
if (res.status === 200) {
this.todos = this.todos.filter(t => t.id !== todoId)
bannerStore.setBanner(`Successfully deleted todo with Id ${todoId}`, 'success')
}
} catch (error) {
bannerStore.setBanner(`Failed operation: deleteTodoById() for id ${todoId}: ${error}`, 'error')
}
}
},
I would like to know if what I am currently doing (initializing bannerStore in each action) is the optimal way of doing it, or if there is a better way?
The 2nd method is correct. Even if you call
useStorea million times, it will only do one thing: return the initialized store. You may not useuseStoreat the startup thread because ofpinianot yet attached to the component.If you're worried about it use the nice composition API syntax