vue视频学习第二天笔记
复习
- vue单文件方式 xxx.vue
- 格式:template script style(scoped)
- 创建基本文件
- 1)配置文件:package.json + webpack.config.js
- package.json:呈现下载的依赖包信息 + 设置scripts简化运行命令
- webpack.config.js:配置webpack打包工具;
- 2)index.html:html模板;
- 3)main.js:入口文件
- 4)app.vue和其他子组件
- 5)设置main.js:引入vue模块,实例创建,引入.vue文件渲染到挂载点中;
- 1)配置文件:package.json + webpack.config.js
- vue实例方法及使用
- new Vue(options)
- el:挂载点
- data:变量
- methods:事件函数
- components:声明子组件
- props:声明父组件传递给自己的自定义属性名,属性名为字符串类型;
- 实例变量调用
- template中使用
{{xxx}}
,调用xxx变量; - script实例中使用
this.xxx
,调用xxx变量;
- template中使用
- 实例原型上的方法
- this.$on(事件行为,回调函数(形参)):绑定后,可多次触发,接收多次子组件传递来的实参;
- this.$emit(事件行为,实参):子组件设置,触发后传递实参
- this.$off(事件行为):取消事件行为
- this.$once(事件行为,回调函数(形参)):绑定后,只触发一次;
- 注:同一个事件行为的绑定和解绑等操作,前提必须是同一个实例this调用;
- 父子组件中传递参数
- 父传子:属性值作为参数
- 父组件:在子组件标签中,设置自定义属性(也可以是系统属性),绑定属性值参数;
- 1)属性值xxx为常量,通过
title="xxx"
设置; - 2)属性值xxx为变量,通过
:title="xxx"
设置;
- 1)属性值xxx为常量,通过
- 子组件:设置根属性props,值为数组,数组元素为父组件设置的属性名字符串,用于声明接收的属性名;如
props:["title"]
- 使用:与data定义的变量使用方式相同;
- 父组件:在子组件标签中,设置自定义属性(也可以是系统属性),绑定属性值参数;
- 子传父:通信vuebus
- 思想:
- 前提:必须设置同一个实例,来调用原型上的
$on
,$emit
方法;所以,可以封装一个js文件,返回一个Vue实例; - 父组件先通过
$on
来监听一个事件行为,设置回调函数;父组件的事件行为必须先触发; - 子组件在通过
$emit
给同一个事件行为发射参数数据,触发$on
绑定的回调函数;
- 前提:必须设置同一个实例,来调用原型上的
- 父组件:引入Vue实例,调用原型
$on
方法,绑定一个事件行为,设置回调函数 - 子组件:引入同一个Vue实例,调用原型
$emit
方法,绑定同一个事件行为,传递参数,触发后父组件中回调函数就能接收到子组件传递的实参;
- 思想:
- 父传子:属性值作为参数
- new Vue(options)
vue属性解读
- 过滤器filters
- 创建:全局创建和组内局部创建
- 组内局部创建:在
export default {}
对象中设置filters属性,属性值为对象;- 对象中设置过滤器的key和value值;value值为函数;通过形参接收过滤的参数值;
- 创建代码:
export default { filters: { capitalize: function(value) { //value接收到message值 return value+"meihao"; } } }
- 全局创建:调用Vue类原型上的filter方法;
- 代码:
Vue.filter("过滤器名字":function(val){})
- 注:在main.js中,在new Vue()实例之前,创建全局过滤器
- 创建代码:
import Vue from "vue"; import App from "./app.vue"; //filters全局创建,必须在实例创建之前设置; Vue.filter("mynote",function (val) { return "我是全局创建的filters过滤器" }); //实例创建 new Vue({ el: "#app", render: createEle => createEle(App) });
- 代码:
- 组内局部创建:在
- 调用执行:template中使用
- 通过
{{}}
调用执行,格式{{ message | capitalize }}
,message为变量值,传送给capitalize的函数体内,返回一个值作为此处的值; - 标签中通过v-bind绑定属性,格式
<div v-bind:titile="message | capitalize"></div>
,message为变量值,传送给capitalize的函数体内,返回一个值作为此处的属性值;
- 通过
- 比较:当全局创建的过滤器和组内创建的过滤器名字相同时,比较哪一个会使用
- 权利:组内创建的过滤器 > 全局创建的过滤器
- 若全局创建的过滤器和组内创建的过滤器名字相同时,在template调用时,会使用自己组内创建的过滤器;
- 使用范围:全局创建的过滤器 > 组内创建的过滤器
- 全局创建的过滤器,可以在任何子组件中使用;
- 组内创建的过滤器,只能在自己的template中使用;自己的子组件都不能使用;
- 权利:组内创建的过滤器 > 全局创建的过滤器
- 创建:全局创建和组内局部创建
- 获取DOM结构
- 在指定元素上设置
ref="名称A"
- 在获取的地方通过
this.$refs.名称A
获取- 若ref设置在原生DOM元素上,获取的就是原生DOM对象;
- 可以对该DOM对象直接操作;
- 若ref设置在子组件对象上,获取的就是该子组件对象;
- 获取的是子组件对象,通过
this.$refs.名称A.$el
获取到子组件template模板最外围根标签元素原生DOM对象;
- 获取的是子组件对象,通过
- 对应的事件
- created:完成了数据的初始化,此时还未生成DOM,无法操作dom;此时获取的$refs值为空;多用于操作数据;
- mounted:将数据已经装载到了DOM之上,可以操作DOM,此时可以获取$refs值;多用于操作DOM;
- 若ref设置在原生DOM元素上,获取的就是原生DOM对象;
- 在指定元素上设置
移动端插件mint-ui
- 作用:用于移动端vue封装的插件
- 网址:Mint-UI
- 安装
- Vue 1.x:
npm install mint-ui@q -S
- Vue 2.x:
npm install mint-ui -S
- Vue 1.x:
- 引入模块:Vue
- 引入Vue:
import Vue from "vue"
- 引入Vue:
- 引入组件
- 引入全部组件:注:使用use方法,必须在
new Vue{}
之前使用定义;
import Mint from "mint-ui"; Vue.use(Mint):
- 按需引入部分组件:引入Cell和Checklist组件;
import { Cell, Checklist } from "mint-ui"; Vue.component(Cell.name, Cell); Vue.component(Checklist.name, Checklist);
- 引入全部组件:注:使用use方法,必须在
- 引入mint-ui样式
- 代码:
import "mint-ui/lib/style.css"
,相当于在html文件中使用link来引入css文件; - 需要下载url-loader插件
- 代码:
- 引入位置:在main.js中引入以上的模块和css样式文件;
- 重点:
- 无论是引入全部组件还是按需引入组件,在所有子组件中都能在template模板中使用对应的组件对象标签;
- 如:Switch,Tabbar等模块,只需在main.js中引入即可,直接在template模板中使用对应的标签;
- 若在script中使用,必须在该组件中,重新引入对应的模块;否则,不能使用;
- 如:Toast,Indicator等模块,需要在script中设置js,所以必须在所在的
export default {}
中,再次引入该模块;
- 如:Toast,Indicator等模块,需要在script中设置js,所以必须在所在的
- 无论是引入全部组件还是按需引入组件,在所有子组件中都能在template模板中使用对应的组件对象标签;
vue-router
- 前端路由核心:锚点值的改变,根据不同的路径,渲染指定DOM位置的不同数据
- vue中,模板数据不是通过ajax请求来的,而是调用函数获取到模板内容;
- 核心:锚点值改变
- Vue的核心插件
- vue-router 路由
- vuex 管理全局共享数据
- 使用方式
- 1)下载:
npm i vue-router -S
- 2)在main.js中引入模块:
import VueRouter from "vue-router"
- 3)安装插件:
Vue.use(VueRouter)
,挂载属性; - 4)创建路由对象并配置路由规则
- 代码1:
let routerRules=new VueRouter({ routes: [{},{}] })
; - 代码2:
let routerRules=new VueRouter(); routerRules.addRoutes([{},{}])
- routes对应的数组中元素为对象,每一个对象对应一个路由地址;如
{path:"/home",component:Home}
;- path为路由地址,component为地址对应的组件;
- 代码1:
- 5)将路由规则设置Vue实例中,设置options,属性为router,属性值为路由规则
- options中设置
router:routerRules
;
- options中设置
- 6)在app.vue中留坑
<router-view></router-view>
;一个固定格式,必须添加; - 代码:
- main.js代码:
//1)引入模块 import Vue from "vue"; import VueRouter from "vue-router"; //引入自定义模块组件 import App from "./app.vue"; import Home from "./components/home.vue"; import Yuan from "./components/yuan.vue"; //2)安装插件,挂载属性 Vue.use(VueRouter);//挂载属性 //3)设置路由规则 let routerRules=new VueRouter({ routes: [ {path: "/home",component: Home}, {path: "/yuan",component: Yuan}, ] }); //4)创建Vue实例,设置路由规则 new Vue({ el: "#app", //设置路由规则,设置router属性 router: routerRules, render: function (createEle) { return createEle(App); } });
- app.vue代码:
<template> <div title="gen"> <router-view></router-view> </div> </template> <script> export default { } </script> <style></style>
- 1)下载:
命令路由 router-link
- router-link作用:类似于a标签,点击标签,跳转不同路由,跳转不同页面
- 使用方式:
- 固定路由地址:
<router-link to="/mymusic">跳往音乐</router-link>
- 赋值对象,对应设置路由的name值:
<router-link :to="{name:'music'}">跳往音乐</router-link>
- 赋值对象的形式更利于维护,如果修改规则中的path,对应的router-link中的to值就会改变;
- 以上两种方式对应的路由规则代码
let routerRules=new VueRouter({ routes: [ {name:"music",path:"/mymusic",component:Music}, {name:"movie",path:"/mymovie",component:Movie}, ] });
- 固定路由地址:
- 通过router-link跳转到组件
- 在跳转的组件内,如何获取router-link用to绑定的关于路由地址的参数和地址
- Vue类原型上存在两个属性:
$route
和$router
-
$route
:只读,具备信息的对象; -
$router
:具备功能函数;
-
- 在跳转的组件内部通过this调用原型上的两个属性;获取指定的数据信息;
- 绑定:在router-link通过to来绑定数据时,绑定两个属性params和query
- params属性值为对象,为了绑定地址中的变量值,用于拼接在path后,作为请求路由地址;注意:对象中的属性必须与规则中的路由
:xxx
后的xxx对应; - query属性值为对象,为了绑定地址中
?
后面的key=val&key=val
参数值;
- params属性值为对象,为了绑定地址中的变量值,用于拼接在path后,作为请求路由地址;注意:对象中的属性必须与规则中的路由
- 组件内获取:在created函数中获取数据,通过
this.$route
获取整个规则对象;
- 绑定:在router-link通过to来绑定数据时,绑定两个属性params和query
- 代码:
- main.js中的规则代码:
//3)设置路由规则 let routerRules=new VueRouter({ routes: [ {name:"list",path:"/list",component:List}, {name:"detail",path:"/detail/:name/:user",component:Detail}, ] });
- list.vue中代码:
<template> <div> <p>我是列表页</p> <ul> <li v-for="(item,index) in stus" :key="index"> {{item.name}} <router-link :to="{name:'detail',params:{name:'tian',user:'guo'},query:{id:'yu',keys:'kong'}}">查看</router-link> </li> </ul> </div> </template> <script> export default { data(){ return { stus: [ {name:"乔峰"}, {name:"郭靖"} ] } } } </script> <style scoped> </style>
- detail.vue中代码:
<script> export default { //获取参数 created() { console.log(this.$route);//打印对象 } } </script>
- 控制台打印
this.$route
的结果:
- 编程导航 $router
- 作用:根据浏览器的记录进行后退和前进一页的加载,可以在js中设置路由跳转;
- 位置:Vue类的原型上的公有属性方法;通过实例调用;
- 属性:
- 1)
this.$router.go(1/-1)
:根据浏览器记录,进行前进和后退;注:前进和后退的前提是存在浏览器的跳转记录,若无记录,不能完成跳转; - 2)
this.$router.push(xxx)
:进行路由跳转,与router-link中to绑定的参数类似;- 字符串:
"/music"
,跳转对应的路由页面; - 对象:
{name:"movie",query:{id:"mei"},params:{user:"tiantian"}
- 注:进行路由跳转时,可以设置query传递参数;
- 字符串:
- 1)
- vue-router原理
- 绑定hashchange事件,辨识hash变化,进而触发回调函数;
- 设置DOM标识,即
<div id="xxx"></div>
,相当于标签router-view的作用; - 最终通过hash值的改变,触发回调函数,将制定的模板数据插入到DOM标识中;
- 代码:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>验证vue-router原理</title> <style> *{ margin: 0; padding: 0; } div{ height: 150px; background-color: skyblue; } #flag div{ background-color: hotpink; } </style> </head> <body> <div id="app"> <div>我是头部</div> <!--DOM标识--> <div id="flag"></div> <div>我是底部</div> </div> <script> /*通过在地址栏中添加 #/music 或 #/movie来实现功能*/ var domFlag=document.getElementById("flag"); var musicHtml= `<div>我是音乐页面</div>`; var movieHtml= `<div>我是视频页面</div>`; window.addEventListener("hashchange",fn); function fn() { console.log(location.hash); switch (location.hash){ case "#/music": domFlag.innerHTML=musicHtml; break; case "#/movie": domFlag.innerHTML=movieHtml; break; } } </script> </body> </html>
重定向和404页面
- 重定向页面:通过加载某个路由地址后,重定向加载到其他路由地址,渲染相对应的组件;
- 代码:
{path: "/", redirect: "/home"}
或{path: "/", redirect: {name: "tohome"}
,即:当路由地址为"/",跳转到"/home"的路由地址; - 用于默认页面的加载,重定向成其他新的地址;
- 代码:
- 404页面:当出现错误路由地址时,加载对应的一个组件,显示页面加载错误;
- 代码:
{path: "*", component: NoFound}
,即:接盘侠,路由地址从上到下加载,若无对应路由,则加载404页面; - 用于页面的报错展示;
- 代码:
多视图 router-view
- 视图、路由、组件
- 一个视图 + 一个路由 + 一个组件
- 一个router-view + 一个routes + 一个组件component
- 多个视图 + 一个路由 + 多个组件
- 多个router-view + 一个routes + 多个组件components
- 一个视图 + 一个路由 + 一个组件
- components 多视图,值为一个对象,对象中有多个key和value
- key:对应router-view的name值,若router-view未设置name值,则对应的key为default;
- value: 视图对应显示的组件对象;
- 代码:
- main.js中设置路由规则代码:
import Header from "./components/header.vue"; import Footer from "./components/footer.vue"; import Middle from "./components/middle.vue"; //设置路由规则 let routerRules=new VueRouter(); routerRules.addRoutes([ { path: "/", components: { h: Header, default: Middle, f: Footer } } ]);
- app.vue中设置router-view代码:
<template> <div> <div>我是头部</div> <hr> <!--多个DOM标识--> <router-view name="h"></router-view> <router-view name="h"></router-view> <!--对应default设置的组件--> <router-view></router-view> <router-view name="f"></router-view> <hr> <div>我是底部</div> </div> </template>
嵌套路由
- 用单页实现多页应用,复杂的嵌套路由;
- 视图包含视图
- 一个视图router-view中渲染的组件中,再次包含router-view
- 路由嵌套路由
- 一个路由规则中的设置,在routes中设置的路由对象中,这是children属性,属性值为数组,数组元素为子路由中的规则路由;
- 代码:
- main.js中路由嵌套规则设置:
//设置路由规则 let routerRules=new VueRouter(); routerRules.addRoutes([ {name: "index", path: "/"}, {name: "music", path: "/music", component: Music, children: [ {name: "oumei", path: "/oumei", component: Oumei}, {name: "guochan", path: "/guochan", component: Guochan}, ]} ]);
- 解析子路由的path设置
- 若path中设置"/",则为绝对路径,与父级path无关;
- 例:若父级path为"/music",子级路由path设置为"/oumei",则跳转页面后地址栏中只显示"#/oumei"地址,为绝对路径,与"/music"无关;
- 若path中未设置"/",则为相对路径,总路径为拼接父级路径得到;
- 例:若父级path为"/music",子级路由path设置为"oumei",则跳转页面后地址栏中会显示"#/music/oumei"地址,为相对路径,拼接"/music"得到;
- 若path中设置"/",则为绝对路径,与父级path无关;
vue-resource
- 作用:发送请求,提交/获取数据
- get请求
- 服务器预留接口,通过
this.$http.get("/xxx").then(res => {},err =>{})
发送get请求,然后通过res.body
来获取服务器响应的数据对象;
- 服务器预留接口,通过
- post请求
- 服务器预留接口,通过
this.$http.post("/xxx",{key:value},{options}).then(res => {},err => {})
发送post请求,提交数据; - 注:
- 在post提交数据时,会存在跨域请求的问题,服务器端需设置跨域请求代码;
- vue-resource发送post请求提交数据时,可能会报错:
Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response
,此时报错的原因是post请求头content-type类型为application/json
,为最新类型,一般浏览器不支持,所以需要修改为application/x-www-form-urlencoded
;- 设置post请求中的options参数:
{emulateJSON: true}
- 设置post请求中的options参数:
- 服务器预留接口,通过
- options预检请求:当浏览器发现跨域 + application/json的请求,就会自动发起预检请求,并且携带一个content-type的请求头,类型为application/json;;
- vue-resource基本使用代码:
- main.js中引入模块,挂载属性
//引入模块 import Vue from "vue"; import VueResource from "vue-resource"; //挂载属性 Vue.use(VueResource);
- app.vue中script设置钩子函数created发起请求
<script> export default { created(){ this.$http.get("http://localhost:5555/getdata").then( res=>{ console.log(res.body.msg); }, err=>{ console.log(err); } ); this.$http.post("http://localhost:5555/postdata",{name:"mei",sex: "nan"}).then( res => { console.log(res.body.msg); }, err => { console.log(err); } ) } } </script>
- app_server.js服务器代码:进行跨域请求
//创建服务器 const express=require("express"); const bodyParser=require("body-parser"); const app=express(); app.listen("5555",function () { console.log("5555 server is running"); }); //设置body-parser中间件 app.use(bodyParser.urlencoded({extended:false})); app.use(bodyParser.json()); //设置跨域请求 const cors=require("cors"); app.use(cors({ origin: ["http://localhost:8888"], methods: ["GET","POST"], allowHeaders: ["Content-Type", "Authorization"] })); //创建初始数据库 var dataAry=[ { name: "乔峰", sex: "nan" }, { name: "郭靖", sex: "nan" }, { name: "小龙女", sex: "nv" } ]; //创建请求路由 app.get("/getdata",function (req, res) { res.send({"bok":true,"msg":dataAry}); }); app.post("/postdata",function (req, res) { //获取post请求提交的数据 var data=req.body; console.log(data); dataAry.push(data); res.send({"bok":true,"msg":"提交数据成功"}) });
axios
- axios中文文档:axios中文文档
- 下载axios:
npm i axios
- 在main.js中引入模块,挂载到Vue类原型上,原型上设置一个公有属性,这样就可以通过Vue实例this调用
- 代码:
//1.引入模块 import Vue from "vue"; import Axios from "axios"; import App from "./app.vue" //2.挂载属性,挂载到Vue原型上 Vue.prototype.$axios=Axios; //3.实例创建 new Vue({ el: "#app", render: createEle => createEle(App) });
- 在app.vue的scirpt中,通过
this.$axios.xxx
调用;
- get请求:
this.$axios.get(url,options).then(res=>{}).catch(err=>{})
- get请求向服务器传参数时,两种方法:
- 通过"?"来拼接键值对在url后面;
- 通过设置options中的params属性,属性值为对象,对象中的key和value,也会通过"&"拼接在url后面;效果与上面一样;
- get请求向服务器传参数时,两种方法:
- post请求:
this.$axios.post(url,data,options).then(res=>{}).catch(err=>{})
- data的类型:字符串或对象
- 字符串:在发送post请求后,在Request Headers中Content-Type为:application/x-www-form-urlencoded;如:
name=guo&age=12
;键值对的形式; - 对象:在发送post请求后,在Request Headers中Content-Type为:application/json;如:
{name:"guo",age:12}
;
- 字符串:在发送post请求后,在Request Headers中Content-Type为:application/x-www-form-urlencoded;如:
- 服务器端通过body-parser插件来获取post请求的参数数据,通过代码
req.body
来获取数据,不管传的是字符串还是对象,得到的都是对象形式;
- data的类型:字符串或对象
- options:
{ params: {id:1}}//查询字符串,headers:{"content-type":"xxxx"},baseURL:" "}
- params设置对象,在get请求中将作为键值对的形式通过"?"拼接在url后面
- baseURL:为该请求,私有的默认url地址;
- 默认全局设置
-
Axios.defaults
=> options对象,即可以设置headers,params,baseURL等属性;
-
- 全局设置默认url地址:
Axios.defaults.baseURL="http://localhost:8888"
; - 接收服务器端响应的值,通过
res.data
接收; - 代码:
- main.js代码:
//1.引入模块 import Vue from "vue"; import Axios from "axios"; import App from "./app.vue" //全局设置默认url Axios.defaults.baseURL="http://localhost:5555"; //2.挂载属性,挂载到Vue原型上 Vue.prototype.$axios=Axios; //3.实例创建 new Vue({ el: "#app", render: createEle => createEle(App) });
- app.vue代码:
<template> <div> 我是主页 <p>数据:{{dataAry}}</p> <button @click="handleTo">提交数据</button> </div> </template> <script> export default { data(){ return { dataAry: [] } }, created(){ this.$axios.get("/getdata",{ params: { name: "guomushan", age: 27 } }).then(res => { this.dataAry=res.data.msg; }).catch(err => { console.log(err); }); }, methods:{ handleTo(){ this.$axios.post("/postdata","name=meihao&sex=nan").then(res => { alert(res.data.msg); this.$axios.get("/getdata").then(res => { this.dataAry=res.data.msg; }).catch(err => { console.log(err); }); }).catch(err => { console.log(err); }) } } } </script> <style> </style>
- axios合并请求
- 格式:
this.$axios.all([请求1,请求2]).then(this.$axios.spread(fn)).catch(err=>{})
- 其中fn为匿名函数,格式
function fn(res1,res2){}
,其中res1为请求1响应的数据,res2为请求2响应的数据;按照发送请求的顺序,接收响应的数据; - 要求:合并请求,即同时发送多个请求,当请求全部成功后,才会执行fn函数,否则,只要有一个失败,则执行catch函数;
- 代码:
function fn(res1,res2) { console.log(res1.data);//打印get请求响应的数据; console.log(res2.data);//打印post请求响应的数据; } export default { this.$axios.all([ this.$axios.get("/getdata?name=guomushan&age=28"), this.$axios.post("/postdata",{name: "meihao", sex: "nv"}) ]).then( this.$axios.spread(getAll)//分发响应 ).catch(err=>{ console.log(err); }) }
- 格式:
- 拦截器interceptors
- 作用:过滤,在一次请求与响应中,添油加醋
- 设置位置:在main.js中挂载属性之前进行设置;
- 格式:
- 在request请求之前拦截:
axios.interceptors.request.use(fn)
,其中fn:function(config){ xxx; return config}
;在函数中对config进行操作,然后返回config; - 在response响应之后拦截:
axios.interceptors.response.use(fn)
,其中fn:function(data){ xxx; return data}
;在函数中对data进行操作,然后返回data;
- 在request请求之前拦截:
- config和data获取的是options属性,可以设置headers,params,baseURL等参数;
- 如
function(config){ config.headers={xxx}}
;设置请求头headers参数; - 如
function(data){ data.headers={xxx}}
;设置响应头headers参数;
- 如
- 代码:
//1.引入模块 import Vue from "vue"; import Axios from "axios"; import App from "./app.vue" //全局设置默认url Axios.defaults.baseURL="http://localhost:5555"; //通过Axios.defaults进行设置options参数 Axios.defaults.headers={ accept: "defaults" }; //设置拦截器interceptors,在请求之前拦截设置参数 Axios.interceptors.request.use(fn1); function fn1(config) { //对config参数进行设置,相当于options config.headers.accept="interceptors"; return config; } //设置拦截器interceptors,在响应之前拦截设置参数 Axios.interceptors.response.use(fn2); function fn2(data) { //对data参数进行设置,相当于options data.headers.accept="interceptors"; return data; } //2.挂载属性,挂载到Vue原型上 Vue.prototype.$axios=Axios; //3.实例创建 new Vue({ el: "#app", render: createEle => createEle(App) });
- options参数设置的位置
- 单个请求时,可以设置在请求中设置参数,进而设置options参数;
- 代码:
this.$axios.get("/getdata",{ params: { name: "guomushan", age: 27 }, headers: { accept: "nei" } }).then(res => { this.dataAry=res.data.msg; }).catch(err => { console.log(err); });
- 通过
Axios.defaults
来设置options参数;- 代码:
Axios.defaults.headers={accept: "defaults"}
;
- 代码:
- 通过拦截器中的config和data来设置options参数
- 代码:
Axios.interceptors.request.use(fn); function fn(config) { //对config参数进行修改设置,相当于options参数 config.headers.accept="interceptors"; return config;//必须返回config; }
- 三者优先级
- 单个请求设置,只应用在一个请求中,其他请求中不存在;
-
Axios.defaults
和拦截器二者设置,应用在所有的请求中; - 权利大小:拦截器 > 单个请求设置 >
Axios.defaults
- 单个请求时,可以设置在请求中设置参数,进而设置options参数;
- token(扩展)
- cookie和session的机制,cookie自动带一个字符串;
- cookie只在浏览器
- 移动端原生应用,也可以使用http协议,可以加自定义的头,但原生应用没有cookie
- 对于三端来讲,token可以作为类似cookie的使用,并且可以通用;
- 拦截器可以用在添加token上;
- 拦截器的应用
- 应用在操作loading
- 在请求发起之前拦截设置open,在响应回来之后拦截设置close;配合mint-ui使用;
- 代码:
//设置拦截器interceptors,在request请求之前拦截 Axios.interceptors.request.use(function (config){ console.log(config); Indicator.open('加载中...'); return config; }); //在response响应之前拦截 Axios.interceptors.response.use(function (data){ console.log(data); setTimeout(function () { Indicator.close(); },2000); return data; });
- 侦听器watch
- 作用:监视变量的改变,而触发,使用于监听一个变量的改变;
- 浅度监视:变量值为基本数据类型;
- 深度监视:变量值为引用数据类型,即数组和对象,他们中的属性发生改变,则需要深度监视
- 代码:
<template> <div> <p>验证watch</p> <input type="text" v-model="text"/>{{text}} <p>{{data.name}}</p> <button @click="toChange()">改变值</button> </div> </template> <script> export default { data(){ return { text: '', data: { name: "mengsi", } } }, methods:{ toChange(){ this.data.name="mei" } }, watch: { //浅监视,针对变量值为基本数据类型 text: function(newV,oldV){ console.log(newV);//改变后的值 console.log(oldV);//改变前的值 console.log("text is changed") }, //深度监视,针对变量值为引用数据类型 data: { handler: function (newV,oldV) { console.log(newV.name);//改变后的新值,但此处为mei console.log(oldV.name);//改变前的新值,此处为mei console.log("data is changed") }, deep: true } } } </script> <style> </style>
- 计算属性computed
- 作用:监听多个变量的改变,使用于多个变量值的改变;
- 特点:可以监听多个变量值的改变,并且可以定义变量,通过计算返回指定数据作为变量值,然后可以调用使用;
- 注意:如果变化值与原来的值形同时,不会触发函数;
- 属性值为对象,对象中为函数键值对;函数名为变量名,函数体的返回值为变量值,无需在data中再定义该变量,直接就可以使用;
- 代码:
<template> <div> <p>验证计算属性computed</p> 单价:<input type="text" v-model="price"/> 数量:<input type="text" v-model="count"/> 比例:<input type="text" v-model="bili"/><br> {{sum.name}}:{{sum.all}} </div> </template> <script> export default { data(){ return { price: 0, count: 0, bili: 0 } }, computed: { //函数名即为变量名,不用在data中在定义该变量; sum(){ //可以返回对象和其他 //return this.price*this.count*this.bili/100; return { name: "总和", all: this.price*this.count*this.bili/100 } } } } </script> <style></style>