Vuex

作者: o简单生活o | 来源:发表于2024-06-20 14:04 被阅读0次
  1. 首先,让我们创建一个Vuex模块来管理用户状态。在store目录下创建一个user.js文件:
// store/user.js

export const state = () => ({
  isLoggedIn: false,
  userInfo: null
})

export const mutations = {
  setLoginStatus(state, status) {
    state.isLoggedIn = status
  },
  setUserInfo(state, info) {
    state.userInfo = info
  }
}

export const actions = {
  login({ commit }, userInfo) {
    // 模拟登录操作
    localStorage.setItem('userInfo', JSON.stringify(userInfo))
    commit('setLoginStatus', true)
    commit('setUserInfo', userInfo)
  },
  logout({ commit }) {
    localStorage.removeItem('userInfo')
    commit('setLoginStatus', false)
    commit('setUserInfo', null)
  },
  initializeAuth({ commit }) {
    const userInfo = localStorage.getItem('userInfo')
    if (userInfo) {
      const parsedUserInfo = JSON.parse(userInfo)
      commit('setLoginStatus', true)
      commit('setUserInfo', parsedUserInfo)
    }
  }
}

export const getters = {
  isLoggedIn: state => state.isLoggedIn,
  userInfo: state => state.userInfo
}
  1. store/index.js中注册这个模块:
// store/index.js

export const modules = {
  user: require('./user.js')
}
  1. 现在,让我们创建登录页面。在pages目录下创建一个login.vue文件:
<!-- pages/login.vue -->
<template>
  <div>
    <h1>登录</h1>
    <input v-model="username" placeholder="用户名" />
    <input v-model="password" type="password" placeholder="密码" />
    <button @click="handleLogin">登录</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    handleLogin() {
      // 这里应该有实际的登录逻辑,现在我们只是模拟
      const userInfo = { username: this.username }
      this.$store.dispatch('user/login', userInfo)
      this.$router.push('/')
    }
  }
}
</script>
  1. 修改components/appheader.vue文件,使其使用Vuex中的用户状态:
<!-- components/appheader.vue -->
<template>
  <header>
    <h1>我的应用</h1>
    <div v-if="isLoggedIn">
      欢迎,{{ userInfo.username }}
      <button @click="handleLogout">登出</button>
    </div>
    <div v-else>
      <nuxt-link to="/login">登录</nuxt-link>
    </div>
  </header>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters('user', ['isLoggedIn', 'userInfo'])
  },
  methods: {
    handleLogout() {
      this.$store.dispatch('user/logout')
      this.$router.push('/login')
    }
  }
}
</script>
  1. 修改layouts/default.vue文件:
<!-- layouts/default.vue -->
<template>
  <div>
    <app-header />
    <nuxt />
  </div>
</template>

<script>
import AppHeader from '~/components/appheader.vue'

export default {
  components: {
    AppHeader
  }
}
</script>
  1. 创建首页。在pages目录下创建一个index.vue文件:
<!-- pages/index.vue -->
<template>
  <div>
    <h2>首页内容</h2>
    <div v-if="isLoggedIn">
      <p>你好,{{ userInfo.username }}!这是你的个人首页。</p>
    </div>
    <div v-else>
      <p>请先登录以查看个人内容。</p>
    </div>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters('user', ['isLoggedIn', 'userInfo'])
  }
}
</script>
  1. 最后,我们需要在应用启动时初始化认证状态。在layouts/default.vue中添加:
<!-- layouts/default.vue -->
<script>
import AppHeader from '~/components/appheader.vue'

export default {
  components: {
    AppHeader
  },
  created() {
    this.$store.dispatch('user/initializeAuth')
  }
}
</script>

这个设置实现了以下功能:

  • 用户可以在登录页面登录。
  • 登录信息保存在localStorage中。
  • Vuex store管理登录状态。
  • AppHeader组件显示登录状态和用户信息。
  • 首页根据登录状态显示不同内容。
  • 应用启动时会检查localStorage并初始化登录状态。

请注意,这只是一个基本的实现。在实际应用中,您还需要添加更多的安全措施,如使用HTTPS、实现proper的后端认证、使用更安全的存储方式等。

如果您需要更多解释或有任何其他问题,请随时告诉我。

相关文章

  • VUEX基本介绍,包含实战示例及代码(基于Vue2.X)

    VUEX 1 VUEX基本介绍 1.1 官方API 1.2 什么是vuex 1.3 Vuex使用场景 1、Vuex...

  • 【文档笔记】-Vuex

    什么是vuex? vuex文档: https://vuex.vuejs.org/zh/[https://vuex....

  • vuex配置

    vuex配置 目录 vuex的五个核心 配置vuex vuex持久化 一、vuex五个核心概念 State 定义状...

  • Vuex

    安装Vuex cnpm install vuex --save-dev Vuex是什么? 这是[Vuex的官网](...

  • Vuex

    1.Vuex概述 2.Vuex基本使用 3.使用Vuex完成todo案例 1.Vuex概述 Vuex是实现组件全局...

  • vuex

    Vuex介绍: Vuex官网:http://vuex.vuejs.org/ Vuex是实现数据状态管理的技...

  • vuex+axios 的开发流程记录

    相关文档 vuex: https://vuex.vuejs.org/zh/ 是否有必要使用vuex vuex是vu...

  • 2019-06-07

    import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)...

  • 配置 vuex 和 vuex 本地持久化

    配置 vuex 和 vuex 本地持久化 目录 vuex是什么 vuex 的五个核心概念State 定义状态(变量...

  • vuex

    配置 vuex 和 vuex 本地持久化 目录 vuex是什么 vuex 的五个核心概念State 定义状态(变量...

网友评论

      本文标题:Vuex

      本文链接:https://www.haomeiwen.com/subject/ojnccjtx.html