Vue3封装登录功能的两种实现

下面我会详细介绍如何使用Vue3封装登录功能以及两种实现方式。

1. 创建登录组件

首先,我们需要创建一个登录组件,在该组件中编写登录所需的页面布局和逻辑代码。可以使用Vue的template和script标签来创建组件,并在组件中通过v-model指令来绑定输入框中的值。

<template>
  <div>
    <h2>登录</h2>
    <form>
      <label for="username">用户名:</label>
      <input type="text" id="username" v-model="username" /><br />

      <label for="password">密码:</label>
      <input type="password" id="password" v-model="password" /><br />

      <button type="submit" @click.prevent="login">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  name: 'Login',
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async login() {
      // 发送登录请求
      const res = await API.login(this.username, this.password)

      // 处理登录响应
      if (res.code === 200) {
        // 登录成功,跳转到首页
        this.$router.push('/')
      } else {
        // 登录失败,显示错误提示
        this.$message.error(res.msg)
      }
    }
  }
}
</script>

2. 实现方式一:使用Vuex存储登录状态

接下来,我们考虑如何将用户的登录状态存储在Vuex中,以便其他组件也可以访问到该登录状态。具体实现方式如下:

  1. 在store中创建一个名为auth.js的模块,用于存储登录相关的数据和方法(如token、用户名、登录和退出方法等)。其中,需要在state中定义一个名为isLogin的状态来表示用户的登录状态。
// store/auth.js
import API from '@/api'

export default {
  namespaced: true,
  state: {
    token: '',
    username: '',
    isLogin: false
  },
  mutations: {
    setToken(state, payload) {
      state.token = payload.token
      state.username = payload.username
      state.isLogin = true
    },
    clearToken(state) {
      state.token = ''
      state.username = ''
      state.isLogin = false
    }
  },
  actions: {
    async login({ commit }, { username, password }) {
      const res = await API.login(username, password)
      if (res.code === 200) {
        commit('setToken', {
          token: res.token,
          username: username
        })
      } else {
        throw new Error(res.msg)
      }
    },
    logout({ commit }) {
      commit('clearToken')
    }
  }
}
  1. 在登录组件中调用登录方法,并将登录成功后返回的token和用户名传给mutations中的setToken方法设置登录状态。
// Login.vue
<template>
  <div v-if="$store.state.auth.isLogin">
    <p>欢迎,{{ $store.state.auth.username }}!</p>
    <button @click="$store.dispatch('auth/logout')">退出登录</button>
  </div>
  <div v-else>
    <h2>登录</h2>
    <form>
      <label for="username">用户名:</label>
      <input type="text" id="username" v-model="username" /><br />

      <label for="password">密码:</label>
      <input type="password" id="password" v-model="password" /><br />

      <button type="submit" @click.prevent="login">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  name: 'Login',
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async login() {
      try {
        await this.$store.dispatch('auth/login', {
          username: this.username,
          password: this.password
        })

        this.$router.push('/')
      } catch (e) {
        this.$message.error(e.message)
      }
    }
  }
}
</script>
  1. 在其他组件中通过$store.state.auth.isLogin来判断当前用户是否登录,在需要获取当前用户的信息时,可以使用$store.state.auth.username。

3. 实现方式二:使用localStorage存储登录状态

如果不想使用Vuex,我们也可以将用户的登录状态通过localStorage来存储,具体实现方式如下:

  1. 在登录组件中调用登录方法,并将登录成功后返回的token和用户名存储到localStorage中。
// Login.vue
<template>
  <div>
    <h2>登录</h2>
    <form>
      <label for="username">用户名:</label>
      <input type="text" id="username" v-model="username" /><br />

      <label for="password">密码:</label>
      <input type="password" id="password" v-model="password" /><br />

      <button type="submit" @click.prevent="login">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  name: 'Login',
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async login() {
      // 发送登录请求
      const res = await API.login(this.username, this.password)

      // 处理登录响应
      if (res.code === 200) {
        // 登录成功,保存token和用户名
        localStorage.setItem('token', res.token)
        localStorage.setItem('username', this.username)

        // 跳转到首页
        this.$router.push('/')
      } else {
        // 登录失败,显示错误提示
        this.$message.error(res.msg)
      }
    }
  }
}
</script>
  1. 在需要获取登录状态的组件中,通过读取localStorage中的token和username来判断当前用户是否登录和获取当前用户的信息。
// Profile.vue
<template>
  <div v-if="isLogin">
    <p>欢迎,{{ username }}!</p>
    <button @click="logout">退出登录</button>
  </div>
  <div v-else>
    <p>请先登录!</p>
    <router-link to="/login">登录</router-link>
  </div>
</template>

<script>
export default {
  name: 'Profile',
  data() {
    return {
      isLogin: false,
      username: ''
    }
  },
  created() {
    const token = localStorage.getItem('token')
    const username = localStorage.getItem('username')

    if (token && username) {
      this.isLogin = true
      this.username = username
    }
  },
  methods: {
    logout() {
      localStorage.removeItem('token')
      localStorage.removeItem('username')
      this.isLogin = false
      this.username = ''
      this.$router.push('/login')
    }
  }
}
</script>

以上就是使用Vue3封装登录功能的两种实现方式。其中,第一种实现方式使用Vuex保存登录状态,适合在需要全局管理状态的复杂应用中使用;而第二种实现方式使用localStorage保存登录状态,适合在简单的应用中使用。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3封装登录功能的两种实现 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • MySQL表和列的注释总结

    MySQL表和列的注释总结 在MySQL中,我们可以为表和列添加注释,以便于后续的维护和理解。本文将会详细讲解如何为MySQL表和列添加注释。 给表添加注释 第一种方法 使用CREATE TABLE时,可以在后面加上COMMENT参数,来为表添加注释。 示例: CREATE TABLE `user_info` ( `id` int(11) NOT NULL …

    other 2023年6月25日
    00
  • ascii与hex对照转换表

    当然,我可以为您提供有关“ASCII与Hex对照转换表”的完整攻略,以下是详细说明: ASCII与Hex对照转换表 ASCII码是一用于表示字符的标准编码系统,它将每个字符映射到一个唯一的数字值。Hex(十六进制)是一种数值系统,它使用16个数字(0-9和A-F)数字和字符。在计算机科学中,Hex常用于表示二进制数据,因为它比二进制更易于阅读和理解。以下是A…

    other 2023年5月7日
    00
  • 实例详解Linxu中df命令

    实例详解Linux中df命令 什么是df命令 df(disk free)命令是Linux系统中常用的一个磁盘空间查看工具,用于列出本地磁盘上已经挂载的文件系统的磁盘空间使用情况。它可以查看每个分区的总容量、已用容量、可用容量、使用率等信息。 命令语法 df命令的使用语法为: df [选项] [文件 | 目录] 常用选项包括: -h:以人类可读的方式显示磁盘使…

    other 2023年6月27日
    00
  • bootstrap日历插件datetimepicker使用方法

    Bootstrap日历插件datetimepicker使用方法攻略 介绍 Bootstrap日历插件datetimepicker是一个强大的日期和时间选择器,它基于Bootstrap框架,提供了丰富的功能和灵活的配置选项。本攻略将详细介绍datetimepicker的使用方法,并提供两个示例说明。 步骤 步骤1:引入必要的文件 首先,你需要在你的HTML文件…

    other 2023年9月6日
    00
  • asp.net简述MVC开发模式

    ASP.NET是一种基于Microsoft .NET框架的Web应用程序开发框架。其中,MVC(Model-View-Controller)是一种常用的开发模式,它将应用程序分为三个部分:模型、视图和控制器。本文将介绍ASP.NET MVC开发模式的基本概念、使用方法和示例。 1. MVC开发模式的基本概念 MVC开发模式是一种将应用程序分为三个部分的开发模…

    other 2023年5月5日
    00
  • Android 设置颜色的方法总结

    Android 设置颜色的方法总结 在Android开发中,我们经常需要设置控件的颜色。下面是一些常用的设置颜色的方法总结。 1. 使用颜色资源文件 Android提供了一种方便的方式来管理颜色,即使用颜色资源文件。首先,在res/values目录下创建一个名为colors.xml的文件。然后,在该文件中定义颜色的名称和对应的值,如下所示: <reso…

    other 2023年8月24日
    00
  • Android自定义对话框Dialog的简单实现

    下面我就给大家讲解一下“Android自定义对话框Dialog的简单实现”的完整攻略。 一、概述 在Android开发中,我们经常需要使用对话框来与用户进行交互。Android提供了系统自带的几种对话框,如AlertDialog、ProgressDialog等。但有时我们需要自定义对话框,以满足更加个性化的需求。本文将介绍Android自定义对话框Dialo…

    other 2023年6月25日
    00
  • dpkg卸载deb包方法精讲

    Sure! 下面为你提供详细的 dpkg卸载deb包方法攻略,包括两个示例: 一、dpkg命令格式 dpkg是Debian Package的缩写,是Debian中管理软件包的核心工具之一。dpkg命令可以用来安装、配置和删除Debian格式的软件包,它是Debian系统下的包管理工具。 dpkg命令的格式如下所示: dpkg [options] action…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部