热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue2的路由和异步请求

目录1.路由1.1路由的作用1.2使用CLI3创建带路由功能的Vue2项目(案例)(1)创建vue项目(2)选择手动设置

目录

1.路由

   1.1路由的作用

1.2使用CLI3创建带路由功能的Vue2项目(案例)

(1)创建vue项目

 (2)选择手动设置特性(Manually select features)

 (3)添加路由特性选项

 1.3 路由使用入门

1.3.1 项目路由规划

 (1)在index.html页面中导入全局样式(可选)

(2)项目根组件App.vue

1.3.2 路由映射定义

1.3.3 通过路由连接(替代)切换页面内容

2 异步请求

2.1 后端RESTful Web服务和代理

(1)后端RESTful Web服务

 (2)服务的代理

2.2 使用 axois 组件请求后端数据

(1)Promise与fetch API

 (2)axios组件

2.3 axios的使用

(1)为Vue项目添加axios

(2)axios基本用法

(3)axios的拦截器

2.4 在项目中实现请求




1.路由


   1.1路由的作用

在传统的Web应用中个,每个URL对应网站中的一个页面;但在SPA(单页面应用中),由于只有一个页面,如果要实现不同URL在相同页面显示不同的路由,就需要根据URL来跟换Web组件,这需要额外的路由技术来实现。

例如以下三个页面,头部和底部都是相同的,而中间需要根据URL的不同,显示不同的中间组件,这时就需要路由。

 

 


1.2使用CLI3创建带路由功能的Vue2项目(案例)


(1)创建vue项目

vue create funnyshop‐vue2

 (2)选择手动设置特性(Manually select features)


 (3)添加路由特性选项

(4)使用历史模式路由等特性项目特性 


 1.3 路由使用入门


1.3.1 项目路由规划

根据功能结构,我们可以把手机微商界面分割为若干个子组件。

具体子组件功能如下所示


组件名称

功能描述

HeaderPart

网页头部的导航和搜索框

FooterPart

页面底部的导航

ProductList

产品列表

Login

登录

Cart

购物车

ProductDetail

产品详情


 (1)在index.html页面中导入全局样式(可选)





css/base.css">css/page.css">





(2)项目根组件App.vue

在项目根组件中导入公共子组件(header­part、footer­part)和根据路由加载的部分(router­view)


其中不是我们定义的组件,而是vue的路由组件,只是一个占位符,用于显示不同url下所 需要加载的变化部分。


1.3.2 路由映射定义

带router的vue2项目创建后,src目录下会多出一个名为“router.js”的文件,该文件用于定义路由规则, 也就是不同的URL路径下所要加载的Vue子组件对应关系和参数传递规则。

import Vue from 'vue'
import Router from 'vue‐router'
import ProductList from './components/ProductList.vue'
import Login from './components/Login.vue'
import ProductDetail from './components/ProductDetail.vue'
import Cart from './components/Cart.vue'
Vue.use(Router)
export default new Router({mode: 'history',base: process.env.BASE_URL,routes: [{path: '/',name: 'home',component: ProductList},{path: '/product‐list',name: 'product‐list',component: ProductList},{path:'/login',name:'login',component: Login},{path:'/product/:id',name:'product',component: ProductDetail},{path:'/cart',name:'cart',component: Cart},]
})

routes配置中的每一项代表一条路由规则。

path是URL路径,可以定义路径参数(如“/product/:id”中的id);name是路由名称,用于引用; component指定加载的组件名称。

完成组件划分(*.vue)和路由映射(router.js)后,应用就可以根据路由规则显示不同的页面内容了。


1.3.3 通过路由连接(替代)切换页面内容

传统的超链接会使页面发生同步跳转,在SPA应用中只有一张页面,内容的切换全部是异 步方式的。

(1)通过 组件实现“跳转”

router­link是一个路由组件,可以理解为异步的跳转连接标签()

router­link的to属性可以设置切换的URL。to后面可以设置“静态的URL”或者绑定“一个路由项对象”,例 如下面的两个示例,前者设置URL,后者绑定一个定义了的路由对象。

登录
购物车

(2)通过推送路由变更$router.push(),从而实现“跳转”

配置好路由的项目中,我们可以在任意Vue组件内部,通过this.$router访问路由对象,通过 $router.push()方法,我们可以向路由推送跳转,实现组件的切换。

this.$router.push({name:"product‐list", query:{"name":val}});

 1.3.4 路由参数的获取

(1)路径参数与获取 我们在路由映射中(router.js)定义了以下一项:

{ path:'/product/:id', name:'product', component: ProductDetail }

 也就是在跳转到ProductDetail组件时,我们会传入名为id的路径参数。

例如,在产品列表中有以下路由连接,点击后实际的URL可能为 “/product/5”,其中5是id参数。

产品1连接

这时,我们可以在目标组件ProductDetail中,通过 “$route.params.参数名” 获取到路径参数值: 

let id = this.$route.params.id;

(2)查询字符串参数的获取

路径参数是URL路径的一部分,通常只能用于传递必要参数(一定要提供的参数),对于可选参数就应 该使用查询字符串的方式来传递,例如:“search?name=abc&page=101”。

对于查询字符串参数,我们可以通过以下方式传递。 

searchByProductName(e){var val = e.target.value;this.$router.push({name:"product‐list", query:{"name":val}});
}

 上述路由推送会产生类似这样的URL:“product­list?name=xxxx” 这时,我们可以在目标组件ProducList中,通过“$router.query.参数名”获取查询字符串参数值。

let searchName = this.$route.query.name

2 异步请求


2.1 后端RESTful Web服务和代理


(1)后端RESTful Web服务

SPA一般都采用前后端分离的开发方式。后端可以使用任何的服务器端Web技术,诸如JavaEE、 PHP、Node.js、Python等等,后端提供基于RESTful风格的Web服务,接收前端请求并返回JSON格式 的数据。

这里使用基于Spring Boot的MVC技术提供后端服务,具体细节略去,仅在这里描述所提供的服务接 口。


URL

功能

http://localhost:9090/api/products/latest

获取最新的4种产品,返回JSON格式数据

http://localhost:9090/api/products/1

获取id=1的商品明细信息

http://localhost:9090/api/products?name=青瓷

模糊查询名称中包含“青瓷”的产品信息,返回

JSON格式数据

具体请求效果如下图所示。

 


 (2)服务的代理

作为前后端分离的项目,后端和前端往往不是运行在同一个服务器中的。例如上述开发中,后端的 JavaEE服务是运行在Tomcat服务器(Spring Boot内嵌的容器)中的,而前端则是使用Node.js提供的测 试服务器。前者域名为“localhost:9090”,而后者是“localhost:3000”。这时,如果前端通过AJAX技术请 求后端数据,就会遇到Javascript请求不能跨域执行的问题而无法请求。要解决这个问题,要么就需要 使用jsonp协议(跨域JSON协议),要么就要把前后端两个服务器通过代理服务器代理到同一个域名之 下。在实际部署中,我们可以通过Nginx等静态资源服务器实现代理,而在开发中Vue项目可以直接配置 后端代理,把lcoalhost:9090的域名请求代理到localhost:3000域名之下。

在项目根目录下添加 “vue.config.js” 文件,这时vue项目的配置文件,在其中可以设置开发服务器的端 口 “port” 和后端Web服务的代理“proxy”。

module.exports = {devServer: {port: 3000,proxy: {'/api': {target: 'http://localhost:9090', // target host},}}
};

如上所示,当我们请求 “localhost:3000/api/xxx” 时,请求被代理到了 “http://localhost:9090/api/xxx”, 这样前后端就不存在跨域问题了。


2.2 使用 axois 组件请求后端数据


(1)Promise与fetch API

传统的静态网页是通过XMLHttpRequest对象实现对后端数据的异步请求的(例如jQuery的$.ajax),请 求成功后需要执行回调函数。

这种传统的回调在复杂的使用环境中往往会一个接一个的嵌套,让代码陷入难以维护的“Callback地 狱”。新一代的Javascript(ES6),不再建议使用XMLHttpRequest,而是用一种叫Promise的方式组织 代码,让我们不用陷入到回调的连环套中,而是用平面的方式来处理所有回调。新一代的浏览器中都支 持一个名为fetch的API方法,可以实现Promise方式的请求。


 (2)axios组件

fetch API虽然基于Promise已经很好用了,但fetch功能还是过于原始,在实际应用中我们可能还需要一 些拦截器等扩展模块。

为此 vue 的作者推荐我们使用一个名为 axios 的Javascript扩展包来实现后台请 求功能。axios有良好的Promise和拦截器机制。


2.3 axios的使用


axios的详细使用请参考互联网 https://www.npmjs.com/package/axios,这里只是简单介绍。



(1)为Vue项目添加axios

在项目根目录中执行以下Node指令: 

vue add axios

(2)axios基本用法


Method

Api

Get

axios.get(url).then(successCallback).catch(errorHandler)

Post

axios.post(url, data).then(successCallback).catch(errorHandler)

Put

axios.put(url, data).then(successCallback).catch(errorHandler)

Delete

axios.delete(url).then(successCallback).catch(errorHandler)


(3)axios的拦截器

axios可以在(组件的)请求或相应处理的之前插入拦截器,统一处理异步请求中的公共问题。

例如我们可以在react程序入口“index.js”中添加如下代码,统一在请求发出前添加jwt请求头,或者在响 应出错时定位到页面。 

import axios from 'axios';
//请求前处理
axios.interceptors.request.use(config => {const token = window.localStorage.getItem("jwt‐token");if(token)config.headers={'Authorization': 'Bearer '+token};return config;},error=>{return Promise.reject(error);}
);
//响应前处理
axios.interceptors.response.use(response &#61;> {return response;},error &#61;> {const httpCode &#61; error.response.status;if(httpCode>&#61;400 && httpCode<600){window.location.href&#61;"/error";}return Promise.reject(error);}
);

2.4 在项目中实现请求

下面演示了ProductList组件中如何向后端请求商品信息。



推荐阅读
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了解决IE678伪类不兼容问题的方法,包括少用CSS3和HTML5独有的属性,使用CSS hacker,使用last-child清除浮动、批量添加标签、去掉list item最后一个的border-right等技巧。同时还介绍了使用after清除浮动时加上IE独有属性zoom:1的处理方法。另外,本文还提到可以使用jQuery代替批量添加标签的功能,以及使用负边距和CSS2选择器element+element去掉list item最后一个的border-right的方法。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 一、路由首先需要配置路由,就是点击good组件进入goodDetail组件配置路由如下{path:goodDetail,component:goodDetail}同时在good组件中写入如下点击事件,路由中加入 ... [详细]
  • PHP操作MySql数据库_PHP教程:链接数据库$conn@mysql_connect(localhost,root,88888888)ordie(链接错误);解决中文乱码mys ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • php连接mysql显示数据,php连接mysql数据库的算法思想
    本文目录一览:1、怎么用php显示mysql数据表数据 ... [详细]
author-avatar
翔念式的天空_549
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有