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:routerstore,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 = TrueCORS_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_pairurlpatterns = [path('login/', token_obtain_pair),]

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

serializer.py

	from rest_framework_simplejwt.serializers import TokenObtainPairSerializerclass LoginSerializer(TokenObtainPairSerializer):def validate(self, attrs):res = super().validate(attrs)user = self.userdata = {'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_handlerfrom rest_framework.response import Responsedef 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 APIViewfrom rest_framework.response import Responseimport jsonclass 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样式加上看看
在这里插入图片描述

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native 桥接组件封装原生组件属性

自定义属性可以让组件具备更多的灵活性&#xff0c;所以有必要在JS 层通过自定义属性动态传值。 一、添加原生组件属性 因为 ViewManager 管理了整个组件的行为&#xff0c;所以要新增组件属性也需要在这里面&#xff08;如 InfoViewManager&#xff09;进行定义。 1、在Inf…

从DETR到Mask2Former(1):DETR-segmentation结构全解析

网上关于DETR做的detection的解析很多&#xff0c;但是DETR做Segmentation的几乎没有&#xff0c;本文结合DETR的论文与代码&#xff0c;对DETR做一个详细的拆解。理解DETR是理解Mask2Former的基础。 首先得把DETR-segmentation给run起来。Github上DETR的repository&#xff0…

【python入门】day26:统计字符串中出现指定字符的次数

案例 实际上if name“main”:就相当于是 Python 模拟的程序入口 。由于模块之间相互引用&#xff0c;不同模块可能都有这样的定义&#xff0c;而入口程序只能有一个&#xff0c;选中哪个入口程序取决于 ** ** name** **的值。 代码 #-*- coding:utf-8 -*- #开发时间&#xff…

SQL-分页查询and语句执行顺序

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Pytest插件pytest-cov:优雅管理测试覆盖率

在软件开发中&#xff0c;测试覆盖率是评估测试质量的关键指标之一。为了更方便地统计和管理测试覆盖率&#xff0c;Pytest插件"pytest-cov"应运而生。本文将介绍"pytest-cov"的基本用法和优雅管理测试覆盖率的方法。 什么是pytest-cov? pytest-cov 是Pyt…

Docker数据卷与拦截与目录拦截

目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中&#xff0c;数据卷挂载和目录挂载是两种常见的挂载方式&…

【Python机器学习】SVM——调参

下面是支持向量机一个二维二分类数据集的训练结果&#xff1a; import mglearn import matplotlib.pyplot as plt from sklearn.svm import SVCplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False X,ymglearn.tools.make_handcrafted_dataset()…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

笔试面试题——继承和组合

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;二、什么是菱形虚拟继承&am…

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;Link&#xff09;所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

记录一下误删除libc.so.6的经历

起因&#xff1a; 在配置环境时&#xff0c;出现’GLIBCXX_3.4.29 not found’的错误&#xff0c;在解决这个问题的过程中&#xff0c;需要删除sudo rm /usr/lib/x86_64-linux-gnu/libstdc.so.6软连接&#xff0c;但是一不小心sudo rm /lib/x86_64-linux-gpu/libc.so.6&#xf…

使用主题模型和古老的人类推理进行无监督文本分类

一、说明 我在日常工作中不断遇到的一项挑战是在无法访问黄金标准标签的情况下标记文本数据。这绝不是一项微不足道的任务&#xff0c;在本文中&#xff0c;我将向您展示一种相对准确地完成此任务的方法&#xff0c;同时保持管道的可解释性和易于调整。 一些读者可能已经开始考…

docker-compose一键搭建zookeeper集群

1、setup.sh setup.sh脚本用来创建本地文件夹&#xff0c;这些文件夹会被挂载到docker容器。 #!/bin/bashmkdir -p "$PWD\zoo1\data" mkdir -p "$PWD\zoo1\datalog"mkdir -p "$PWD\zoo2\data" mkdir -p "$PWD\zoo2\datalog"mkdir -p…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要 英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决&#xff08;涉及numpy、scipy、torchvision等&#xff09;以及直观体验使用Yolov8目标检测的过程&#xff08;CLI命令行操作、无需代码&#xff09;-CSDN博客和YOLOv8_测试yolov8n.pt&#xff0c;yolov8m.pt训…

[C#]winform部署yolov5-onnx模型

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5&#xff0c;全称为You Only Look Once version 5&#xff0c;是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发&#xff0c;并因其简洁高效的特点而备受关注。Yol…

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

使用递归将list转换成tree

在产品研发时遇到这样一个问题&#xff0c;对于省市区县这类三级联动的数据&#xff0c;前端插件需要一次把数据全部返回&#xff0c;单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回&#xff0c;前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…

软件测试|解读Python的requirements.txt文件:管理项目依赖的完整指南

简介 在Python项目中&#xff0c;管理依赖库是必不可少的。requirements.txt文件是一种常用的方式&#xff0c;用于列出项目所需的所有依赖库及其版本。本文将详细介绍requirements.txt的用法&#xff0c;帮助你更好地管理项目的依赖。 使用步骤 创建requirements.txt文件&am…