vue3 pinia问题?
pinia
import {defineStore} from 'pinia'
export const useMy = defineStore('my', () => {
return {user_id:'',username:''}
})
router
import { useMy } from '@/stores/my'
router.beforeEach(async (to, from, next) => {
const my = useMy();
my.user_id = 1;
my.username = 'user';
next();
})
HomeView.vue
<template>
<H1>HomeView.vue</H1>
</template>
<script>
import {useMy} from "@/stores/my";
export default {
name: "HomeView",
setup() {
const my = useMy();
console.log(my.username)
return {my}
}
}
我在router.beforeEach
中设置了,为什么组件中HomeView.vue
里面的console.log(my.username)
为空
回复
1个回答
test
2024-07-07
问题出在你在组件中使用 useMy() ,它创建了一个新的 store 实例而不是你在 router.beforeEach 中设置的那个实例。
为了在不同的组件中共享相同的 store 实例,你需要在组件中使用 useStore() 方法,并将它传递给组件:
vueCopy code
<template>
<h1>HomeView.vue</h1>
</template>
<script>
import { useStore } from 'pinia'
export default {
name: 'HomeView',
setup() {
const store = useStore()
console.log(store.my.username)
return { store }
}
}
</script>
在 useStore() 方法中不需要传递参数,因为它默认使用主 store。
另外,在你的路由守卫中也有一个问题,你需要在 useMy() 方法中传递一个唯一的 ID,以确保它返回正确的 store 实例:
router.beforeEach(async (to, from, next) => {
const my = useMy('my-store') // 传递一个唯一的 ID
my.user_id = 1
my.username = 'user'
next()
})
这将确保你在路由守卫中设置的是同一个 store 实例,可以在组件中共享和访问该实例。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容