携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
自定义指令:
1.何时:
我们希望在开局时就能对HTML元素执行一些初始化操作,但是,vue中又没有提供对应功能的指令。就可以自定义指令。
比如: 希望一个文本框在页面加载时,就自动获得焦点,但是,vue自带的指令中,没有指令可以让元素自动获得焦点。此时,就可以自定义一个获得焦点的指令。
2.如何: 2步:
(1). 创建一个指令保存在Vue内存中备用
指令
Vue.directive("指令名", {
//插入后: 当前带有指令的DOM元素被vue挂载到页面上之后,自动触发的回调函数。
inserted(当前带有指令的DOM元素){
//对当前带有指令的DOM元素执行原生的DOM操作
}
})
(2). 在页面上使用自定义的vue指令
<元素 v-指令名>
3.强调:
(1). 定义指令时,指令名一定不要加v-前缀
使用指令时,必须加v-前缀
(2). 问题: 指令名使用驼峰命名会报错!
原因: HTML语言很蠢,只认识小写字母,不认识大写字母。
解决: 将来如果一个名字,有可能用在HTML地盘范围内,则如果包含多个单词,必须用-分隔,不能用驼峰命名。
4.原理:
(1). Vue.directive()是创建一个自定义指令对象,保存在Vue类型的内存中备用。
(2). new Vue()扫描时,发现v-开头的自定义指令,就回去Vue内存中找同名的自定义指令。
(3). 只要找到同名的自定义指令,就自动执行自定义指令对象中的inserted()函数,并将当前扫描到的带有自定义指令的元素对象传给inserted()的形参变量。 (4). 在inserted()函数内,可对当前传入的带有自定义指令的DOM元素应用原生的DOM操作。
5.示例:
自定义指令让元素自动获得焦点
计算属性:
1.什么是: 自己不保存属性值,而是根据其他属性的属性值,动态计算出自己的属性值。
2.何时: 今后,如果页面上需要一个值,但是这个值不是直接给的,需要经过复杂的计算过程才能获得时,都用计算属性。
3.如何: 2步:
(1). 定义计算属性:
new Vue({
el:"#app",
data:{ ... },
methods:{ ... },
watch:{ ... },
computed:{
计算属性名(){
//复杂的计算过程
return 属性值
}
}
})
(2). 在页面上使用计算属性:
<元素>{{计算属性名}}</元素>
4.强调:
(1). 计算属性虽然称为属性,但是其本质却是一个函数。但是,函数名却是一个名词
(2). 虽然计算属性本质是一个函数,但是在页面中使用计算属性时,不要加()!
5.原理:
(1). 当new Vue()扫描到一个不带()的变量时,会先去data中查找普通的属性。如果没找到,就去计算属性computed中查找。
(2). 如果找到计算属性,就自动调用计算属性的函数,执行出计算结果,并将计算结果替换到页面中属性名位置显示。
(3). 并且,vue会自动将首次计算属性计算出的结果,缓存起来,反复使用!避免重复计算!
(4). 当多次使用同一计算属性时,不会重复执行计算属性的计算过程,而是直接从缓存中取值。
(5). 当计算属性内部以来的其它变量值发生了变化时,vue会自动重新计算属性的值,并重新缓存起来反复使用。
6.计算属性computed和普通函数methods差别:
(1). methods中的普通函数,如果反复调用几次,就会反复执行几次。不会缓存结果。
(2). computed中的计算属性,即使反复使用多次,也只计算一次,然后将结果缓存起来反复使用。
(3).如果把computed的方法放到methods中时,调用时得加(),
7.如何选择:
(1). 如果更倾向于计算出一个值显示到页面上时,首选computed计算属性
(2). 如果更倾向于执行一个操作,而不关系结果时,首选methods普通函数
8.示例: 使用计算属性计算购物车总价:
过滤器
1.什么是: 专门对变量的原始值先加工再显示的一种特殊函数
2.为什么: 因为程序中有些数据不能直接给人看,需要先加工再给人看。
比如: 日期/时间、性别
3.何时: 今后,只要发现变量的原始值不能直接给人看,需要先加工再显示时,都可以用过滤器
4.如何: 2步:
(1). 先创建过滤器函数
//过滤
Vue.filter("过滤器名",function(旧值){
return 新值
})
(2). 在页面中使用过滤器函数
<元素>{{变量名 | 过滤器名 }}</元素>
<!-- 连接
| js地盘 |
-->
5.强调: 因为过滤器名用在{{}}内,是js的地盘,所以如果过滤器名中包含多个单词,应该用驼峰命名。
6.示例: 使用过滤器过滤性别:
过滤器传参:
(1). 定义时:
Vue.filter("过滤器名",function(旧值, 自定义形参, ...){
return 新值
})
(2). 使用时:
<元素>{{变量名 | 过滤器名(实参值1, ...)}}</元素>
(3). 示例: 使用过滤器显示不同的性别,可以选择不同的语言
过滤器可以连用:
(1). 定义过滤器时:
Vue.filter("过滤器名",function(旧值, 自定义形参, ...){
return 新值
})
(2). 使用过滤器时:
<元素>{{变量 | 过滤器1 | 过滤器2 | ... }}</元素>
(3).示例: 给性别追加图标
axios:
1.什么是:
(1). 第三方开发的: 下载
(2). 专门发送ajax请求: 用途
(3). 基于Promise: 语法
(4). 的函数库: 一组函数
2.何时: 今后只要在vue中发送ajax请求,一律用axios
3.如何: axios发送get请求和发送post请求参数格式不一样!
(0). 配置服务器端接口地址的公共路径部分:
axios.defaults.baseURL="http://服务器端基础地址部分"
比如:
axios.defaults.baseURL="http://xzserver.applinzi.com"
(1). get请求:
axios.get("服务器端接口地址剩余相对路径部分",{
params:{ 参数名: 参数值, ... : ... , ... }
}).then(result=>{ //必须用箭头函数
//其实result不直接是响应结果
//result.data才是真正的响应结果
})
(2). post请求:
axios.post(
"服务器端接口地址剩余相对路径部分",
"参数名1=参数值1&参数名2=参数值2&..."
).then(result=>{
console.log(result.data);
})
(3). 运行时:
axios会自动将baseURL和get/post中的相对路径拼接成接口的完整地址再发送请求。
vue的生命周期:
1.问题: 在DOM和jq中,如果希望页面一加载就能自动执行一项任务,可以把代码写在DOMContentLoaded或load事件处理函数中。但是vue中,如果希望在new Vue()加载完之后,自动执行一项任务,写哪儿?
2.错误: 直接在new Vue()外部的后方写希望后续执行的代码。
3.原因: 因为new Vue()的加载过程也是异步的,且做的事儿非常多,肯定有延迟。所以,放在new Vue()之后的代码绝对无法保证在vue加载完之后才执行。所以,将来程序的主要流程和代码,都要写在new Vue()内部才行!
4.解决: 其实new Vue()和普通网页一样,在整个加载过程中也要经历多个阶段——生命周期
vue生命周期四个阶段:
/必经阶段/
(1). 创建(create)阶段, 创建data对象、访问器属性 (2). 挂载(mount)阶段 扫描真实DOM树,创建虚拟DOM树,并首次加载数据到页面显示
/不必经阶段/
(3). 更新(update)阶段 只当修改data中的变量,且影响页面显示时触发
(4). 销毁(destroy)阶段 只当主动调用vm.$destroy()函数后触发。只删除虚拟DOM树,打断new Vue()与页面之间的联系。但是new Vue()对象还在内存中。
可用vm.$mount("#app")将断开的new Vue()和页面重新建立虚拟DOM树,重新绑定起来。
6.每个阶段前后,各有一对儿生命周期钩子函数(回调函数) new Vue({中
/必经阶段/
beforeCreate(){ ... } 没data、访问器属性,没虚拟DOM
(1). 创建(create)阶段
created(){...} 有data、访问器属性,没虚拟DOM
beforeMount(){ ... } 有data、访问器属性,有虚拟DOM,但是,页面内容未加载 (2). 挂载(mount)阶段
mounted(){ ... }有data、访问器属性,有虚拟DOM,页面内容也加载完成。——new Vue()首屏加载完成。
/不必经阶段/
beforeUpdate(){ ... }
(3). 更新(update)阶段
updated(){ ... }
beforeDestroy(){ ... }
(4). 销毁(destroy)阶段
destroyed(){ ... }
7.示例: 触发new Vue()声明周期各个阶段:
在哪里如何发送ajax请求:
(1). 首屏数据加载完,new Vue()会自动触发mounted()回调函数/钩子函数。所以,如果希望在首屏加载完之后,自动发送ajax请求,应该放在mounted()中。
(2). 具体流程:
a. 在data中先定义变量,准备接受ajax请求回来的数据
b. 在mounted()中发送ajax请求,获得响应结果:
1). 先输出响应结果,确定是否正确
2). 再将响应结果赋值给data中之前准备好的变量
c. 在界面中用绑定语法或指令,显示data中变量的值
(3). 示例: 请求学子商城首页商品,加载到页面: