前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库

文章目录

  • Ajax
    • Ajax特点
  • Promise 异步编程(缺)
    • Promise基本使用
      • 状态 - PromiseState
      • 结果 - PromiseResult
  • Axios
    • Vue中使用Axios
    • Axios请求方式
      • get
      • post
      • put和patch
      • delete
      • 并发请求
  • Vue路由 - vue-router
    • 单页面Web应用(single page web application,SPA)
    • vue-router基本使用
      • 路由使用注意点
      • 嵌套 / 多级 路由 - children
      • 路径传参 - query
      • 命名路由
      • 路由的params参数
      • props接收参数
      • router-link的replace模式
    • 编程式路由跳转
    • 缓存路由组件
    • 路由组件相关的生命周期钩子 - activated() & deactivated()
    • 路由守卫(拦截器)
      • 全局前置路由守卫 - beforeEach()
      • 路由元信息 - meta
      • 全局后置路由守卫 - afterEach()
      • 独享路由守卫 - beforeEnter
      • 组件内路由守卫钩子 - beforeRouteEnter() & beforeRouteLeave()
    • 路由器的 history与hash 工作模式
  • UI组件库
    • Element-UI

Ajax

AJAX: 全称Asynchronous JavaScript And XML,即异步JS和XML。

通过AJAX可以在浏览器中向服务器发送异步请求,它最大的优势在于无刷新的获取数据。

Ajax不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。以前Ajax是用XML格式的字符串进行数据交换,现在已经被JSON取代了。

前端原生JS发送get网络请求示例:
在这里插入图片描述

Ajax特点

优点:

  • 可以无需刷新页面,与服务器进行通信
  • 允许依据用户事件来更新部分页面内容

缺点:

  • 没有浏览历史,不能回退
  • 存在跨域问题(同源策略限制)
  • SEO不友好(搜索引擎优化,对爬虫不友好)

Promise 异步编程(缺)

Promise是ES6的异步编程解决方案,从语法上说,Promise是一个构造函数,从功能上说,Promise对象用于封装一个异步操作,并可以获取其成功 / 失败的结果值。

在引入Promise之前,异步编程一般使用回调函数实现:

  1. List item

在这里插入图片描述
使用Promise异步编程的好处在于:

  • 1、指定的回调的方式更加灵活:不需要在启动任务前就准备好回调函数。Promise: 启动异步任务 =》返回promise对象 =》 给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
  • 2、支持链式调用,可以解决回调地狱(异步任务嵌套异步任务,可能导致回调地狱)带来的编程混乱与异常处理麻烦的问题。

Promise基本使用

  • step1:构建Promise对象,该对象接受一个函数类型的参数。函数有两个函数类型的参数resolve(异步任务解决),reject(异步任务被拒绝)。函数体是异步任务。

  • step2:调用then方法,给promise对象绑定成功回调和失败时的回调。step1中可以给resolve()或者reject()指定参数,在then方法中可以接收该参数。

在这里插入图片描述

状态 - PromiseState

PromiseState是promise实例对象上的一个属性。
一个promise对象初始的状态为pending(待定),pending根据异步任务是否执行成功,会转为resolved(解决)或者rejected(拒绝),只有这2种,且一个promise对象只能改变一次!!!

resolved()与rejected()都可以携带结果数据,一般:

  • resolved()结果数据称为value
  • rejected()结果数据称为reason

结果 - PromiseResult

PromiseResult是Promise实例对象上另外一个属性,保存着Promise对象成功 / 失败的结果。resolved()与rejected()可以更改该属性的内容。

Axios

Axios是一个基于Promise封装的http客户端,可以在浏览器中发送AJAX请求,或者在Node.js中发送http请求。

Vue中使用Axios

step1:安装及引入

 npm install axios

在vue项目的main.js文件中引入axios:

import axios from 'axios'
Vue.prototype.$axios = axios

step2:在组件中使用axios:

<script>
	export default {
		mounted(){
			this.$axios.get('/goods.json').then(res=>{
				console.log(res.data);
			})
		}
	}
</script>

Axios请求方式

  • get:获取数据,请求指定的信息,返回实体对象
  • post:向指定资源提交数据(例如表单提交或文件上传)
  • put:更新数据,从客户端向服务器传送的数据取代指定的文档的内容
  • patch:更新数据,是对put方法的补充,用来对已知资源进行局部更新
  • delete:请求服务器删除指定的数据

get

法一:

 //请求格式类似于 http://localhost:8080/goods.json?id=1
this.$axios.get('/goods.json',{
    			params: {
                    id:1
                }
			}).then(res=>{
					console.log(res.data);
				},err=>{
					console.log(err);
			})

法二:

this.$axios({
		method: 'get',
		url: '/goods.json',
    	params: {
            id:1
        }
	}).then(res=>{
		console.log(res.data);
	},err=>{
		console.log(err);
	})

post

post请求一般分为两种类型

1.form-data 表单提交,图片上传、文件上传时用该类型比较多
2. application/json 一般是用于 ajax 异步请求

法一

this.$axios.post('/url',{
				id:1
			}).then(res=>{
				console.log(res.data);
			},err=>{
				console.log(err);
			})

法二

$axios({
	method: 'post',
	url: '/url',
	data: {
		id:1
	}
}).then(res=>{
	console.log(res.data);
},err=>{
	console.log(err);
})

form-data请求:

let data = {
	//请求参数
}

let formdata = new FormData();
for(let key in data){
	formdata.append(key,data[key]);
}

this.$axios.post('/goods.json',formdata).then(res=>{
	console.log(res.data);
},err=>{
	console.log(err);
})

put和patch

this.$axios.put('/url',{
				id:1
			}).then(res=>{
				console.log(res.data);
			})
this.$axios.patch('/url',{
				id:1
			}).then(res=>{
				console.log(res.data);
			})

delete

this.$axios.delete('/url',{
				params: {
					id:1
				}
			}).then(res=>{
				console.log(res.data);
			})

this.$axios.delete('/url',{
				data: {
					id:1
				}
			}).then(res=>{
				console.log(res.data);
			})

//方法二
axios({
    method: 'delete',
    url: '/url',
    params: { id:1 }, //以明文方式提交参数
    data: { id:1 } //以封装对象方式提交参数
}).then(res=>{
	console.log(res.data);
})

并发请求

同时进行多个请求,并统一处理返回值

 this.$axios.all([
	this.$axios.get('/goods.json'),
	this.$axios.get('/classify.json')
]).then(
	this.$axios.spread((goodsRes,classifyRes)=>{
		console.log(goodsRes.data);
		console.log(classifyRes.data);
	})
)

Vue路由 - vue-router

路由就是一组key - value对应关系,多个路由需要经过路由器的管理。

单页面Web应用(single page web application,SPA)

单页面Web应用(single page web application,SPA),整个页面只有一个完整的页面,点击页面中的导航链路,不会刷新页面,只会做页面的局部更新,数据需要通过Ajax请求获取。
在这里插入图片描述

vue-router基本使用

step1:安装vue-router插件
与vuex一样,在vue2中应该使用vue-router3版本,在vue3中才应该使用最新的vue4版本。

npm i vue-router@3

step2:创建路由器模块,构建路由器实例。
在路由器配置时,将路由与Vue组件进行了绑定。
在这里插入图片描述
在main.js中引入路由器实例,并配置给Vue实例。
在这里插入图片描述
step3:在Vue中借助router-link标签实现路由的切换,路由仅仅将vue组件与路由位置进行了绑定,但是vue呈现在何处,需要借助router-view标签,指定路由组件呈现的位置,类似于插槽标签slot

使用active-class可以绑定当路由选中时的样式style,使用to用于绑定路由名。
在这里插入图片描述

路由使用注意点

1、路由组件通常放置在pages文件夹,一般组件通常放在component文件夹,所谓路由组件就是在路由器中与路由名称绑定的组件。
2、通过路由的切换,当前展示的路由组件被销毁,随后挂载目标路由组件。
3、每个路由组件(本质上也是一个VueComponent)上会多出两个属性$route$router

  • $route:存储着组件的路由信息,是每个组件独有的。
  • $router:整个应用只有一个router。

嵌套 / 多级 路由 - children

在这里插入图片描述

一级路由可以使用children属性配置二级路由,注意二级路由配置时不再需要加/
在这里插入图片描述
一级路由的组件中,使用router-link 标签绑定路由时,需要携带上父级路由,即需要完整路径。

在这里插入图片描述

路径传参 - query

在路由跳转的路径后边通过?跟随简单参数传递,多个参数之间使用&分隔。
注意:
下边的写法为了引用该组件中的数据,使用:绑定to属性,表明右边是一个js表达式,使用反引号,引用字符串,使用${参数名}进行转译。

在这里插入图片描述
当然,上边传参结构比较混乱,使用:绑定to属性,也可以传递一个对象,在对象写法中,path属性指定路由名,`query属性,指定传参内容。

在这里插入图片描述
所传递的参数,会放在路由组件的$route.query中:
$route.query.id
$route.query.title

命名路由

当路由层级较多时,路径名不可避免变长,使得路由绑定变的复杂,使用命名路由,可以给路由起别名,简化路由绑定。

在这里插入图片描述
使用:
在这里插入图片描述
当路径过长时,使用这种写法才合适。

路由的params参数

params参数与query参数非常类似,都是将参数放在在路由的路径末尾,但query使用&分割多个参数键值对,而params采用虚拟多级路由的形式传参,末尾的路由名每一级实际上对应一个参数。

params传参效果:
在这里插入图片描述
step1:配置path虚拟路由,虚拟层次使用:绑定参数名,占位。

在这里插入图片描述
step2:使用router-link标签的params属性,绑定参数

在这里插入图片描述
需要注意的是:在对象写法中,要使用params属性,路由属性必须使用name绑定,不可使用path!!!否则解析是会失败的!

step3:所传递的参数,会放在路由组件的$route.params中:
$route.params.id
$route.params.title

props接收参数

step1:路由配置时,写好对应组件需要接收的参数,有3种方式:

在这里插入图片描述

step2:在对应的vue组件使用props属性接收:
在这里插入图片描述

router-link的replace模式

浏览器的历史记录有两种写入模式,分别为pushreplace

  • push:向路由记录栈中压入一个路由记录
  • replace:替换路由记录栈中栈顶记录

默认是push模式,如果要使用replace模式,直接在router-link标签属性上,标注replace

<router-link replace ^^^ > News </router-link>

编程式路由跳转

不借助< router-link >标签,直接通过编程,借助$router实现路由跳转。

有两种模式,push和replace,入参就是< router-link >标签绑定的选项属性。

在这里插入图片描述
$router除了push和replace,还有3个API:

  • back()
  • forward()
  • go(val),val如果是正数,前进val个,负数,后退val个。

在这里插入图片描述

缓存路由组件

路由跳转时,不展示的组件将被销毁,但有时,这些组件可能有用户输入信息,不想让它被销毁,可以使用 < keep-alive >标签,缓存路由组件,使其不被销毁。
< keep-alive >使用include属性,指定待缓存组件名,该标签应用包裹待缓存组件的占位标签< router-view >

在这里插入图片描述

路由组件相关的生命周期钩子 - activated() & deactivated()

缓存路由组件后,切换时,路由组件不会被销毁,那么怎么感知这个切换呢?

可以使用两个新的生命周期钩子函数activated(激活)和deactivated(失活)。
在这里插入图片描述

路由守卫(拦截器)

路由守卫的作用是为访问某个路由提供权限限制,类似于拦截器。

全局前置路由守卫 - beforeEach()

全局前置路由守卫:初始化时被调用,且在每次路由切换前进行路由拦截。

使用router路由器实例的beforeEach()方法,有三个参数:

  • to:目标路由
  • from:当前路由
  • next():放行到下一个

每次路由切换前进行路由拦截,写逻辑判断权限与拦截。
在这里插入图片描述

路由元信息 - meta

每个路由$route上有一个名为meta的属性,用于放置关于该路由的信息,称为路由元信息。
在这里插入图片描述
step1:配置路由时,给需要鉴权的路由配置meta属性:
在这里插入图片描述
step2:在使用路由守卫时,根据目标路由的meta属性来判断。
在这里插入图片描述

全局后置路由守卫 - afterEach()

后置路由守卫:在初始化的时候,每次路由切换之后被调用。

后置路由守卫的作用,不是用于拦截路由,此时已经完成了路由跳转,这个地方通常做一些路由跳转后的初始化动作。

独享路由守卫 - beforeEnter

只针对某一个路由,可以在配置路由时,使用beforeEnter属性,对其进行拦截守卫。

独享路由守卫与全局路由守卫是兼容使用的。
在这里插入图片描述

组件内路由守卫钩子 - beforeRouteEnter() & beforeRouteLeave()

beforeRouteEnter():当进入该路由组件前调用。
beforeRouteLeave():当离开该路由组件前调用

在这里插入图片描述

路由器的 history与hash 工作模式

在这里插入图片描述

UI组件库

在这里插入图片描述

Element-UI

Element-UI本质也是一个插件。
安装:

npm i element-ui

在这里插入图片描述

实际开发中,我们应该按需使用element-ui组件和样式。
element-ui官网

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

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

相关文章

如何确定短线的买入卖出时机?

短线投资制胜的一个关键能力&#xff0c;就是精准地找到买入卖出时机。那么&#xff0c;怎么样才能获得这种关键能力呢&#xff1f; 在这节课里&#xff0c;我们将给大家梳理一下常见的短线买入卖出时机&#xff0c;并通过案例讲解帮助大家理解。话不多说&#xff0c;赶紧进入主…

Redis高效缓存:加速应用性能的利器

目录 引言 1. Redis概述 1.1 什么是Redis&#xff1f; 1.2 Redis的特点 2. Redis在缓存中的应用 2.1 缓存的重要性 2.2 Redis作为缓存的优势 2.3 缓存使用场景 3. Redis在实时应用中的应用 3.1 实时数据处理的挑战 3.2 Redis的实时数据处理优势 3.3 实时应用中的Red…

半监督节点分类上的HyperGCN

1.Title HyperGCN: Hypergraph Convolutional Networks for Semi-Supervised Classification&#xff08;Naganand Yadati、Prateek Yadav、Madhav Nimishakavi、Anand Louis、Partha Talukdar&#xff09;【ACM Transactions on Knowledge Discovery from Data 2022】 2.Conc…

canvas基础:绘制贝塞尔曲线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 bez…

持续集成交付CICD:CentOS 7 安装 Sonarqube9.6

目录 一、实验 1.CentOS 7 安装 Sonarqube9.6 二、问题 1.安装postgresql13服务端报错 2.postgresql13创建用户报错 一、实验 1.CentOS 7 安装 Sonarqube9.6 &#xff08;1&#xff09;下载软件及依赖包 ①Sonarqube9.6下载地址 https://binaries.sonarsource.com/Dis…

【Go语言反射reflect】

Go语言反射reflect 一、引入 先看官方Doc中Rob Pike给出的关于反射的定义&#xff1a; Reflection in computing is the ability of a program to examine its own structure, particularly through types; it’s a form of metaprogramming. It’s also a great source of …

STM32F407-14.3.8-01强制输出模式

强制输出模式 在输出模式&#xff08;TIMx_CCMRx 寄存器中的 CCxS② 位 00&#xff09;下&#xff0c;可直接由软件将每个输出比较信号&#xff08;OCxREF④ 和 OCx⑥/OCxN⑦&#xff09;强制设置为有效电平或无效电平&#xff0c;而无需考虑输出比较寄存器和计数器之间的任何…

【开源】基于JAVA语言的桃花峪滑雪场租赁系统

项目编号&#xff1a; S 036 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S036&#xff0c;文末获取源码。} 项目编号&#xff1a;S036&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…

【Element-ui】Checkbox 多选框 与 Input 输入框

文章目录 前言一、Checkbox 多选框1.1 基础用法1.2 禁用状态1.3 多选框组1.4 indeterminate 状态1.5 可选项目数量的限制1.6 按钮样式1.7 带有边框1.8 Checkbox Events1.9 Checkbox Attributes 二、Input 输入框2.1 基础用法2.2 禁用状态2.3 可清空2.4 密码框2.5 带 icon 的输入…

常用数据预处理方法 python

常用数据预处理方法 数据清洗缺失值处理示例删除缺失值插值法填充缺失值 异常值处理示例删除异常值替换异常值 数据类型转换示例数据类型转换在数据清洗过程中非常常见 重复值处理示例处理重复值是数据清洗的重要步骤 数据转换示例 数据集成示例数据集成是将多个数据源合并为一…

Deckerfile

1.简介 dockerfile 是 docker 镜像构建文件。包含用于构建 docker 镜像的指令和配置。通过Dockerfile可以自动化地构建Docker镜像&#xff0c;实现快速、一致和可重复的部署。是由一条条构建镜像所需的指令和参数构成的脚本。指令按照从上到下&#xff0c;顺序执行&#xff0c…

jvm基本概念,运行的原理,架构图

文章目录 JVM(1) 基本概念:&#xff08;2&#xff09;运行过程 今天来和大家聊聊jvm&#xff0c; JVM (1) 基本概念: JVM 是可运行Java代码的假想计算机&#xff0c;包括一套字节码指令集、一组寄存器、一个栈一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作…

浅谈安科瑞AISD300系列智能三相安全配电装置的设计与应用-安科瑞 蒋静

1 概述 AISD300系列三相智能安全配电装置是安科瑞专为低压配电侧开发的一款智能安全配电产品&#xff0c;本产品主要针对低压配电系统人身触电、线路老化、短路、漏电等原因引起电气安全问题而设计。 产品主要应用于学校、加油站、医院、银行、疗养院、康复中心、敬老院、酒店…

如何从买卖委托单洞悉主力意图?

通过分析股票的买卖委托单、换手率、涨跌速度和振幅等信息&#xff0c;能够帮助我们很好地发现主力的意图。今天&#xff0c;咱们就给大家讲讲应该如何通过分析五档买卖洞悉主力意图。下节课&#xff0c;我们再讲讲如何从换手率出发洞悉主力意图。 废话不多说&#xff0c;直接进…

docker容器内部文件挂载主机

docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…

神经网络 模型表示(一)

神经网络 模型表示 模型表示一 为了构建神经网络模型&#xff0c;我们需要首先思考大脑中的神经网络是怎样的&#xff1f;每一个神经元都可以被认为是一个处理单元/神经核&#xff08;processing unit/Nucleus&#xff09;&#xff0c;它含有许多输入/树突&#xff08;input/…

基于卷积神经网络的肺炎影像分类分割智能诊断系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 肺炎是一种常见的呼吸系统感染疾病&#xff0c;其主要病因包括细菌、病毒和真菌等。肺炎的早期诊断对于患者的治疗和预后至关重要。传统的肺炎诊断方…

HttpRunner的测试用例分层机制

测试用例分层介绍&#xff1a; 在接口自动化测试维护过程中&#xff0c;由于测试用例的增加和需求变更导致测试用例的调整&#xff0c;使自动化测试用例的维护非常麻烦&#xff0c;直接关系到自动化测试能否持续有效地在项目中开展。 概括来说&#xff0c;测试用例分层机制的核…

字符函数 和 字符串函数

今天我打算介绍一些字符函数和字符串函数&#xff0c;有一些字符串函数我实现了模拟&#xff0c;但文章中没有放出来&#xff0c;如果需要的欢迎来到我的gitee里面拿取&#xff08;在test.c11-23里面&#xff09; 这是我的gitee:小汐 (lhysxx) - Gitee.com 字符函数 1. islow…

oj赛氪算法练习

单词翻转 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String sentence scanner.nextLine();String[] words sentence.split(" ");for (String word : words) {StringBuilder …