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日

相关文章

  • vue递归实现自定义tree组件

    我会尽量详细地讲解“vue递归实现自定义tree组件”的完整攻略,并提供两条示例说明。 什么是递归组件 在VueJS中,组件可以递归其自身,允许我们在使用组件的时候,动态地将其渲染到其自身的子组件中。这种组件被称为递归组件。 递归组件可以非常方便地实现树形结构的展示。 实现递归tree组件 在实现递归tree组件之前,需要先确定tree的数据结构,我们可以使…

    other 2023年6月27日
    00
  • C++超详细讲解模板的使用

    C++超详细讲解模板的使用攻略 什么是模板 模板是C++中一种基于泛型编程的重要特性,可以让程序员编写可重用的代码模块来处理多种数据类型和算法。模板是由两个部分组成的: 类型参数:表示泛型中的数据类型,通常用T来表示; 模板参数:表示模板中的常量参数,通常用N来表示。 例如: template <typename T, int N> class …

    other 2023年6月27日
    00
  • C语言 数据结构双向链表简单实例

    C语言 数据结构双向链表简单实例 本文将详细讲解如何使用C语言实现一个双向链表的数据结构,并介绍如何在此链表上进行一些基本操作。整个过程中将包含两条示例说明。 1. 双向链表定义 一个双向链表通常由多个节点组成,每个节点有三个部分组成: struct node { struct node *prev; struct node *next; int data;…

    other 2023年6月27日
    00
  • 苹果向开发者发布OS X 10.11.2 Beta4 版本号15C47a

    苹果向开发者发布OS X 10.11.2 Beta4 版本号15C47a 什么是OS X 10.11.2 Beta 4 OS X 10.11.2 Beta 4是苹果公司的操作系统OS X的测试版本之一,其目的在于让开发者能够更好地了解该操作系统的新特性、缺陷、问题和改进之处,以更好地为其编写和发布软件和应用程序。Beta版的OS X 10.11.2是一个预告…

    other 2023年6月26日
    00
  • windows下gitbash安装教程(小白教程)

    下面是详细的“Windows下GitBash安装教程(小白教程)”。 步骤一:下载Git安装包 首先,从Git官网下载Git安装包。请根据您当前使用的操作系统版本选择对应的安装包,使用以下链接下载: Git for Windows 官方下载页面 示例:如果您的电脑是 Windows 10 操作系统,则应选择“64位Git for Windows 2.32.0…

    other 2023年6月27日
    00
  • 深度分析正则(pcre)最大回溯/递归限制

    深度分析正则(pcre)最大回溯/递归限制 正则表达式是一种描述字符模式的工具,由于其强大的表达能力和广泛的应用场景,成为了数据分析、文本挖掘等领域的重要工具。正则表达式引擎可以进行的匹配步骤是有限的,当模式中包含递归或回溯时,引擎可能会一直重复步骤,导致匹配效率降低,甚至出现崩溃等问题。 为了避免这种状况,正则表达式引擎实现了最大回溯/递归限制,即“PCR…

    other 2023年6月27日
    00
  • Win11刷新怎么设置为右键菜单的首选?

    要将Win11刷新设置为右键菜单的首选,需要进行以下步骤: 打开注册表编辑器: 按下Win + R键组合,输入regedit并回车,以启动注册表编辑器。 导航到右键菜单项所在的注册表分支: 在注册表编辑器中,使用左侧的目录导航器导航到以下路径: HKEY_CLASSES_ROOT\Directory\Background\shell 此处的“Director…

    other 2023年6月27日
    00
  • linux中ctrl+s的作用

    在Linux中,Ctrl+S是一个特殊的组合键,它的作用是暂停终端的输出。如果您不小心按下了Ctrl+S,您可能会认为终端已经崩溃了,因为您无法输入任何命令。以下是如何解决这个问题的完整攻略,包含两个示例说明。 步骤一:恢复终端输出 如果您不小心按下了Ctrl+S,您可以按下Ctrl+Q来恢复终端的输出。这是因为Ctrl+S暂停了终端的输出,而Ctrl+Q恢…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部