MVC是应用最广泛的软件架构之一,一般MVC
分为:
Model( 模型 )
、Controller( 控制器 )
、View( 视图 )
。
这主要是基于分层的目的,让彼此的职责分开。View
一般通过 Controller
来和 Model
进行联系。Controller
是 Model
和 View
的协调者,View
和Model
不直接联系。基本联系都是单向的。
1、View 传送指令到 Controller
2、Controller 完成业务逻辑后,要求 Model 改变状态
3、Model 将新的数据发送到 View,用户得到反馈
MVP:
MVP 模式将 Controller 改名为 Presenter
,同时改变了通信方向。
1、各部分之间的通信,都是双向的。
2、View 与 Model 不发生联系,都通过 Presenter 传递。
3、View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
MVVM
MVVM
是把 MVC
的 Controller
和 MVP
的 Presenter
改成了 ViewModel
。
View
的变化会自动更新到 ViewModel
,ViewModel
的变化也会自动同步到 View
上显示。这种自动同步是因为 ViewModel
中的属性实现了 Observer
,当属性变更时都能触发对应的操作。
MVVM模式的优点:
1、低耦合:
视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
2、可重用性:
你可以把一些视图逻辑放在一个ViewModel里面,让很多 view 重用这段视图逻辑。
3、独立开发:
开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
4、可测试:
界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。
MVVM 和 MVC 的区别:
mvc
和 mvvm
其实区别并不大。都是一种设计思想。
主要区别
mvc 中 Controller演变成 mvvm 中的 viewModel,
mvvm 通过数据来显示视图层而不是节点操作。
mvvm主要解决了: mvc中大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。
实现数据绑定的做法有大致如下几种:
发布者-订阅者模式(backbone.js)
脏值检查(angular.js)
数据劫持(vue.js)
1、发布者-订阅者模式:
一般通过sub
, pub
的方式实现数据和视图的绑定监听,
更新数据方式通常做法是 vm.set('property', value)
。
这种方式现在毕竟太low了,我们更希望通过 vm.property = value
这种方式更新数据,同时自动更新视图,于是有了下面两种方式。
2、脏值检查:
angular.js 是通过脏值检测的方式比对数据是否有变更,来决定是否更新视图,
最简单的方式就是通过 setInterval() 定时轮询检测数据变动,
angular只有在指定的事件触发时进入脏值检测,大致如下:
1、DOM事件,譬如用户输入文本,点击按钮等。( ng-click )
2、XHR响应事件 ( $http )
3、浏览器Location变更事件 ( $location )
4、Timer事件( $timeout , $interval )
5、执行 $digest() 或 $apply()
3、数据劫持:
vue.js 则是采用数据劫持
结合发布者-订阅者
模式的方式,
通过Object.defineProperty()
来劫持各个属性的setter
,getter
,
在数据变动时发布消息给订阅者,触发相应的监听回调。
Object.defineProperty() 方法`会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法:
Object.defineProperty(obj, prop, descriptor)
参数说明:
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
返回值:
传入函数的对象。即第一个参数obj
针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for…in或Object.keys()遍历。
给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述。
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载呢,只是一个空壳,无法访问到数据和真实的dom,一般不做操作
挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取
接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情…
当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染,一般不做什么事儿
当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的虚拟dom
经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等,组件的数据绑定、监听…去掉后只剩下dom空壳,这个时候,执行destroyed,在这里做善后工作也可以
如果觉得上面的太长,也可以如下回答:
总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
创建前/后: 在beforeCreated阶段,vue实例的挂载元素el还没有。在created阶段,vue实例的数据对象data有了,el还没有.
载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
更新前/后:当data变化时,会触发beforeUpdate和updated方法。
销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在
生命周期中有多个事件钩子,让我们在控制整个 vue 实例的过程时更容易形成好的逻辑
第一次加载会触发 beforeCreate、created、beforeMount、mounted
生命周期钩子的一些使用方法:
beforecreate : 可以在这加个loading事件,在加载实例时触发
created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用
mounted : 挂载元素,获取到DOM节点 updated : 如果对数据统一处理,在这里写上相应函数
beforeDestroy : 可以做一个确认停止事件的确认框 nextTick : 更新数据后立即操作dom
created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。
看实际情况,一般在 created(或beforeRouter) 里面就可以,如果涉及到需要页面加载完成之后的话就用 mounted。
在created的时候,视图中的html并没有渲染出来,所以此时如果直接去操作html的dom节点,一定找不到相关的元素
而在mounted中,由于此时html已经渲染出来了,所以可以直接操作dom节点,(此时document.getelementById 即可生效了)
“Vue路由就是指vue-router,其中router是指根据url分配到对应的处理程序,所以说路由就是用来解析URL以及调用对应的控制器并返回从视图对象中提取好的网页代码给web服务器,最终返回给客户端。
优点:
缺点:
Vue的路由实现:hash模式 和 history模式
hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取;
特点:
history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。
特点:
定义动态路由:
获取动态路由传过来的值:
params.id
获取//全局获取动态路由传递过来的值
$route.params.id
//局部或者是在方法内获取
this.$route.params.id
vue-router 的导航钩子,主要用来作用是拦截导航,让他完成跳转或取消。
全局的
单个路由独享的
组件级的
vue-router全局有三个守卫:
组件内的守卫:
to,from,next 这三个参数:
我们可以这样跳转:next(‘path地址’)或者next({path:’’})或者next({name:’’})
且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及你用在router-link或router.push的对象选项。
三种:
接收:
query使用path和name传参跳转都可以,而params只能使用name传参跳转。
传参跳转页面时,query不需要再路由上配参数就能在新的页面获取到参数,params也可以不用配,但是params不在路由配参数的话,当用户刷新当前页面的时候,参数就会消失。
也就是说使用params不在路由配参数跳转,只有第一次进入页面参数有效,刷新页面参数就会消失。
异步组件
和 Webpack 的代码分割
功能,轻松实现路由组件的懒加载。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
我的个人理解是vuex其实就是一个管理数据的工具,通过vuex我们可以解决组件之间数据共享的问题,后期也方便我们管理以及维护
优点:
缺点:
每个Vuex应用的本质是store(仓库),包含应用中大部分的状态。
state, getters,mutations,actions,module
安装vuex
在src目录下创建store文件夹,在该文件夹内创建index.js
在store文件夹内的index.js文件内引入vuex
然后在引入vue
调用Vue.use()方法注册vuex
对vuex进行实例化
进行实例化之后通过export default导出
在main.js文件内引入store文件夹内的index.js文件
挂载到new Vue实例上面
初始化vuex的状态和属性
在vue组件里面,通过dispatch来触发actions提交修改数据的操作。
然后再通过actions的commit来触发mutations来修改数据。
mutations接收到commit的请求,就会自动通过Mutate来修改state(数据中心里面的数据状态)里面的数据。
最后由store触发每一个调用它的组件的更新
actions去异步的改变state的状态,mutations是同步改变状态,调用actions内定义的方法,需要通过this. s t o r e . d i s p a t c h ( ) , m u t a t i o n s 方 法 是 通 过 t h i s . store.dispatch(),mutations方法是通过this. store.dispatch(),mutations方法是通过this.store.commit()来进行调用,而在actions要调用mutations的方法,通过commit来进行调用
localStorage 或者就是sessionStorage ,或者借用辅助插vuex-persistedstate
通过$watch监听mutation的commit函数中_committing是否为true
vue组件的通信是为了解决组件之间数据传递的问题,分为
父子组件之间的通信
非父子组件的通信
$emit
向父组件触发一个事件,父组件监听这个事件就行了 路由,vuex,本地存储
v-if
和 v-show
都是动态显示DOM元素。编译过程:
v-if 是 真正 的 条件渲染,因为它会确保在切换过程中条件块内的事件监听器
和子组件
适当地被销毁
和重建
。v-show
的元素始终会
被渲染并保留在 DOM 中
。v-show
只是简单地切换
元素的 CSS 属性display
。编译条件:
v-if 是惰性的:如果在初始渲染时条件为假,则什么也不做。直到条件第一次变为真时,才会开始渲染条件块。v-show
不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换v-if有更高的切换消耗。v-show有更高的
初始渲染消耗`。应用场景:
v-if适合运行时条件很少改变时使用。v-show适合频繁切换keep-alive:
主要用于保留组件状态
或避免重新渲染
。列表页面
和一个 详情页面
,那么用户就会经常执行打开详情=>返回列表=>打开详情
这样的话 列表 和 详情 都是一个频率很高
的页面,那么就可以对列表组件
使用``进行缓存,这样用户每次返回列表
的时候,都能从缓存中快速渲染
,而不是重新渲染
ref
v-if:根据表达式的值的真假条件渲染元素,在切换时元素及它的数据绑定/组件被销毁并重建。v-if 控制元素的渲染 v-if 为假 该元素不会创建
v-show:根据表达式之真假值,切换元素的display CSS 属性。 可以控制元素的显示隐藏通过display none
v-for:循环指令,基于一个数组或对象渲染一个列表,Vue 2.0 以上必须需配合key值使用。绑定一个 标签 循环一个数据源 数组 表格 数字 字符串
v-bind:动态地绑定一个或多个特性,或一个组件prop到表达式。 属性后面跟的是固定字符串 作用:属性绑定可以让属性后面 跟变量或者表达式
v-on:用于监听指定元素的DOM事件,比如点击事件。绑定事件监听器。 事件名=‘事件处理函数’ 事件名和原生JS一样
v-model:实现表单输入和应用状态之间的双向绑定。 相当于事件绑定v-on和属性绑定v-bind的综合(集合体)
v-pre:跳过这个元素和它的子元素的编译过程。可以用来显示原始Mustache标签。跳过大量没有指令的节点会加快编译。
v-once:只渲染元素和组件一次,随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
Vue
会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做使 Vue 变得非常快,但是这样也不总是符合实际需求。什么是axios?
axios一般什么时候用?
使用场景?
使用的时候遇到过什么问题?
点击跳转查看
https://www.jianshu.com/p/8388650ff8fa
就是主张最少,可以只用一部分功能,而不必使用全部,而且可以跟其他框架结合使用,
没有多做职责之外的事
点击跳转
https://blog.csdn.net/weixin_43663775/article/details/109559194
自己总结
jquery是直接操作DOM的而vue是操作数据的
vue做到了数据和视图完全分离,他首先把值和JS对象进行绑定,然后在修改JS对象的值,vue框架就会自动把DOM的值进行更新,对数据进行操作不在需要引用相应的DOM对象,他们通过Vue对象实现数据和视图的相互绑定
jquery则是先使用选择器($)来选取Dom对象,然后对Dom对象进行操作(如赋值丶取值丶事件绑定等)
Tip: built files are meant to be served over an HTTP server.
Opening index.html over file:// won't work.
第一次打包出现这句话 我以为是啥报错 原来并不是这样的 这个其实 就是个 提示而已
其实 这句话 是告诉 我们 vue打包过后 需要放在服务端 才能预览 打开 如果不放在 服务端 不能正常运行的
如果你想正常打开 运行 可以这样操作
在你 打包 npm run build 完成 之后 直接输入 npm install -g http-server 安装过后 就可以打开了 打包后的 vue项目了 项目中 使用了 接口 可能数据访问不了 但是 页面可以正常打开
React 和Vue是现在主流的两个框架(相对来说angular用的已经少了)
两者的区别体现在以下方面
1、react和vue都支持服务端渲染
2、都有虚拟DOM,组件化开发,通过props传参进行父子组件数据的传递
3、都是数据驱动视图
4、都有支持native的方案(react的react native,vue的weex)
5、都有状态管理(react有redux,vue有vuex)
1、react严格上只能算是MVC的view层,vue则是MVVM模式
2、虚拟DOM不一样,vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树
而对于react而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldComponentUpdate这个生命周期函数方法来进行控制
3、组件写法不一样,react推荐的做法是JSX+inline style,也就是把HTML和CSS全都写进javaScript了
4、数据绑定:vue实现了数据的双向绑定,react数据流动是单向的
5、state对象在react应用中是不可变的,需要使用setState方法更新状态
在vue中,state对象不是必须的,数据有data属性在vue对象中管理
记 vue-cli项目首页加载速度慢的有效优化
1.影响加载速度的原因
2.分析文件大的原因
利用webpack-bundle-analyzer 分析器,分析项目依赖关系
3.项目依赖优化
3.1 依赖优化之 CDN 加速
3.2 依赖优化之 webpack dllplugin
4. gzip暴力压缩
nginx开启 gzip 模式
vue开启 gzip
点击下方链接跳转阅读
https://www.zhihu.com/question/37548226?sort=created
为什么要封装 vue 组件?
组件可以提升整个项目的开发效率,能够把页面抽象成多个相对独立的模块,解决了我们传统项项目开发:效率低,难维护,复用性等问题。
怎么封装?
使用 vue.extend 方法创建一个组件,然后使用 vue.component 方法注册组件;子组件需要数据,可以在 props 中接受定义,子组件修改好数据后,采用 emit 传递给父组件。
点击下方链接
https://blog.csdn.net/tangxiujiang/article/details/79620542
点击下方链接跳转
https://blog.csdn.net/Misnice/article/details/103850219?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160527879619725266960577%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160527879619725266960577&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-103850219.pc_first_rank_v2_rank_v28&utm_term=vue%E5%B8%B8%E7%94%A8%E7%9A%84ui%E7%BB%84%E4%BB%B6%E5%BA%93%E6%9C%89%E5%93%AA%E4%BA%9B&spm=1018.2118.3001.4449
.lazy
v-modeil输入框改变,这个数据就会改变,lazy这个修饰符会在光标离开input框才会更新数据
<input type="text" v-model.trim="value">
1.number
先输入数字就会限制输入只能是数字,先字符串就相当于没有加number,注意,不是输入框不能输入字符串,是这个数据是数字
<input type="text" v-model.number="value">
1.stop> 阻止事件冒泡,相当于调用了event.stopPropagation()方法
<button @click.stop="test">test</button>
1.prevent
阻止默认行为,相当于调用了event.preventDefault()方法,比如表单的提交、a标签的跳转就是默认事件
<a @click.prevent="test">test</a>
1.self
只有元素本身触发时才触发方法,就是只有点击元素本身才会触发。比如一个div里面有个按钮,div和按钮都有事件,我们点击按钮,div绑定的方法也会触发,如果div的click加上self,只有点击到div的时候才会触发,变相的算是阻止冒泡
<div @click.self="test"></div>
1.once
只能用一次,无论点击几次,执行一次之后都不会再执行:
<div @click.once="test"></div>
1.capture
事件的完整机制是捕获-目标-冒泡,事件触发是目标往外冒泡
<div @click="test(1)"> <button @click="test(2)">test</button></div>
顺序是2 1,capture的作用就是让这个顺序相反:
<div @click.capture="test(1)"> <button @click="test(2)">test</button></div>
5.passive
官网解释说可以提升移动端的性能,查了查,大概解释就是每次滚动都会有一个默认事件触发,加了这个就是告诉浏览器,不需要查询,不需要触发这个默认事件preventDefault:
<div v-on:scroll.passive="onScroll">...</div>
7.native
组件绑定当前组件的事件是不会触发的,需要用native才能触发: 看不懂
<My-component @click="shout(3)"></My-component>
1鼠标.left、.reight、.middle就是鼠标点击的时候就触发
<button @click.right="test">test</button>
1.keyCode
监听按键的指令,具体可以查看vue的键码对应表
注意,只有你点击过一次或者聚焦到这个输入框才能使用键盘触发
<input type="text" @keyup.enter="test(1)">
<button @click.enter="test(1)">test</button>
3.exact系统修饰键,只有按着这个键然后用鼠标点击才会触发
<button @click.ctrl="onClick">A</button>
<button @click.ctrl.exact="onCtrlClick">A</button>
<button @click.exact="onClick">A</button>
10.sync对prop进行双向绑定
//父组件
<fa-comp :fatest.sync="test"></fa-comp>
//子组件
this.$emit('update:fatest,sontest);
1
官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 .sync 。但是在 2.0 发布之后的实际应用中,我们发现 .sync 还是有其适用之处,比如在开发可复用的组件库时。我们需要做的只是让子组件改变父组件状态的代码更容易被区分。从 2.3.0 起我们重新引入了 .sync 修饰符,但是这次它只是作为一个编译时的语法糖存在。它会被扩展为一个自动更新父组件属性的 v-on 监听器。
示例代码如下
<comp :foo.sync="bar"></comp>
1会被扩展为:
<comp :foo="bar" @update:foo="val => bar = val"></comp>
1当子组件需要更新 foo 的值时,它需要显式地触发一个更新事件:
this.$emit('update:foo', newValue)
1. Axios
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
特点:
1.从浏览器中创建 XMLHttpRequests
2.从 node.js 创建 http 请求
3.支持 Promise API
4.拦截请求和响应
5.转换请求数据和响应数据
6.取消请求
7.自动转换 JSON 数据
8.客户端支持防御 XSRF
2 . AJAX
AJAX 是与服务器交换数据并更新部分网页的,在不重新加载整个页面的情况下。
Ajax = 异步 JavaScript 和 XML(标准通用标记语言的子集)。
3.区别
axios 和 ajax 的使用方法基本一样,只有个别参数不同;
axios({
url: 'http://jsonplaceholder.typicode.com/users',
method: 'get',
responseType: 'json', // 默认的
data: {
//'a': 1,
//'b': 2,
}
}).then(function (response) {
console.log(response);
console.log(response.data);
}).catch(function (error) {
console.log(error);
})
$.ajax({
url: 'http://jsonplaceholder.typicode.com/users',
type: 'get',
dataType: 'json',
data: {
//'a': 1,
//'b': 2,
},
success: function (response) {
console.log(response);
}
})
vw适配
1. .browserslistrc文件删除 not dead
2. 安装依赖
```js
cnpm i postcss-import postcss-url postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano --save
3、package.json里配置:
"postcss": {
"plugins": {
"postcss-import": {},
"postcss-url": {},
"postcss-aspect-ratio-mini": {},
"postcss-write-svg": {
"utf8": false
},
"postcss-cssnext": {},
"postcss-px-to-viewport": {
"viewportWidth": 375,
"viewportHeight": 667,
"unitPrecision": 3,
"viewportUnit": "vw",
"selectorBlackList": [
".ignore",
".hairlines"
],
"minPixelValue": 1,
"mediaQuery": false
},
"cssnano": {
"cssnano-preset-advanced": {
"preset": "advanced",
"autoprefixer": false,
"postcss-zindex": false,
"zindex": false
}
}
}
}
在Vue项目开发中我们经常要向页面中添加背景图片,可是当我们在样式中添加了背景图片后,编译打包后,配置到服务器上时,由于路径解析的问题,图片并不能够正确的显示出来,如下CSS样式:
background:url("…/…/assets/left-bg.jpg");
这个时候我们就要考虑使用其他的方式了,node中提供了一种比较有效的方式来解决这个问题,方法如下:
在data中定义如下:
data() {
return {
leftBg: {
background: "#235d8b url(" + require("./assets/left-bg.png") + ") no-repeat scroll 0 bottom",
},
topBg: {
background: "#235d8b url(" + require("./assets/top-bg.png") + ") no-repeat scroll right 0",
height: '80px'
}
}
}
其中使用require()方法,require()是node.js方法。
通过行内样式将样式引入:
<div :style ="leftBg"></div>
input:disabled{
color:xxx;
opacity:1;
//text-fill-color文本填充颜色,只兼容webkit内核
-webkit-text-fill-color:xxx;
-webkit-opacity:1;
font-size:16px;
}
ue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过**Object.defineProperty()**来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
请求拦截
请求拦截是在请求发送前进行操作 比如loading图加载和权限验证 还有数据预加载也可以实现baseURL还有默认请求方式都可以在请求前进行设置(比如说占位图等)
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
响应拦截
响应拦截的作用是在接收到响应后进行操作,比如说服务器返回登录状态失效,需要重新登陆,跳转到登录页axios拦截还可以解决跨域问题
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做点什么
return response;
}, function (error) {
// 对响应错误做点什么
return Promise.reject(error);
});
拦截点:共有四个拦截点:
1、request(发送一个请求)
(1)success (成功)
(2)fall (失败)
2、response(服务器响应)
(1)success (成功)
(2)fall (失败)