登录页面的实现及跳转(vue-router)

这篇具有很好参考价值的文章主要介绍了登录页面的实现及跳转(vue-router)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue-router

路由的核心:改变URL,页面不会整体刷新

一、创建项目

1、使用vite创建项目
npm init vue@latest

注意:根据需求,选择‘可选功能’完成安装(具体安装步骤vue.md)

2、项目结构登录页面的实现及跳转(vue-router)
3、创建登录项目

<1>创建一个组件(登录页面),我们把这个组件称为单文件组件

位置:(规范情况下,将组件写到components目录下)

命名:大驼峰式命名规则

格式(三个部分):

<script>
</script>
<template>
</template>
<style scoped>
</style>

<2>Login.vue(登录组件)

<script>
export default {
    // 响应式数据 data() 函数
    data(){
        return{
            name:'',
            password:'',
            tip:'',
            // 设置标识
            flag:'false'
        }
    },
    // 方法书写在 methods 中
    methods:{
        sign(){
            // 先判断用户名和密码是否为空
            if(this.name === '' || this.password === ''){
                // 如果为空的弹出提示
                this.flag='false'
                this.tip='用户名和密码为空'
            } else if(this.name ==='admin' && this.password === '123456'){
                this.flag='true',
                this.tip=''
                // 跳转页面
                this.$router.push({
                    path:'/logins'
                })
            } else {
                this.flag='false',
                this.tip='账号名或密码错误'
            }
        }
    }
}
</script>
<template>
    <div class="box1">
        <div>
            <h1>Login</h1>
            <ul>
                <label>
                    <li>用户:<input type="text" placeholder="请输入用户名" v-model.trim="name"></li>
                </label>
                <label>
                    <li>密码:<input type="password" placeholder="请输入密码" v-model.trim="password"></li>
                </label>
                <li><button @click="sign">登录</button></li>
                <li v-show="flag" :class="{style1:flag}">
                    {{ this.tip }}
                </li>
            </ul>
        </div>
    </div>
</template>
// scoped 样式的作用域在本组件中
<style scoped>
div.box1 {
    height: 50%;
    width: 100%;
    /* background-color: red; */
}
.style1{
    color:red;
}
 div.box1 div{
    text-align: center;
    height: 50%;
    color:rgb(96, 207, 170);
    /* background-color: aqua; */
    border: 1px solid #111;
 }
    /* 注意:使用弹性布局时,内部所有的元素都会变成内联块 */
 div.box1 div ul li {
    margin-top: 10px;
    list-style: none;
    color:rgb(96, 207, 170)
 }
 div.box1 div ul li button {
    width: 35%;
 }
</style>

Tips:

1、使用弹性布局时,内部所有的元素都会变成内联块

2、在输入用户名和密码的时候,在表单元素上进行数据的双向绑定,v-model=‘响应式变量’,进行去除前后空格的修饰操作.trim

3、在按钮上取消默认行为(.prevent,相当于事件对象event.defaultPrevent()),并绑定点击事件,触发sign函数

相当于v-on=‘sign’ 简写为@click=‘sign’

4、响应式数据 模块是 data函数,返回一个对象

5、methods是一个对象,在对象内部书写各种函数

①书写函数sign函数

        sign(){
            // 先判断用户名和密码是否为空
            if(this.name === '' || this.password === ''){
                // 如果为空的弹出提示
                this.flag='false'
                this.tip='用户名和密码为空'
            } else if(this.name ==='admin' && this.password === '123456'){
                this.flag='true',
                this.tip=''
                // 跳转页面
                this.$router.push({
                    path:'/logins'
                })
            } else {
                this.flag='false',
                this.tip='账号名或密码错误'
            }
        }

注意:

1、函数中获取响应式数据需要使用this获取

2、通过一个标识来判断提示信息是否弹出,使用v-show判断(注意:v-if和v-show的区别)

-------v-if(判断时,不断的销毁重建)

-------v-show(相当于使用display:none)

3、用户名和密码正确,进行跳转页面

②页面的跳转

使用路由router进行页面的跳转:用法:this.$router (路由实例)

this.$router.push()或replace()方法

启动项目,打开页面,直接进入login页面

**方式一:**将Login组件作为App.vue的子组件

在APP.vue中引入Login组件,并注册

<script>
import Login from './components/Login.vue'
export default {
  // 参数是对象
  components: {Login},
}
</script>

<template>
  // 组件一般都是大驼峰式,和html标签区分
<Login></Login>
</template>

在使用时,将原有的所有样式都清除(src->assets->main.css)

启动项目,打开前端页面
登录页面的实现及跳转(vue-router)

问题:在地址栏中输入任何内容,都会跳转到登录页面

**原因:**因为我们把Login组件作为了App.vue中模板的内容,App.vue是根组件,所以当我们的路径发生变化时,只会显示Login组件。我们所使用的this.$router.push就会失效,导致跳转不成功。

补充知识点:路由(router)

路由:是组件和路径的一一映射关系

位置:我们将路由再写(src->router->路由名称)

①创建路由

创建路由对象,通过createRouter函数创建,首先引入方法

import { createRouter, createWebHashHistory } from "vue-router";

通过createRouter函数创建路由

// 创建路由实例
const Router = createRouter({
    // 模式有两种:createWebHashHistory()--路径中含有#,createWebHistory()
    history: createWebHashHistory(),
    // 将每个路由映射到对应的组件
    routes: [
        {
            path:'/logins', // 路径
            name:'logins',
            component:LoginFirst // 组件--当访问'/'时就会显示LoginFirst组件中的内容
        }
    ]
});

要使用LoginFirst组件就需要引入组件

import LoginFirst from '../components/login/LoginFirst.vue'

将路由导出

export default Router

使用路由,在main.js中引入路由,使用路由

import Router from '../src/router/Router'
app.use(Router)

通过对路由知识的补充,我们能够充分理解到方法一的问题,为解决这个问题,我们使用方式二

**方式二:**应该要有路由显示的位置,但是上面没有,所以我们需要指定区域显示路由,在App.vue中中使用显示我们的路由,也可以使用

<script>
import Login from './components/Login.vue'
export default {
  // 参数是对象
  components: {Login},
}
</script>
<template>
  // 显示路由的区域
  <RouterView></RouterView>
</template>

我们使用的是显示路由,所以登录的组件(Login.vue)也需要和路径进行一一对应

因为我们需要打开页面就进入Login组件,所以我们可以将路径设置为‘/’或者‘/login’

// 创建路由实例
const Router = createRouter({
    history: createWebHashHistory(),
    // 将每个路由映射到对应的组件
    routes: [
        {
            path:'/',
            // 设置别名
            alias:'/login'
            component:Login
        },
        {
            path:'/logins',
            name:'logins',
            component:LoginFirst
        }
    ]
});

当然Login组件也需要引用

import Login from '../components/Login.vue'

但是,输入路径不对时,出现空白。用户体验不好,所以当输入别的路径时,出现404NotFound。同样的我们在路由中进行设置

import { createRouter, createWebHashHistory } from "vue-router";
import NotFound from '../components/test/NotFound.vue'
import LoginFirst from '../components/login/LoginFirst.vue'
import Login from '../components/Login.vue'

// 创建路由实例
const Router = createRouter({
    history: createWebHashHistory(),
    // 将每个路由映射到对应的组件
    routes: [
        // 404
        {
            path: '/:paths(.*)*',
            component: NotFound
        },
        {
            path:'/',
            component:Login
        },
        {
            path:'/logins',
            name:'logins',
            component:LoginFirst
        }
    ]
});

export default Router

当路径不正确时,出现NotFound组件。简单的写一个404页面。

<script>
</script>
<template>
    <div>
        404 NotFout
    </div>
</template>
<style>
</style>

详细解释匹配404路径知识:

{
  path: '/:path(.*)*',
  component: NotFound
},

将所有匹配到的路径存放在 $route.params.path 下, 将非法路径的所有部分作为参数

我们使用$route.params.path获取动态路由参数

<template>
    <div>
        404 NotFout {{ this.$route.params.path }}
    </div>
</template>

区别:

/:paths(.*)

:如果是这样书写的,意思是:将/后所有的路径放入一个字符串中

登录页面的实现及跳转(vue-router)

/:paths(.*)*

:如果是这样书写的,意思是:将/后所有路径,以/分割,将分割的内容,放入数组中
登录页面的实现及跳转(vue-router)

4、首页(登录进去后的页面)

<1>设计页面
登录页面的实现及跳转(vue-router)

注意:这里就需要路由相关知识了

<2>创建路由

①一级标签可以做成超链接(a链接),但是点击a标签会进行整个页面的刷新,性能低。我们需要点击时,只刷新渲染局部。(改变地址栏路径,页面不会重新刷新)

通过<router-link to=''></router-link> 来实现

②我们修改LoginFirst.vue组件(只导了template部分的代码)

<template>
  <div class="box1">
        <ul>
            <router-link to="/grade2022"><li>2022</li></router-link>
            <router-link to="/grade2021"><li>2021</li></router-link>
            <router-link to="/grade2020"><li>2020</li></router-link>
        </ul>
		 // 显示区
        <router-view></router-view>
  </div>
</template>

提示:当点击2022时,会在地址栏中显示/grade2022地址,同时,/grade2022会对应一个组件,因此,需要在路由中设置路径与组件的映射

③在路由(Router)中设置映射

创建三个Grade组件

登录页面的实现及跳转(vue-router)

在路由中引入,在完成路径和组件的映射

发现问题?组件太多了,三个组件的模板基本相同,只是数据不同。因此可以写一个组件,复用组件进行传参。

代码优化:

<1>创建一个Grade组件,显示参数

登录页面的实现及跳转(vue-router)

<2>在路由中引入Grade

<3>配置映射,并传参

登录页面的实现及跳转(vue-router)

<4>修改router-link to 中的路径
登录页面的实现及跳转(vue-router)

二、完善需求

1、发现问题

当路径地址为/grade/2022时,Grade组件显示在App.vue中的区域中,但是我们的需求是想要Grade组件中的内容显示在LoginFirst组件列表的下方。

解决方法:路由的嵌套

<1>修改路由(我这里嵌套了三个路由—Login)

{
            path: '/logins',
            name: 'logins',
            component: LoginFirst,
            children: [
                {
                    path: 'grade/:id',
                    component: Grade,
                    children: [
                        {
                            path: 'a1',
                            component: GradeBottom
                        }
                    ]
                }
            ]
        },

注意:

1>使用children关键字,值为数组,数组中每一个元素都是路径与组件的映射

2>子路由中路径开始的地方不应该有/

<2>修改路径

登录页面的实现及跳转(vue-router)

访问结果:

登录页面的实现及跳转(vue-router)

<3>修饰样式

LoginFirst.vue

<script>

</script>
<template>
  <div class="box1">
        <ul>
            <!-- class="router-link-active" 设置点击产生高亮行为 -->
            <router-link :to="{name:'grade',params:{id:1}}"><li>2022级</li></router-link>
            <router-link :to="{name:'grade',params:{id:2}}"><li>2021级</li></router-link>
            <router-link :to="{name:'grade',params:{id:3}}"><li>2020级</li></router-link>
        </ul>
        <div><router-view></router-view></div>
  </div>
</template>
<style scoped>
    *{
        margin: 0;
        padding: 0;
    }
    div.box1 ul li {
        display: inline-block;
        text-align: center;
        margin-left: 15px;
        width: 50px;
        height: 30px;
        line-height: 30px;
        background-color: rgb(228, 233, 233);
        list-style: none;
    }
    /* .router-link-active{
        background-color:red;
    } */
</style>

Grade.vue

<script>
// 导入数据
import data from '../../Data'
export default {
    // 定义一个数组接收数据
    data() {
        return {
            list: []
        }
    },
    // 使用参数
    props:['id'],
    // 钩子函数
    mounted() {
        // 获取id
        const id = this.$route.params.id
        // 使用list接收数据,初始化
        this.list = data.filter(item => item.id === id)[0].items
    },
    updated() {
        const id = this.$route.params.id;
        // 更新时也要更新list
        this.list = data.filter(item => item.id === id)[0].items
    }

}
</script>

<template>
    <!-- <div class="topBox"> Grade---{{ this.$route.params.id }} </div> -->
    <div class="divBox">
        <router-link v-for='item of list' :to="{
            name: 'school',
            params: { id }
        }">{{ item }}</router-link>

        <router-view></router-view>
    </div>
</template>

<style scoped>
/* div.topBox {
    text-align: center;
} */

a {
    margin-left: 10px;
    color:rgb(81, 87, 82);
    font-size:14px
}
</style>

<4>显示二级标签(就是路由的嵌套)

 {
            path: '/logins',
            name: 'logins',
            // 当地址为/main时也是登录页面
            // 使用别名
            alias:'/main',
            // 使用重定向
            // redirect:{name:'logins'},
            component: LoginFirst,
            children: [
                {
                    path: 'grade/:id',
                    name:'grade',
                    // 方便传参数
                    props:true,
                    component: Grade,
                    children: [
                        {
                            path: 'a1',
                            name:'school',
                            component: GradeBottom
                        }
                    ]
                }
            ]
        },

效果图:

登录页面的实现及跳转(vue-router)

<5>为了让路由的使用更加方便,我们可以给路由设置名称(ps:前面的路由代码中已设置是使用了)

<6>我们设置了名称后,就可以在router-link中使用了,传递参数方便

            <router-link :to="{name:'grade',params:{id:1}}"><li>2022级</li></router-link>
            <router-link :to="{name:'grade',params:{id:2}}"><li>2021级</li></router-link>
            <router-link :to="{name:'grade',params:{id:3}}"><li>2020级</li></router-link>

<7>在push(replace)中使用

this.$router.replace({name:'logins'})

tip:在编程式导航中,可以使用replace替换当前位置,它的作用类似于router.push,唯一的不同是,它在导航时不会向history添加新记录

2、新的需求:

当点击一级菜单时,显示对应的二级菜单,二级菜单各不相同。

<1>如何在组件中获取参数?

通过this.$route.param来获取参数

<2>在Grade组件中获取参数,根据一级菜单不同,加载对应的二级菜单,因此,需要使用生命周期函数mounted页面加载完成后的事情(初始化的工作一般都在此函数中运行)

    // 定义一个数组接收数据
    data() {
        return {
            list: []
        }
    },
    // 使用参数
    props:['id'],
    // 钩子函数
    mounted() {
        // 获取id
        const id = this.$route.params.id
        // 使用list接收数据,初始化
        this.list = data.filter(item => item.id === id)[0].items
    },

注意:data是声明的假数据,真实的数据需要从后台获取

data.js假数据:

// 数据
const data = [
    {
        id:'1',
        items:['计算机科学与技术','信息管理','信息与计算']
    },
    {
        id:'2',
        items:['人工智能','计算机科学','大数据']
    },
    {
        id:'3',
        items:['云存储','算法','信息与计算']
    }
];

export default  data

<3>参数更新后也要对数据进行更新,使用updated函数

    updated() {
        const id = this.$route.params.id;
        // 更新时也要更新list
        this.list = data.filter(item => item.id === id)[0].items
    }

<4>动态渲染

<template>
    <!-- <div class="topBox"> Grade---{{ this.$route.params.id }} </div> -->
    <div class="divBox">
        <router-link v-for='item of list' :to="{
            name: 'school',
            params: { id }
        }">{{ item }}</router-link>

        <router-view></router-view>
    </div>
</template>

<5>为了方便使用参数,可以将props(路径中的参数)传递给组件。
登录页面的实现及跳转(vue-router)文章来源地址https://www.toymoban.com/news/detail-421484.html

到了这里,关于登录页面的实现及跳转(vue-router)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 4种方法实现html 页面内锚点定位及跳转

    不知道你有没有遇到这样的需求:锚点定位?进入页面某个元素需要出现在可视区?…这一类的需求归根结底就是处理元素与可视区域的关系。我接触了很多前端小伙伴,实现的方式有各种各样的,比如使用 scrollTop、监听滚动等等,这也是很多小伙伴第一个想到的。 今天我

    2024年02月11日
    浏览(34)
  • Vue3 - 实现路由 “新开一页“ 进行页面跳转功能,Router 路由跳转时在新窗口打开页面(网站跳转页面时浏览器新开页签打开网页,支持在页面、纯 js/ts 文件中使用,详细示例代码教程)

    网上这方面教程很少,本文提供多种解决方案,适用于任何场景。 本文 实现了在 vue3 项目开发中,当页面跳转时浏览器打开新窗口(新页签)跳转,Router 路由跳转并新开一页教程, 无论您是在普通页面、纯 js/ts 文件中,都可以使用, 如下图所示,当执行路由跳转时浏览器

    2024年02月03日
    浏览(60)
  • vue3 的router跳转 - 页面同tab跳转和打开新tab跳转

    当前页需要的方法 主要是获得Vue Router实例暴露的一些方法,使用这些方法,进行路由操作 引入 调用 目标页需要的方法 主要是对传递来的参数,进行接收,比如查询参数,页面路径,标题,hash等 调用 route里面的数据会被处理成响应式 页面同tab跳转 push(to) :跳转到指定的路

    2024年02月01日
    浏览(42)
  • vue通过router地址传参跳转同一路由页面,页面不刷新的解决办法

    vue、 vue-router@4 记录一下最近遇到的vue路由页面间的跳转的问题,其中就涉及到了不同路由的跳转(/a/b1 = /a/b2)、相同路由不同参数间的跳转(/a/b?c=1 = /a/b?c=2)、相同页面锚点跳转(/a/b#id1 =/a/b#id2) 原因:渲染的是同一组件 解决:可以在不刷新的页面通过监听route,重新加载

    2024年02月04日
    浏览(58)
  • 使用Vue+Vue-router+el-menu实现菜单功能实战

    上节回顾 上一小节我们使用 H5+CSS3 实现了管理平台的 架构布局 ,并且通过 Vuex 的使用,获取到前端数据本地化存储的username,绑定到右上角进行全局展示。还不了解上下文的同学可以回顾一下 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战 。 本节介绍 本小节已经是专栏的

    2023年04月15日
    浏览(36)
  • 12 使用Vue+Vue-router+el-menu实现菜单功能实战

    上节回顾 上一小节我们使用 H5+CSS3 实现了管理平台的 架构布局 ,并且通过 Vuex 的使用,获取到前端数据本地化存储的username,绑定到右上角进行全局展示。还不了解上下文的同学可以回顾一下 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战 。 本节介绍 本小节已经是专栏的

    2024年02月16日
    浏览(84)
  • vue-router + element-plus实现面包屑导航栏和路由标签栏

    首先,先解释一下什么是面包屑导航栏和路由标签栏。 如下图所示,面包屑导航栏就是展示当前所处路由信息和父辈路由信息的导航栏,它的作用是提示用户当前页面所在位置;路由标签栏就类似于浏览器的标签栏,每个标签对应一个路由页面,点击该标签可以进入该路由页

    2023年04月23日
    浏览(48)
  • vue3 一个基于pinia简单易懂的系统权限管理实现方案,vue-router动态路由异步问题解决

    作为项目经验稀少的vue开发者来说,在关键技术点上的经验不多,我希望通过我的思想和实践,把好的东西分享在这里,目的是进一步促进技术交流。项目即将完成,权限是最后的收尾工作,好的权限实现方案,可以让我们没有后顾之忧,也可以提升项目的运行速度。 在开发

    2023年04月08日
    浏览(53)
  • Vue3+Vue-Router+Element-Plus根据后端数据实现前端动态路由——权限管理模块

    提示:文章内容仔细看一些,或者直接粘贴复制,效果满满 提示:文章大概 1、项目:前后端分离 2、前端:基于Vite创建的Vue3项目 3、后端:没有,模拟的后端数据 4、关于路径“@”符号——vite.config.js 文件里修改 提示:以下是本篇文章正文内容,下面案例可供复制粘贴使用

    2024年02月02日
    浏览(58)
  • 路由,vue-router的基本用法,vue-router的常见用法$route.params、$router.push、$router.replace、$router.go

    路由(英文: router)就是 对应关系 。 SPA指的是一个web网站只有唯一的一个HTML页面, 所有组件的展示与切换 都在这唯一的一个页面内完成。此时, 不同组件之间的切换 需要通过 前端路由 来实现。 *结论:*在SPA项目中, 不同功能之间的切换 ,要 依赖于前端路由 来完成! 通俗

    2024年01月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包