vue3+axios+router实现页面跳转及登录

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

本篇文章主要是,使用 vite 创建一个vue3 书籍商城的小型案例,项目中主要运用到路由router及接口axios等知识点。

1.开始搭建项目框架,使用vite来构建项目

npm create vite@latest

2.由于vite构建的项目中需要自己手动下载路由以及创建路由文件夹,所以在创建好的项目文档中找到src文件夹,在src文件夹下创建router文件夹,并且在其下创建index文件,对于index文件中要写的内容如下,在此之前还需要创建一个views文件夹,本次项目主要用到三个页面,所以需要在views文件夹下需创建三个文件,包括HomeView.vue、AboutView.vue、UserLoginView.vue。这些准备好之后还有重要的一点就是手动安装router。

npm install vue-router//终端中安装router

index.js文件中的内容:

import { createRouter, createWebHashHistory } from "vue-router";
import HomeView from "../views/HomeView.vue";

const routes = [
  {//首页
    path: "/",
    name: "home",
    component: HomeView,
  },
  {//书籍商城
    path: "/about",
    name: "about",
    component: () =>
      import( "../views/AboutView.vue"),
  },
  {//登录页
    path: "/userlogin",
    name: "userlogin",
    component: () =>
      import("../views/UserLoginView.vue"),
  },
];

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

export default router;

3.上述内容完成之后,还需要在main.js中引入router,不然会报错,以及在app.vue中需要撰写跳转过程。

import router from "./router";

createApp(App).use(router).mount("#app");
<template>
  <nav>
    <router-link to="/">首页</router-link> |
    <router-link to="/about">书籍商城</router-link> | 
    <router-link to="/userlogin">登录</router-link>
  </nav>
  <router-view />
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 40px;
}

nav a {
  font-weight: bold;
  font-size: 1.4rem;
  color: #2c3e50;
  text-decoration: none;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

4.接下来就是书写每个页面的代码,首先是首页,首页中未涉及过于复杂的过程,只是一个单纯的静态页面。

<template>
  <div class="home">
    <div class="box"></div>
    <!-- 书籍新闻列表部分 -->
    <div class="booklist">
      <table>
        <tr v-for="item in list">
            <td>{{ item.type }}&nbsp;&nbsp;&nbsp;&nbsp;<a href="">{{ item.title }}</a></td>
            <td>{{ item.type }}&nbsp;&nbsp;&nbsp;&nbsp;<a href="">{{ item.title }}</a></td>
        </tr>
      </table>         
    </div>
    <!-- 好书推荐部分 -->
    <div class="bookrec">
      <div class="booktitle">
        <h3 >好书推荐</h3>
      </div>
      <ul class="recomd">
        <li class="booItem" v-for="item in bookitem">
          <img :src="item.url" alt="">
          <a href="#">{{item.title}}</a>
          <p class="intro">{{ item.intro }}</p>
          <p class="price">{{ item.price }}</p>
        </li>
      </ul>
    </div>

  </div>
</template>

<script setup>
import { ref} from 'vue'
const list=ref([
  {
    type:'[悬疑]',
    title:'河尸诡棺:大河生凶煞,送棺三千里'
  },
  {
    type:'[仙侠]',
    title:'成就系统:我在武道世界里偷偷修仙'
  },
  {
    type:'[历史]',
    title:'一品权臣:权臣护国保民,安定社稷'
  },
  {
    type:'[玄幻]',
    title:'诡道修仙:雨淋血染草,月照鬼守尸'
  },
  {
    type:'[都市]',
    title:'我的空间能修仙:我混的风生水起!'
  },
])
const bookitem=ref([
  {
    url:'../src/assets/img1.jpeg',
    title:'大明:寒门辅臣',
    intro:'寒门出身,临渊而行,三朝辅臣,巅峰大明!',
    price:'¥23'
  },
  {
    url:'../src/assets/img2.jpeg',
    title:'津门诡事录',
    intro:'浮尸丹鼎、黄仙寻仇、水鬼拉脚、凶灵砌墙……怪力乱神?装神弄鬼!',
    price:'¥26'
  },
  {
    url:'../src/assets/img3.jpeg',
    title:'一品',
    intro:'世家少年入江湖,一刀将这天下捅了个通透。',
    price:'¥28'
  },
  {
    url:'../src/assets/img4.jpeg',
    title:'怒火狂飙',
    intro:'一段视频引发战神狂怒,铁拳霸绝横推一切不平,九万里山河染血。',
    price:'¥35'
  }
])
</script>

<style lang="scss" scoped>
a{
  text-decoration: none;
}
ul,li{
  list-style: none;
}
.box{
  width: 55rem;
  height: 26rem;
  background: url('../assets/pic3.jpg') no-repeat;
  background-size: 100% 100%;
  margin-left: auto;
  margin-right: auto;
}
.booklist{
  width: 50rem;
  // height: 10rem;
  // background: #fc0;
  margin-left: auto;
  margin-right: auto;
  margin-top: 0.5rem;
  table{
    display: flex;
    flex-wrap: wrap;
  }
  td{
    width: 25rem;
    height: 3rem;
    color: rgb(160, 160, 159);
    background: rgb(188, 205, 251);
    a{
      text-decoration: none;
      color: rgb(46, 45, 44);
      cursor: pointer;
      transition: all 0.5s;
      &:hover{
        color: rgb(233, 115, 37);
      }
    }
  }
}
.bookrec{
  width: 55rem;
  height: 25rem;
  margin-top: 0.5rem;
  background: rgba(219, 206, 245, 0.6);
  margin-left: auto;
  margin-right: auto;
  .booktitle{
    width: 55rem;
    height: 3.2rem;
    border-bottom: 1px rgb(161, 161, 159) solid;
    h3{
      float: left;
      padding-left: 1rem;

    }
  }
  .recomd{
    display: flex;
    justify-content: space-around;
    li{
      width: 10rem;
      img{
        width: 9.6rem;
        height: 12.6rem;
      }
      a{
        color: rgb(60, 60, 58);
        &:hover{
          color: rgb(233, 115, 37);
        }
      }
      .intro{
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
        white-space: nowrap;
        overflow: hidden;
        color: rgb(146, 146, 143);
      }
      .price{
        color: rgb(243, 149, 8);
        font-weight: 400;
      }
    }
  }
}

</style>

 首页效果图:

axios页面跳转,案例分享,javascript,开发语言,ecmascript,前端

 

5.其次是书籍商城页面,本页面中由于查询之后会展示相应的书籍,所以涉及到了接口问题,还需要另外自己手动下载接口,对于接口文档是借用小说搜索 - LRY_API这个网站的。

npm install axios --save//在终端中下载接口
<template>
  <div class="about">
    <h2>{{ title }}</h2>
    <!-- 搜索 -->
    <div class="search">
        <input type="text" placeholder="请输入要查询的书籍类型" class="searchinput"  @keyup.enter="search" v-model="book">
        <button class="btn" @click="search">搜索</button>
    </div>
    <!-- 搜索结果 -->
    <div class="searchResult">
      <h3>搜索结果</h3>
    </div>
    <ul class="allbook">
      <li class="bdesign" v-for="item in bookList">
        <img :src="item.cover" alt="">
        <div class="intro">
          <h4 >{{item.title}}</h4>
          <p class="bookintro">作者:{{ item.author }}</p>
          <p class="bookintro">类型:{{ item.fictionType }}</p>
          <p class="bookintro">简介:{{ item.descs }}</p>
          <p class="bookintro">出版时期:{{ item.updateTime }}</p>
        </div>
      </li>
    </ul>
  </div>
</template>
<script setup>
// import { reactive } from 'vue';
import {useRoute} from 'vue-router'
import {ref} from 'vue'
import axios from 'axios'
const route=useRoute();
// let data=reactive({
//     query: route.query
// })
const title=ref('欢迎来到阅读站')
const bookList = ref('')
const book=ref('')
//调用书籍目录接口
const search = () => {
  axios.get(`https://api.pingcc.cn/fiction/search/title/小说/1/10`)
    
  .then((result) => {
    bookList.value=result.data.data 
    console.log(result.data);
	})
  .catch((err)=>{
    alert("书籍输入错误")
    console.log(err)
  })
}
</script>
<style lang="scss" scoped>
a{
	text-decoration: none;
}
ul,li,ol{
	list-style: none;
}
.about{
  width:55rem;
  height:100rem;
  background:rgba(214, 197, 248, 0.6);
  margin-left: auto;
  margin-right: auto;
  h2{
    color: rgb(39, 14, 162);
  }
}
.searchinput{
    width: 30rem;
    height: 2.3rem;
    margin-right: 1rem;
}
.btn{
    width: 5rem;
    height: 2.3rem;
    background: rgb(66, 104, 240);
    color: #fff;
    border: none;
    border-radius: 0.5rem;
    cursor: pointer;
    transition: all 0.5s;
}
.btn:hover{
  background: rgb(245, 185, 66);
}
.searchResult{
  margin-top: 1.5rem;
  width: 55rem;
  height: 3.2rem;
  // background: #59c71e;
  border-bottom: 1px #b1aeae solid;
  h3{
    padding-left: 1rem;
    float: left;
  }
}
.allbook{
  margin-top: 1rem;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  align-content: flex-start;
  padding:0  10px;
  .bdesign{
    display: flex;
    padding-top: 2rem;
    
    img{
      width: 12rem;
      height: 14rem;
    }
    .intro{
      width: 12rem;
      height: 14rem;
      // background: #c64848;
      margin-left: 0.5rem;
      .bookintro{
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
        white-space: nowrap;
        // text-overflow: ellipsis;
        overflow: hidden;
        text-align: justify;

      }
    }
  }
  
}

</style>

 书籍商城效果图:

axios页面跳转,案例分享,javascript,开发语言,ecmascript,前端

 

6.最后就是登录界面,登录界面功能要相对复杂一些,在登录界面中点击其他界面是禁止的,同时在登录之后会跳转到书籍商城界面,内容如下:

<template>
	<div class="box">
		<div class="title">
		   <h3>{{ msg }}</h3>
	    </div>
		<div class="box_form">
			<form method="post">
				<div class="img_control">
				    <img src="../assets/pic.jpeg" class="pic"/>
			    </div>
			    <label class="form-label txt" for="username">用&nbsp;户&nbsp;名:</label>
			    <input  class="form-input txt" type="text" placeholder="用户名" required="required" ref="username"/><br>
			    <label class="form-label" for="password">密&nbsp;&nbsp;码:</label>
			    <input  class="form-input paw" type="password" placeholder="密码" required="required" ref="password"/><br>
			    <label  class="form-label" for="password">没有账号?<a href="#">点击注册</a></label><br>
			    <input  class="form-button" type="submit" value="登录" @click="login"/>
			</form>
		</div>
	</div>
    
</template>

<script setup>
import {useRouter,onBeforeRouteLeave} from 'vue-router';
import {ref} from "vue";
const router = useRouter();
const msg=ref('欢迎登录');
const username=ref(null);
const password=ref(null);
const login=()=>{
	if(username.value.value === 'zhangsan' && password.value.value==='123456'){
		window.localStorage.setItem('userToken',username.value.value+password.value.value)
		router.push({
		    path:'/about',
	        query:{
		        username:"zhangsan",
		        password:123456
	        }
	    })
	}else{
		alert('用户名或密码错误!')
	}
	console.log(username.value.value)
}
onBeforeRouteLeave((to)=>{
    let userToken=localStorage.getItem('userToken')
    if(to.name!='userlogin' && userToken==null){
        return false;
    }
})
</script>

<style lang="scss" scoped>
.box{
	width: 50rem;
	height: 30.5rem;
	background-color: rgba(188, 176, 212, 0.6);
	margin-left: auto;
	margin-right: auto;
}
.title {
	text-align: center;
	font-size: 2rem;
	color: rgba(115, 87, 172, 0.6);
	// margin-top: 1rem;
	padding-top: 0.8rem;
}

.box_form {
	width: 50rem;
	height: 18rem;
	margin-left: auto;
	margin-right: auto;
    .img_control{
        margin-top: 6.5rem
    }
    .pic{
        margin-left: 3rem;
        float: left;
    }
    img{
        width: 15rem;
        height: 15rem;
    }
    .form-input {
        width: 20rem;
	    height: 2.5rem;
	    padding-left: 0.5rem;
	    border-radius: 0.5rem;
		border: none;
    }
    .paw{
        margin-top: 2rem;
	    margin-bottom: 1rem;
		margin-left: 0.7rem;
    }
    .form-label{
        margin-left: 2rem;
		margin-right: 1rem;
		a{
			// display: block;
			text-decoration: none;
			color: rgb(58, 58, 57);
			&:hover{
				color: #f17e0b;
			}
		}
    }
    .form-button {
        width: 20.5rem;
	    height: 2.5rem;
	    margin-top: 1rem;
	    margin-left: 6.5rem;
	    font-size: 1.8rem;
		border: none;
		border-radius: 0.8rem;
	    font-family: "宋体";
		background: rgb(245, 150, 199);
		color: #fff;
		font-weight: 400;
		cursor: pointer;
		&:hover{
			background: #f17e0b;
		}
    }

}
</style>

 登录效果图:

axios页面跳转,案例分享,javascript,开发语言,ecmascript,前端

 

7.最后来看看实际效果吧

书籍商城案例文章来源地址https://www.toymoban.com/news/detail-757688.html

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

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

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

相关文章

  • vue3中使用router路由实现跳转传参

    大家好,今天和大家分享一下vue3中如何进行跳转并进行传参。 vue3取消了vue2部分api,所以路由跳转和传值的方式会有所不同。 我们今天主要讲router.push(location, onComplete?, onAbort?) vue3中新增API:useRouter和useRoute 1.首先在需要跳转的页面引入API—useRouter 2.在跳转页面定义router变量

    2023年04月09日
    浏览(41)
  • 基于vscode实现vue3项目创建启动+安装配置路由vue-router实现单页面组件切换

    访问https://nodejs.org/en,点击下载最新版本的nodejs,并安装。 在项目目录文件下,通过cmd运行下述指令。 依次输入下列命令,启动vue项目 在浏览器中加载http://localhost:5173/,页面加载成功,说明vue项目安装启动成功。 建议安装第三方库通过vscode中的终端来操作,项目启动通过

    2024年02月03日
    浏览(84)
  • vue3.0+element Plus实现页面布局,侧边栏菜单路由跳转

    一. 先在router.js文件中配置路由,将侧边栏中需要跳转的页面都添加到children中 二. 在view目录下新建一个文件,里面包含侧边栏要跳转的页面 三.  页面样式布局 1. 我选择使用自定义组件BaseLayout.vue文件来设置header和aside样式显示 也可以使用element plus中的Container 布局容器 

    2024年02月13日
    浏览(51)
  • 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日
    浏览(61)
  • vite + vue3 + vue-router4 + ts + element plus + pinia + axios构建项目

    最后是完整的vite.config.ts、main.ts配置 1、先用vite创建一个项目 2、安装element plus vite.config.ts配置组件按需导入,图标自动导入   main.ts配置 页面文件使用 3、安装axios main.ts 4、安装pinia /stores/index.ts /stores/counter.ts main.ts 页面使用 5、安装router4 /router/index main.ts   6、vite.config.ts常

    2023年04月25日
    浏览(54)
  • 【Vue3/Vue2】判断设备是移动端还是pc端跳转不同路由router

          APP文件中写入js代码 1、首先,通过 isMobile() 函数判断用户的设备类型。该函数使用正则表达式匹配 navigator.userAgent 字符串,以确定用户是在移动设备上访问网页还是在桌面设备上访问网页 2、然后,在 onMounted() 钩子函数中,根据当前的路由路径来判断是否需要进行重定

    2024年01月16日
    浏览(62)
  • vue3页面跳转

    vue3的页面跳转有两种方式,第一种是标签内跳转,第二种是编程式路由导航 通常用于点击 查看 按钮,跳转到其他页面

    2024年02月12日
    浏览(46)
  • Vue3——getCurrentInstance、页面中route和router的获取方式

    getCurrentInstance() 在vue2中,可以通过this来获取组件实例,但是在vue3的setup函数中,无法通过this获取到组件实例,在setup函数中this的值是undefined,但是vue3提供了getCurrentInstance()来获取组件的实例对象; 输出结果:  可以看出,getCurrentInstance是一个方法,getCurrentInstance()是一个对

    2024年02月15日
    浏览(37)
  • Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式|混入(mixin)|插件)

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

    2024年01月22日
    浏览(46)
  • vue3框架Vite + vue Router + ts 登录后返回上一页或首页

    项目(Vue3):Vite + vue Router + ts 登录后跳转情况: ① 项目中有些页面是需要登录后才可以访问的,如果没有登录的情况下,访问该页面会自动跳转到登录页,完成登录操作后,需要再次返回到该页面 ② 如果直接访问登录页,登录后跳转到首页 访问页面时,进行限制,除了部分

    2024年02月04日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包