简述
由于 pinia 导入到vue中的值没有响应性
| import useUserStore from './stores/user'; |
| const userStore = useUserStore(); |
| userStore.isvaild; |
那么我们在vue中动态修改某值的想法则需要使用 vue 为我们提供的 watch
方法。Vue3文档
| watch([userStore.isvaild, userStore.state.email], ([vaild, email], [prevIsvaild, prevEmail]) => { |
| |
| }) |
具体实现
创建和配置Pinia Store
| |
| |
| import { defineStore } from 'pinia'; |
| import { ref, type Ref } from 'vue'; |
| |
| interface UserState { |
| username: string; |
| email: string; |
| } |
| |
| const useUserStore = defineStore('user', () => { |
| const state: UserState = { |
| username: '', |
| email: '' |
| }; |
| const isvaild: Ref<boolean> = ref(false); |
| |
| const setUser = (response: UserState) => { |
| state.username = response.username; |
| state.email = response.email; |
| isvaild.value = true; |
| }; |
| |
| const getUsername = () => { |
| return state.username; |
| }; |
| |
| const getEmail = () => { |
| return state.email; |
| }; |
| |
| const logout = () => { |
| isvaild.value = false; |
| state.username = ''; |
| state.email = ''; |
| }; |
| |
| return { |
| isvaild, |
| state, |
| setUser, |
| getUsername, |
| getEmail, |
| logout |
| }; |
| }); |
| |
| export default useUserStore; |
在 Vue 组件中监听 Pinia 数据变化
- 这是模板内容,脚本内容在第2点
| |
| |
| <template> |
| <div id="app"> |
| |
| <header> |
| <nav class="navbar navbar-expand-lg navbar-light bg-light"> |
| |
| <div v-if="isLoggedIn"> |
| <HeaderIcon :email="userEmail" /> |
| <button @click="logout">Logout</button> |
| </div> |
| |
| <div v-else> |
| <router-link to="/login">Login</router-link> |
| <router-link to="/forgot-password">Forgot Password</router-link> |
| </div> |
| </nav> |
| </header> |
| |
| |
| <main> |
| |
| <router-view></router-view> |
| </main> |
| </div> |
| </template> |
| |
| <script setup lang="ts"> |
| |
| </script> |
- setup脚本内容
| |
| |
| import { ref, onMounted, watch } from 'vue'; |
| import axios from 'axios'; |
| import { useRouter } from 'vue-router'; |
| import useUserStore from './stores/user'; |
| import HeaderIcon from '@/components/HeaderIcon.vue'; |
| |
| const userStore = useUserStore(); |
| const router = useRouter(); |
| |
| const displayName = ref(""); |
| const userEmail = ref("mcayear@163.com"); |
| const isLoggedIn = ref(userStore.isvaild); |
| |
| onMounted(() => { |
| axios.post(import.meta.env.VITE_SCISERVE + '/api/userinfo', {}, { |
| headers: { 'Content-Type': 'application/json' }, |
| }) |
| .then((response) => { |
| if (response.status >= 400 && response.status < 500) { |
| throw new Error('Client error: ' + response.status); |
| } |
| |
| if (response.data.success) { |
| displayName.value = response.data.data.displayName; |
| userEmail.value = response.data.data.email; |
| userStore.setUser(response.data.data); |
| isLoggedIn.value = true; |
| router.push('/dashboard'); |
| } else { |
| |
| console.log(response.data.message); |
| } |
| }) |
| .catch((error) => { |
| |
| console.log(error.toString()); |
| }); |
| }); |
| watch( |
| () => [userStore.isvaild, userStore.state.email], |
| ([newVaild, newEmail], [oldVaild, oldEmail]) => { |
| isLoggedIn.value = newVaild as boolean; |
| userEmail.value = newEmail as string; |
| } |
| ); |
| const logout = () => { |
| isLoggedIn.value = false; |
| userStore.logout(); |
| |
| axios |
| .post(import.meta.env.VITE_SCISERVE + '/api/logout', {}, { |
| headers: { 'Content-Type': 'application/json' }, |
| }) |
| .then(() => { |
| router.push('/login'); |
| }) |
| .catch((error) => { |
| |
| console.log(error.toString()); |
| }); |
| }; |
- HeaderIcon.vue 内容
| |
| |
| <template> |
| <div> |
| <img :src="gravatarUrl" alt="Gravatar" /> |
| </div> |
| </template> |
| |
| <script setup lang="ts"> |
| import { computed } from 'vue'; |
| import { Md5 } from 'ts-md5'; |
| |
| const props = defineProps({ |
| email: String, |
| }); |
| |
| |
| const gravatarUrl = computed(() => { |
| const hash = Md5.hashStr((props.email|| "").trim().toLowerCase()); |
| return `https://www.gravatar.com/avatar/${hash}?s=100`; |
| }); |
| </script> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?