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

yizhihongxing

下面我会详细介绍如何使用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日

相关文章

  • javascript数组定义的几种方法

    JavaScript是一种广泛使用的编程语言,数组是其中的一种数据类型。本攻略将介绍JavaScript数组的定义方法,包括字面量、构造函数和Array.from()方法。 字面量定义数组 字面量定义数组最常见的方法,可以使用以下语法: let arr = [element1, element2, …, elementN]; 其中element1到ele…

    other 2023年5月9日
    00
  • JS简单实现自定义右键菜单实例

    下面我会详细讲解如何简单实现自定义右键菜单的过程。 第一步:HTML结构准备 首先,需要定义一个HTML结构,包含菜单需要绑定的元素。 <!– 定义需要绑定右键菜单的区域 –> <div id="menu-wrap"> <ul id="context-menu" class=&quot…

    other 2023年6月27日
    00
  • 【Alpha】Scrum Meeting 3

    【Alpha】Scrum Meeting 3 简介 本文是关于Alpha项目的Scrum Meeting 3的记录。 会议时间 2021年8月15日,周日,晚上7点至8点。 参会成员 产品经理:张三 开发者:李四、王五、赵六、钱七 测试人员:小明、小红 议题 1. 任务完成情况 开发者汇报了上一次Sprint期间所完成的任务,并展示了相关的代码和实现情况。测…

    其他 2023年3月28日
    00
  • 如何配置Trezor钱包?Trezor硬件钱包使用指南

    如何配置Trezor钱包?Trezor硬件钱包使用指南 Trezor是一种硬件钱包,用于安全地存储和管理加密货币。下面是配置Trezor钱包的详细攻略。 步骤1:购买Trezor钱包 首先,您需要购买Trezor钱包。您可以在Trezor官方网站或授权的经销商处购买。确保您购买的是正品,并避免购买二手设备。 步骤2:连接Trezor钱包 使用USB线将Tre…

    other 2023年8月3日
    00
  • idea激活码(2019)

    Idea激活码(2019) 使用指南 很多人在使用IntelliJ IDEA时,由于没有购买正版的许可证,而需要使用激活码来继续使用该软件。但是,由于版权保护的原因,Idea官方并不赞成使用盗版或者未经授权的激活码。怎样找到可信的Idea激活码呢?本篇文章将给出一些引导,可以在不购买正版许可证的情况下帮助您继续使用Idea。 方式一:使用KMSpico KM…

    其他 2023年3月29日
    00
  • pycharm实现在子类中添加一个父类没有的属性

    在Python中,子类可以继承父类所有的属性和方法。但是有时候,我们可能需要在子类中添加一个父类没有的属性。下面是在Pycharm中实现在子类中添加一个父类没有的属性的完整攻略。 定义一个基类(父类),包含一些属性和方法。 class Animal: def __init__(self, name, age): self.name = name self.a…

    other 2023年6月26日
    00
  • 央视影音怎么查看版本号?央视影音查看版本号方法

    央视影音是中国中央电视台推出的一款视频播放软件,如果你想查看央视影音的版本号,可以按照以下步骤进行操作: 打开央视影音应用:在你的设备上找到央视影音应用的图标,点击打开应用。 进入设置页面:在央视影音的主界面上,通常会有一个设置按钮,一般是一个齿轮或者三个竖直排列的点。点击该按钮,进入设置页面。 查看版本号:在设置页面中,你可以找到一个关于或者版本信息的选项…

    other 2023年8月3日
    00
  • 贝塞尔曲线(b-spline)的原理与应用

    贝塞尔曲线(b-spline)的原理与应用 什么是贝塞尔曲线? 贝塞尔曲线是一种常见的参数曲线,常用于计算机图形学、CAD、计算机辅助设计等领域。它是一条由多个控制点决定的曲线,通过这些控制点的加权平均来构成一条平滑的路径。 贝塞尔曲线原理 贝塞尔曲线的原理是基于基函数上的加权平均计算实现的。每个基函数都是一个N次多项式,它可以决定曲线在某一特定位置上的形状…

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