Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式)

文章目录

  • 前要:前端路由的概念与原理
    • 1)什么是路由
    • 2)SPA与前端路由
    • 3)什么是前端路由
    • 4)前端路由的工作方式
  • 一、Vue-router简单使用
    • 1)什么是vue-router
    • 2) vue-router 安装和配置的步骤
      • ① 安装 vue-router 包
      • ② 创建路由模块
      • ③ 导入并挂载路由模块
      • ④ 声明路由链接和占位符
      • ⑤ 声明路由的匹配规则
    • 3) vue-router 简单使用
  • 二、登录跳转电影热点榜单案例
    • 1)注意事项一:axios
    • 2)注意事项二:跨域问题
  • 三、scoped样式

前要:前端路由的概念与原理

1)什么是路由

路由(英文:router)就是对应关系

2)SPA与前端路由

SPA指的是一个web网站只有一个唯一的一个HTML页面,所有组件的展示与切换都在唯一的一个页面内完成。
此时,不同组件之间的切换需要通过前端路由来实现

总结:在SPA项目中,不同功能之间的切换,要依赖于前端路由来完成

3)什么是前端路由

通俗移动的概念:地址组件之间的对应关系

4)前端路由的工作方式

  • 用户点击了页面上的路由链接
  • 导致了URL地址栏中的值发生了变化
  • 前端路由监听到了地址的变化
  • 前端路由把当前地址对应的组件渲染到浏览器中

一、Vue-router简单使用

1)什么是vue-router

vue-router vue.js官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。

vue-router 的官方文档地址:https://router.vuejs.org/zh/

2) vue-router 安装和配置的步骤

因为我是通过命令创建vue项目的,当时已经选配好了,所以下面前三个步骤都不用自己配置

① 安装 vue-router 包

在 vue2 的项目中,安装 vue-router 的命令如下:

	cnpm i vue-router@3.5.2 -S

② 创建路由模块

src源代码目录下,新建router/index.js路由模块,并初始化如下的代码:

	//1. 导入Vue 和 VueRouter的包
	import Vue from 'vue'
	import VueRouter from 'vue-router'
	
	//2. 调用Vue.use() 函数,把VueRouter安装为Vue的插件
	Vue.use(VueRouter)
	
	//3. 创建路由的实例对象
	const routes = new VueRouter()
	
	//4. 向外共享路由的实例对象
	export default router

③ 导入并挂载路由模块

src/main.js 入口文件中,导入并挂载路由模块。示例代码如下:

	import Vue from 'vue'
	import App from './App.vue'
	//1. 导入路由模块
	import router from './router'
	import store from './store'
	
	Vue.config.productionTip = false
	
	//2. 挂载路由模块
	new Vue({ 
	  router, //也可以写成 router:router
	  store,
	  render: h => h(App)
	}).$mount('#app')

④ 声明路由链接和占位符

src/App.vue 组件中,使用 vue-router 提供的 < router-link > (这个也可以不用)< router-view > 声明路由链接(路由链接也可以不用)和占位符:

	<template>
	  <div id="app">
			<!--定义路由链接 || 也可以不用定义-->
			//<router-link to="/">首页</router-link>
			//<router-link to="/login">登录</router-link>
			
			<!--定义路由的占位符-->
			<router-view></router-view>
	  </div>
	</template>

其实使用< a >链接也行,如< a href="#/home">首页</ a> 但更推荐使用< router-link> 并且这样不需要写#号,在浏览器控制台看到的还是< a>链接

⑤ 声明路由的匹配规则

src/router/index.js 路由模块中,通过 routes数组声明路由的匹配规则。示例代码如下:

	//1.导入需要使用路由切换展示的组件
	import IndexView from '@/views/indexView.vue'
	import LoginView from "@/views/LoginView.vue";

	//2.注册路由
	const routes = [
	    //在routers数组中,声明路由的匹配规则
	  {
	    path: '/',  // path表示要匹配的地址
	    name: 'index',  // name 表示别名
	    component: IndexView, //component 表示要展示的路由组件
	  },
	  {
	    path: '/login',
	    name: 'login',
	    component: LoginView
	  },
	]

3) vue-router 简单使用

1.在views中创建一个页面组件

	<script>
    export default {
      name:'indexView',
    }
	</script>
	
	<template>
	    <div>
	      <h1>首页</h1>
	    </div>
	</template>
	
	<style scoped>
	</style>

2.在router/index.js文件中导入并使用

	# 导入Vue 和 VueRouter的包
	import Vue from 'vue'
	import VueRouter from 'vue-router'
	//1.导入需要使用路由切换展示的组件
	import IndexView from '@/views/indexView.vue'
	
	# 调用Vue.use() 函数,把VueRouter安装为Vue的插件
	Vue.use(VueRouter)
	
	//2.注册路由
	const routes = [
	  //在routers数组中,声明路由的匹配规则
	  {
	    path: '/',  // path表示要匹配的地址
	    name: 'index',  // name 表示别名
	    component: IndexView, //component 表示要展示的路由组件
	  },
	]
	
	# 创建路由的实例对象
	const router = new VueRouter({
	  mode: 'history',
	  base: process.env.BASE_URL,
	  routes
	})
	
	# 向外共享路由的实例对象
	export default router

3.在App.vue中定义路由的占位符,这样就可以实现组件切换

	<template>
	  <div id="app">
	     <!--定义路由的占位符-->
	      <router-view>
	
	      </router-view>
	  </div>
	</template>
	
	<style></style>

	<script>
		export default {
		  name: 'App',
		  data() {
		    return {}
		  },
		  created() {
		    console.log(this)   // 只要使用了路由组件 this中就有了 route router
		  }
		}
	</script>

这样启动vue项目后,在浏览器中输入对应的路由即可访问了

在这里插入图片描述


二、登录跳转电影热点榜单案例

1)注意事项一:axios

这里会涉及到从前端向后端发送ajax请求,所以需要安装一个axios,命令cnpm install axios -S(-S是会把这个依赖写入到package.json中,不写的话只能在当前项目使用)

	使用axios,和导入组件一样的操作
	import axios from 'axios' //一样import后面不一定叫axios它只是一个重命名,可以随意叫,为了好识别不乱改

2)注意事项二:跨域问题

1.在Django中安装模块

	pip3 install django-cors-headers

2.在settings中注册应用和注册中间件

	INSTALLED_APPS = (
	    'corsheaders',
	)
	
	MIDDLEWARE = [
  		'corsheaders.middleware.CorsMiddleware'
   ]

3.最后把下面的代码复制到settings文件夹中即可

	CORS_ORIGIN_ALLOW_ALL = True
	CORS_ALLOW_METHODS = (
	    'DELETE',
	    'GET',
	    'OPTIONS',
	    'PATCH',
	    'POST',
	    'PUT',
	    'VIEW',
	)
	CORS_ALLOW_HEADERS = (
	    'XMLHttpRequest',
	    'X_FILENAME',
	    'accept-encoding',
	    'authorization',
	    'content-type',
	    'dnt',
	    'origin',
	    'user-agent',
	    'x-csrftoken',
	    'x-requested-with',
	    'Pragma',
	)

案例开始

这里为了方便,我使用restframework-jwt快速创建登录,因为是jwt是基于auth表的登录,所以先创建一个用户,这里不就在演示了。

Django编写后端登录接口以及获取电影热点榜单接口
urls.py

	from rest_framework_simplejwt.views import token_obtain_pair
	urlpatterns = [
	    path('login/', token_obtain_pair),
	]

我这里为了好一些,就定制返回格式和定制全局异常处理

serializer.py

	from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
	class LoginSerializer(TokenObtainPairSerializer):
	    def validate(self, attrs):
	        res = super().validate(attrs)
	        user = self.user
	        data = {'code': 100, 'message': '登录成功', 'username': user.username}
	        data.update(res)
	        return data

	'设置全局,在settings中配置一下'
	SIMPLE_JWT = {
       "TOKEN_OBTAIN_SERIALIZER": "app01.serializer.LoginSerializer",
	}

在这里插入图片描述
excptions.py

	from rest_framework.views import exception_handler
	from rest_framework.response import Response
	def common_exception_handler(exc, context):
	    res = exception_handler(exc, context)
	    if res:
	        msg = res.data.get('detail') or res.data or '系统异常,请联系管理员'
	        return Response({'code': 999, 'msg': msg})
	    else:
	        return Response({'code': 888, 'msg': f"系统异常,请联系管理员:{str(exc)}"})

	'配置一下自定义的全局异常处理,在settings中配置一下'
	REST_FRAMEWORK = {
	    'EXCEPTION_HANDLER': 'app01.excptions.common_exception_handler'
	}

views.py配置访问电影接口

	from rest_framework.views import APIView
	from rest_framework.response import Response
	import json

	class MovieView(APIView):
	    def get(self, request):
	        with open('./movie.json', 'rt', encoding='utf-8') as f:
	            res = json.load(f)
	        return Response(res)
	
	'urls.py'
	path('movies/', views.MovieView.as_view()),

Vue+axios编写前端
配置LoginView.vue组件

	<script>
	    import axios from 'axios'
	    export default {
	      name:'LoginView',
	      data(){
	        return {
	          username:'',
	          password:'',
	        }
	      },
	      methods:{
	        handlerSubmit(){
	          //发送ajax请求
	          axios.post('http://127.0.0.1:8000/api/v1/login/',{
	            username:this.username,
	            password:this.password
	          }).then(response=>{
	              if(response.data.code===100){
	                //路由跳转 vue-router支持的
	                this.$router.push('/')
	              }else{
	                alert(response.data.msg)
	              }
	          })
	        }
	      }
	    }
	</script>
	
	<template>
	    <div>
	      <h1>登录页面</h1>
	      <hr>
	      <p>username: <input type="text" v-model="username" placeholder="请输入用户名"></p>
	      <p>password: <input type="password" v-model="password" placeholder="请输入密码"></p>
	      <button @click="handlerSubmit">登录</button>
	
	    </div>
	</template>

配置indexView.vue组件

	<script>
	import axios from 'axios'
	
	export default {
	  name: 'indexView',
	  data() {
	    return {
	      filmlist: [],
	    }
	  },
	  created() {
	    axios.get('http://127.0.0.1:8000/api/v1/movies/').then(res => {
	      // console.log(res.data.status)
	      if (res.data.status === 0) {
	        this.filmlist = res.data.data.films
	        // console.log(res.data.data.films)
	      } else {
	        alert(res.msg)
	      }
	    })
	  }
	}
	</script>
	
	<template>
	  <div>
	    <h1 style="margin-left:20px;">电影热点榜单</h1>
	    <div id="zhu" v-for="film in filmlist">
	      <div style="float: left;">
	        <img :src="film.poster" alt="" style="width:66px;height:100px;">
	      </div>
	      <div style="float:left;margin-left:10px;margin-top:-20px;">
	          <span>
	              <h4 style="padding:0;margin-bottom:12px;">{{ film.name }}</h4>
	              <span>观众评分&nbsp;&nbsp;{{ film.grade }}</span><br>
	              主演:<span v-for="people in film.actors">
	                  {{ people.name }}
	              </span><br>
	              <span>中国大陆|{{ film.runtime }}</span>
	          </span>
	      </div>
	
	    </div>
	  </div>
	</template>
	
	<style scoped>
		#zhu {
		  border-top: 1px solid rgb(158, 158, 158);
		  margin: 20px;
		  padding: 20px;
		  overflow: hidden;
		}
	</style>

配置App.vue占位

	<template>
	  <div id="app">
	      <!--定义路由的占位符-->
	      <router-view>
	
	      </router-view>
	  </div>
	</template>

在router/index.js中导入组件和注册路由

// 导入Vue 和 VueRouter的包
import Vue from 'vue'
import VueRouter from 'vue-router'
//1.导入需要使用路由切换展示的组件
import IndexView from '@/views/indexView.vue'
import LoginView from "@/views/LoginView.vue";

//调用Vue.use() 函数,把VueRouter安装为Vue的插件
Vue.use(VueRouter)

//2.注册路由
const routes = [
    //在routers数组中,声明路由的匹配规则
  {
    path: '/',  // path表示要匹配的地址
    name: 'index',  // name 表示别名
    component: IndexView, //component 表示要展示的路由组件
  },
  {
    path: '/login',
    name: 'login',
    component: LoginView
  },
]

// 创建路由的实例对象
const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

// 向外共享路由的实例对象
export default router

这样就实现了登录后跳转到电影热点榜页面了

在这里插入图片描述

三、scoped样式

Scoped主要作用就是让当前样式只允许当前组件生效 别的组件无效

用个实例来说明一下

	'TestView是没有设置在style标签中设置scoped样式的,我们配置好组件和路由去访问别的路由地址看看'
	<script>
	export default {
	  name:'TestView'
	}
	</script>
	
	<template>
	<div>
	  <h1>hello world</h1>
	</div>
	</template>
	
	<style> //这是
	h1{background-color:lightblue}
	</style>

可以发现当我们切换别的路由组件时,那个组件的样式全局设置了,所以需要设置在style标签中设置scoped样式

我们再把scoped样式加上看看
在这里插入图片描述

可以看到已经不影响其他组件了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第11章 GUI Page495~496 步骤三十一:另存为别的文件,为TrySaveFile()入参设置一些位操作

工程二 头文件中为TrySaveFile()入参设置一些位操作&#xff0c;修改一下TrySaveFile()的入参类型 修改TrySaveFile()的实现&#xff1a; 修改“保存”菜单项挂接事件响应函数: 修改“另存为”菜单项挂接事件响应函数

kylin集群反向代理(健康检查)

前面一篇文章提到了使用nginx来对kylin集群进行反向代理&#xff0c; kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次&#xff0c;点赞8次&#xff0c;收藏9次。由于是同一个集群的&#xff0c;元数据没有变化&#xff0c;所以&#xff0c;直接将原本的kylin使用scp的…

大模型学习与实践笔记(四)

一、大模型开发范式 RAG&#xff08;Retrieval Augmented Generation&#xff09;检索增强生成&#xff0c;即大模型LLM在回答问题或生成文本时&#xff0c;会先从大量的文档中检索出相关信息&#xff0c;然后基于这些检索出的信息进行回答或生成文本&#xff0c;从而可以提高回…

使用组合框QComboBox模拟购物车

1.组合框: QComboBox 组合框&#xff1a;QComboBox 用于存放一些列表项 实例化 //实例化QComboBox* comboBox new QComboBox(this);1.1 代码实现 1.1.1 组合框的基本函数 QComboBox dialog.cpp #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍&#xff1a;Maxwell是由美国Zendesk开源的&#xff0c;使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志&#xff08;Binlog&#xff09;&#xff0c;并将这些信息生成为JSON格式的消息。进一步地&#xff0c;Maxwell将这些消息作为生产者发送给Kafka、…

【Android+物联网】Android封装MQTT连接阿里云物联网平台

前言&#xff1a; 亲测可行&#xff0c;本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中&#xff0c;并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。 关于《Android软件开发》&#xff0c;见如下专栏…

智能小程序小部件(Widget)开发详解

Widget 代表应用的一个小部件&#xff0c;负责小部件的展示和交互。 小部件(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小部件(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小部件(Widget)项目 在 Tuya MiniApp Tools 中&…

【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南

&#x1f431;‍&#x1f680;C#/.NET/.NET Core学习、工作、面试指南 “ 让现在的自己不再迷茫✨✨✨。 GitHub开源地址&#xff1a;https://github.com/YSGStudyHards/DotNetGuide &#x1f4da;DotNetGuide简介 现如今网上关于Java、前端、Android、Golang...等相关技术的…

基础篇_面向对象(什么是对象,对象演化,继承,多态,封装,接口,Service,核心类库,异常处理)

文章目录 一. 什么是对象1. 抽取属性2. 字段默认值3. this4. 无参构造5. 抽取行为 二. 对象演化1. 对象字段演化2. 对象方法演化3. 贷款计算器 - 对象改造4. 静态变量5. 四种变量 三. 继承1. 继承语法2. 贷款计算器 - 继承改造3. java 类型系统4. 类型转换1) 基本类型转换2) 包…

数据结构04附录01:字符串大写转小写[C++]

图源&#xff1a;文心一言 上机题目练习整理~&#x1f95d;&#x1f95d; 本篇作为字符串的代码补充&#xff0c;提供了3种&#xff08;差别并不大&#xff09;解法以及函数的详细解释&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 前文&#xff1a;&#x1f338;…

最全的软件测试面试题(含答案)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…

ME6211C33M5G-N 输出3.3V 500mA 线性稳压器LDO 参数

描述 ME6211系列是高精度&#xff0c;低噪声&#xff0c;CMOS LDO电压调压器。ME6211系列提供低输出噪声&#xff0c;高纹波抑制率&#xff0c;低辍学率和非常快速的开启时间&#xff0c;ME6211系列是当今最前沿的手机的理想选择。ME6211内部包括参考电压源、误差放大器、驱动…

Python从入门到精通 第十一章(面向对象)

一、类和对象 1、面向对象基本概念 &#xff08;1&#xff09;之前学习的编程方式是面向过程的&#xff0c;面向过程和面向对象是两种不同的编程方式。 &#xff08;2&#xff09;过程和函数&#xff1a;过程是早期的一个编程概念&#xff0c;过程类似于函数&#xff0c;只能…

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…

对象图作业

对象图作业 一. 简答题&#xff08;共3题&#xff0c;100分&#xff09; (简答题) 对象特性的三要素是什么&#xff0c;请通过一个实际的例子来说明三要素的内容。 正确答案&#xff1a; 对象特性的三要素是状态、行为和标识。 张三对象具有身高、体重、学历、职务、收入等状态…

Flink 2.0 状态管理存算分离架构演进

Flink 2.0 状态管理存算分离架构演进 flink 现有状态访问线程模型首先简单来说一下,flink2.0做存算分离,最最主要的一点是解决,大状态的问题,例如一个超过50T的物流数据,大状态恢复可能就要1天,所以才有存算分离这么一个设计初衷。 下面先来看一下 任务是怎么执行提交的,…

浅研究下 DHCP 和 chrony

服务程序&#xff1a; 1.如果有默认配置&#xff0c;请先备份&#xff0c;再进行修改 2.修改完配置文件&#xff0c;请重启服务或重新加载配置文件&#xff0c;否则不生效 有些软件&#xff0c;安装包的名字和系统里服务程序的名字不一样&#xff08;安装包名字&#xff1a;…

Springboot+vue学生考试系统

Springbootvue学生考试系统 演示视频 【Springbootvue学生考试系统】 https://www.bilibili.com/video/BV1gk4y1Q7em/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 主要功能&#xff1a; 管理员可以添加题库分配课程教师&#xff0c;指定考试范围指定…

【教3妹学编程-算法题】统计出现过一次的公共字符串

3妹&#xff1a;哈哈哈哈哈哈&#xff0c;太搞笑了~ 呵呵呵呵呵呵 2哥&#xff1a;3妹干嘛呢&#xff0c; 笑的这么魔性&#xff01; 3妹&#xff1a;在看王牌对王牌&#xff0c;老搞笑了 2哥&#xff1a;这季好像没有贾玲吧。 3妹&#xff1a;是啊&#xff0c;听说贾玲去导电影…

仿真验证方法(2)——静态验证

一、静态验证 1.1 概述 在之前的文章中&#xff0c;我们介绍了动态仿真&#xff0c;但是动态仿真用于百万门以上电路时所需时间极长&#xff0c;而且其功能覆盖率取决于所设计的输入激励向量&#xff0c;很难达到100%&#xff0c;因此静态时序分析和等效性检查这样的静态验证是…