当前位置:首页 > VUE

vue路由实现登录注册

2026-01-21 02:05:58VUE

Vue路由实现登录注册功能

路由配置

在Vue项目中,通过vue-router配置登录和注册的路由。通常将这些路由设置为公开可访问,不要求认证。

// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/views/Login.vue'
import Register from '@/views/Register.vue'
import Dashboard from '@/views/Dashboard.vue'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: Login
    },
    {
      path: '/register',
      name: 'Register',
      component: Register
    },
    {
      path: '/dashboard',
      name: 'Dashboard',
      component: Dashboard,
      meta: { requiresAuth: true }
    }
  ]
})

导航守卫

使用路由守卫保护需要认证的页面,未登录用户尝试访问受保护路由时重定向到登录页。

// 添加全局前置守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')

  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next({ name: 'Login' })
    } else {
      next()
    }
  } else {
    next()
  }
})

登录组件实现

创建登录表单组件,处理用户提交的凭证。

vue路由实现登录注册

<!-- views/Login.vue -->
<template>
  <div>
    <form @submit.prevent="handleLogin">
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Login</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await authService.login(this.email, this.password)
        localStorage.setItem('token', response.data.token)
        this.$router.push({ name: 'Dashboard' })
      } catch (error) {
        console.error('Login failed:', error)
      }
    }
  }
}
</script>

注册组件实现

创建用户注册表单组件。

<!-- views/Register.vue -->
<template>
  <div>
    <form @submit.prevent="handleRegister">
      <input v-model="name" type="text" placeholder="Name" required>
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Register</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: '',
      email: '',
      password: ''
    }
  },
  methods: {
    async handleRegister() {
      try {
        await authService.register(this.name, this.email, this.password)
        this.$router.push({ name: 'Login' })
      } catch (error) {
        console.error('Registration failed:', error)
      }
    }
  }
}
</script>

认证服务

创建独立的认证服务模块处理API调用。

vue路由实现登录注册

// services/auth.js
import axios from 'axios'

const API_URL = 'https://your-api-endpoint.com'

export default {
  login(email, password) {
    return axios.post(`${API_URL}/login`, { email, password })
  },
  register(name, email, password) {
    return axios.post(`${API_URL}/register`, { name, email, password })
  }
}

用户状态管理

对于更复杂的应用,建议使用Vuex管理用户认证状态。

// store/modules/auth.js
const state = {
  user: null,
  token: localStorage.getItem('token') || null
}

const mutations = {
  SET_USER(state, user) {
    state.user = user
  },
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  LOGOUT(state) {
    state.user = null
    state.token = null
    localStorage.removeItem('token')
  }
}

const actions = {
  login({ commit }, credentials) {
    return authService.login(credentials.email, credentials.password)
      .then(response => {
        commit('SET_TOKEN', response.data.token)
        return response
      })
  },
  register({ commit }, userData) {
    return authService.register(userData.name, userData.email, userData.password)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

响应式导航

根据认证状态动态显示/隐藏导航菜单项。

<!-- components/Navbar.vue -->
<template>
  <nav>
    <router-link to="/login" v-if="!isAuthenticated">Login</router-link>
    <router-link to="/register" v-if="!isAuthenticated">Register</router-link>
    <button @click="logout" v-if="isAuthenticated">Logout</button>
  </nav>
</template>

<script>
import { mapState, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState('auth', ['token']),
    isAuthenticated() {
      return !!this.token
    }
  },
  methods: {
    ...mapActions('auth', ['logout'])
  }
}
</script>

标签: 路由vue
分享给朋友:

相关文章

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-for…

vue实现通知

vue实现通知

Vue 实现通知功能的方法 使用 Vue 实现通知功能可以通过多种方式实现,以下是一些常见的方法: 使用 Vue 的全局事件总线 在 Vue 中可以通过事件总线实现通知功能。创建一个全局事件总线,然…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…

通过vue实现

通过vue实现

Vue 实现方法 安装 Vue 确保已安装 Node.js 和 npm,通过以下命令安装 Vue CLI: npm install -g @vue/cli 创建 Vue 项目 使用 Vue CLI…

vue单选实现

vue单选实现

Vue 单选实现 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以实现单选效果。当用户选择不同的选…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…