2020年4月份抱着对新技术的好奇,学过一点vue,写了份Vue浅知.md
,当时还是满脑子就业做运维,时隔5个月,已经在转行做前端的路上了,或许一切都是缘分吧。
[TOC]
Hello Vue ! 💝
1 |
|
引入vue:
1 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
推荐一个属于Vue的Chrome插件:Vue.js devtools
插值表达式和过滤器
- 插值: 通过
{{ message }}
的方式将JS代码中的变量放到html中渲染变量 - 通过插值表达式渲染的变量相当于v-text指令,变量中的html代码不会被渲染为样式
1 | {{ number + 1 }} |
- 过滤器用于对插值表达式后的变量进行进一步的处理
- 定义过滤器的语法:
Vue.filter(filterName,function(data,args))
- 使用过滤器的语法:
{{ msg | filterName(args) | .... }}
- 下面演示定义一个全局的过滤器,demo会让所有的变量在后面加
~~~+args
1 | <!-- 定义一个过滤器 --> |
变量渲染 🏳🌈 v-once/text/html
- 一次性渲染变量:v-once
1 | <div id="app"> |
- 渲染变量为文本:v-text
1 | <div id="app"> |
- 渲染变量为html:v-html
1 | <div id="app"> |
😀 绝对不是在水字数
条件渲染 🏳🌈 v-if/show
v-if
,v-else
,v-else-if
,当if
后面的条件成立时,显示DOM元素
Syntax:isRender定义在vue实例的data中,使用v-if和v-show两个指令控制p标签里面的内容是否被渲染到页面上
1 | <p v-if="isRender"> {{ msg }} </p> |
v-if
和v-show
的区别:
- 实现原理的区别:
v-show
渲染的元素始终会保留在DOM中,消失只是给元素添加了display:none
的样式,而v-if
是删除/创建元素 v-show
初始渲染开销大,v-if
切换开销大
属性绑定 🏳🌈 v-bind
属性绑定可以动态的渲染样式,也可以给组件传递属性值,实现组件间通信,下面是v-bind的基本语法
1 | v-bind:style <!--可以缩写为--> :style |
v-bind使用场景:
单一属性绑定 - 绑定对象
1
2
3
4
5
6
7
8v-bind:class="{ 'active': isActive, 'text-danger': hasError }"
data: {
isActive: true,
hasError: false
}
最后的结果就是class="active"绑定对象内容定义在data里,不写在html模板 - 绑定对象
1
2
3
4
5
6
7
8
9<div v-bind:class="classObject"></div>
data: {
classObject: {
active: true,
'text-danger': false
}
}
绑定结果是:class="active"使用计算属性进行绑定 - 绑定对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14<div v-bind:class="classObject"></div>
data: {
isActive: true,
error: null
},
computed: {
classObject: function () {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}绑定数组
1
2
3
4
5
6
7
8<div v-bind:class="[activeClass, errorClass]"></div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
渲染结果:<div class="active text-danger"></div>三元表达式
1
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
绑定内联样式 - 使用对象绑定
1
2
3
4
5
6
7<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}绑定内联样式 - 使用数组绑定
1
<div v-bind:style="[baseStyles, overridingStyles]"></div>
多重值,渲染数组中最后一个被浏览器支持的值
1
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
双向绑定 🏳🌈 v-model
v-model
在表单 <input>
、<textarea>
及 <select>
元素上创建双向数据绑定
v-model
在内部为不同的输入元素使用不同的 property 并抛出不同的事件:
- text 和 textarea 元素使用
value
property 和input
事件; - checkbox 和 radio 使用
checked
property 和change
事件; - select 字段将
value
作为 property 并将change
作为事件。
下面这个例子是用户在文本框内输入内容,下方会有一个p标签实时呈现用户输入内容
1 | <div id="app"> |
事件绑定 🏳🌈 v-on
下面内容包括v-on的基础语法、事件修饰符、键盘修饰符、鼠标修饰符相关内容
将函数绑定到用户行为或者浏览器行为,当事件触发时,执行相应的动作,下面是v-on的语法,v-on
可以简写为@
1 | <div id="app"> |
1 | new Vue({ |
事件修饰符:阻止事件不再传播,.stop/.prevent/.capture/.self/.once/.passive
.stop
:阻止单击事件继续传播.prevent
:提交事件不再重载页面.capture
.self
1 | <a v-on:click.stop="doThis"></a> |
键盘修饰符
1 | <!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --> |
键盘修饰符:.enter/.tab/.delete(捕获“删除”和“退格”键)/.esc/.space/.up/.down/.left/.right/.ctrl/.alt/.shift/.meta/.exact
extract
:允许你控制由精确的系统修饰符组合触发的事件,类似于当Ctrl和Shift同时按下去,会触发哪个修饰符
鼠标修饰符:.left/.right/.middle
语法:
1 | @keyup.enter="do" |
对于Vue没有定义的键盘修饰符,Vue允许用户自定义,下面介绍自定义键盘修饰符
用法:https://cn.vuejs.org/v2/api/#keyCodes
键码值:https://www.bejson.com/othertools/keycodes/
1 | Vue.config.keyCodes.f1 = 112 |
循环变量 🏳🌈 v-for
v-for
渲染数组
- 可以访问父作用域里的所有属性
- 可以使用
of
替代in
作为分隔符,这里两者都是取的每一项 - 支持遍历对象,默认
value in object
得到的value是值,而非属性 - 遍历对象时,支持第二参数即:
(value,name) in array
,其中name是属性,value是值 - 遍历对象时,支持第三参数即:
(value,name,index) in array
,其中index是索引,从0开始 - 渲染的数据可以实计算属性的返回值,也可以是方法的返回值
1 | <div id="app"> |
自定义指令 🏳🌈 v-focus
https://cn.vuejs.org/v2/guide/custom-directive.html
对于没有的vue指令,vue允许用户自定义vue指令,自定义指令又分为全局指令和私有指令,下面介绍全局自定义指令的语法:
Vue.directive('directName'{ el-liftcycle })
1 | <input type="text" v-focus> |
1 | Vue.directive('focus',{ |
这里面有几点需要注意:
- 命名的时候不需要加
v-
,框架会自动帮我们加,调用的时候用v-directName
即可 - 自定义指令的第二个参数是生命周期对象,其值有:
bind/inserted/update/componentUpdated/unbind
,分别表示在不同的时间段执行相应操作 - 每个生命周期钩子函数都可以传递三个参数:
el/binding/vnode
,下面解释一下这三个参数el
: 指令绑定的元素,即DOM对象binding
:一个包含了绑定指令参数的对象,其中比价重要的有:name
:指令名称(不包含v-
前缀)value
:指令绑定的值arg
: 指令接受的参数
vnode
:Vue编译产生的虚拟节点
举个例子,就拿上面的案例扩容一下:
1 | <div id="app"> |
操作DOM 🏳🌈 $ref
Vue不建议我们通过getElementById()
的方式直接操作DOM,给我们提供了$ref
的方法简洁获取DOM元素,下面给出例子和语法:
1 | // 在html中,通过ref绑定元素 |
Vue实例 🏳🌈 Options
options是传递给vue实例的一个对象,主要是用来操作Vue实例内的数据,需要注意的是,这些内部的数据都是当前vue实例私有的,不能被外部访问,其基本格式为(也是我我们下面要写的内容):
1 | new Vue({ |
methods 🚀 函数方法
函数方法定义了实现某一功能的代码集合,这里主要讲一下实例中,methods方法的定义和使用
- 定义:在vue实例下的methods对象中定义方法,格式为
funcName: function(){}
1 | new Vue({ |
- 调用(一般情况下,方法会被v-on事件调用,v-on可以调用鼠标、键盘等多种事件绑定,见上文)
1 | <div id="app"> |
computed 🚀 计算属性
计算属性可以更优雅对变量进行处理和调用,这里主要讲一下实例中计算属性的定义和使用,以及计算属性和函数方法的区别
- 定义:在vue实例下的computed对象中定义,格式为
computedName: function(){}
1 | new Vue({ |
- 调用
1 | <div id="app"> |
计算属性的本质就是一个对象的get方法,它也可以设置set方法,但没必要。
1 | computed: { |
计算属性和普通方法的区别:
- 普通方法调用的时候需要加上
()
,而计算属性调用只需要写变量名 - 计算属性本质上是一个包含get方法的对象,只是简化成函数的形式而已,而普通方法本身就是函数
- 计算属性会有缓存,如果计算涉及到的变量不改变,则默认返回缓存中的值,下面通过一个例子展示一下:
1 | <div id="app"> |
1 | computed: { |
页面输出三次vuehello
,但console只输出一次only be called once
watch 🚀 监听器
定义:在vue实例下的watch对象中定义,格式为variable: function(){}
,variable是需要监听的变量,变量一旦改变,就执行后面的函数,下面是监听器的基本语法,分别为html代码和vue代码
1 | <div id="app"> |
1 | new Vue({ |
watch监视路由变化
1 | this.$route.path : function(newVal,oldVal){ |
LifeCycle 🚀 钩子函数
Vue实例的生命周期流程图

beforeCreate()
这个函数执行时,vue里面的数据还没有被初始化,data、methods等不存在,不能被调用created()
Vue实例内容初始化,可以调用里面的data和methodsbeforeMount()
模板已经编译完放在内存中,但是尚未挂载到DOM;此时插值表达式没有被渲染,还是 的形式mounted()
实例已经完全创建并挂载到页面,如果要操作DOM节点,需要在mounted或之后操作;之后组件脱离了创建阶段,到达运行阶段beforeUpdate()
数据被更新了,但是页面没有被更新;Vue实例中的数据改变了,但是页面中的数据还没改变,数据未同步updated()
虚拟DOM树重新渲染,页面内容和数据内容保持一致,页面被更新
例子和语法
1 | <div id="app"> |
1 | new Vue({ |