.常用指令
v-cloak
**作用:**解决浏览器在加载页面时因存在时间差而产生的闪动
问题
**原理:**先隐藏元素挂载位置,处理好渲染后再显示最终的结果
**注意:**需要与CSS规则一起使用
**文档地址:**https://cn.vuejs.org/v2/api/#v-cloak
示例:
<style> [v-cloak] { display: none; } </style> <div v-cloak> {{ message }} </div
如果后期有多个元素需要解决闪动问题,可以将v-cloak
写在根元素上(id="app"顶级的div上)。
数据绑定指令
- v-text 填充纯文本
- 相比插值表达式更加简洁
- 不存在插值表达式的闪动问题
<div id='app'> <span v-text="msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</span> </div> <script src="./js/vue.js"></script> <script> new Vue({ el: '#app', data: { msg:'<a href="http://www.baidu.com/">百度一下</a>' } }) </script>
- v-html 填充HTML片段
- 存在安全问题
- 本网站内部数据可以使用,来自第三方的数据不可使用
- 只有一个场景会使用:后台会用,比如有一个企业站,会发不企业的动态的新闻,这个时候会使用富文本编辑器,由于内容是自己人加的,所以可以放心使用。 自己攻击自己(自攻)
<div id='app'> <div v-html="html"></div> </div> <script src="./js/vue.js"></script> <script> new Vue({ el: '#app', data: { html:'<a href="http://www.baidu.com/">百度一下</a>' } }) </script>
- v-pre 填充原始信息(对应的是以前html中的标签“
”)【凑数】
- 跳过表达式的编译过程(先编译,后渲染),显示原始信息
<span v-pre>{{ this will not be compiled }}</span>
有些时候我们不想指令中的表达式进行运行,只需要给表达式加个引号。例如:
<div v-html='"msg"'></div> <div v-html="'msg'"></div>
针对后续想让指令属性值不解析的操作都可以这么去做。
v-once
作用:只渲染元素或组件一次**,之后元素或组件将失去**响应式(数据层面)功能(对于数据的一锤子买卖)
**Q & A:**如何理解响应式?
- 布局响应式:布局会随着设备尺寸的大小变化而变化的布局方式
- 数据响应式:双向数据绑定
示例:
<div id="app"> <h3>{{message}}</h3> <!-- 动态修改message值,此绑定将不会发生改变 --> <div v-once>{{message}}</div> </div> <script src="./js/vue.js"></script> <script type='javascript'> const vm = new Vue({ el: '#app', data: { message: '你好世界' } }) </script>
v-bind
**作用:**动态地绑定一个或多个attribute
【实现可以允许我们在html内置的属性值中使用变量,主要是给非指令的属性去使用绑定动态可变的数据的】
场景:复用某个数据的时候会使用。例如:飞猪官网
<!-- v-bind:给非指令的属性使用变量 --> <a v-bind:href="url" v-bind:target="target">{{alt}}</a> <!-- v-bind的简写形式,实际使用这样的写法 --> <a :href="url" :target="target">{{alt}}</a>
示例代码
<body> <div id="app"> <a :href="url" :target="type" :alt="alt">{{alt}}</a> <a :href="url">{{alt}}</a> </div> </body> <script src="./js/vue.js"></script> <script> new Vue({ el: '#app', data: { url: 'https://www.fliggy.com/', type: '_blank', alt: '飞猪官网' } }) </script>
v-on
基本使用
**作用:**绑定事件监听器(事件绑定)
示例:
<!-- 直接执行操作 --> <!-- 常规写法 --> <button v-on:click="num++"></button> <!-- 缩写 --> <button @click="num++"></button> <!-- 事件处理函数调用:直接写函数名 --> <button @click="say"></button> <!-- 事件处理函数调用:常规调用 --> <button @click="say('sth')"></button>
如果事件处理函数为自定义函数,则需要先进行定义,定义的方式如下:
... data: { ... }, methods: { functionName: function(arg1,arg2,arg3,...){ // something to do }, .... }
注意:事件绑定v-on
属性表达式中切记不能直接写业务逻辑,例如@click="alert('123')"
。换言之,就咋行内上是不允许使用内置函数的,必须要调用自己定义的函数,然后你可以在自定义的函数内使用内置函数。
事件处理函数传参
<!-- 事件处理函数调用:直接写函数名 --> <button @click="say"></button> <!-- 事件处理函数调用:常规调用 --> <button @click="say('hi',$event)"></button>
在不传递自定义参数的时候,上述两种用法均可以使用;但是如果需要传递自定义参数的话,则需要使用第2种方式。
事件对象的传递与接收注意点
- 如果事件直接使用函数名并且不写小括号,那么默认会将事件对象作为唯一参数进行传递,可以在定义函数的位置直接定义一个形参,并且在函数内可以使用该形参
- 如果使用常规的自定义函数调用(只要写了小括号),那么如果需要使用事件对象则必须作为最后一个参数进行传递,且事件对象的名称必须是“$event”
示例代码
<style> #big { width: 300px; height: 300px; background-color: red; } #mid { width: 200px; height: 200px; background-color: green; } #sma { width: 100px; height: 100px; background-color: pink; } </style> <body> <div id="app"> <div id="big" @click="say('大娃',$event)"> <div id="mid" @click="say('二娃',$event)"> <div id="sma" @click="say('三娃',$event)"></div> </div> </div> </div> </body> <script src="./js/vue.js"></script> <script> new Vue({ el: '#app', data: { }, methods:{ say: function(name,event){ console.log('你点了' + name); } } }) </script>
事件修饰符
含义:用来处理事件的特定行为(也是vue提供一些语法糖)
使用示例:
<!-- 停止冒泡 --> <button @click.stop="doThis"></button> <!-- 阻止默认行为 --> <button @click.prevent="doThis"></button> <!-- 串联修饰符(连贯操作) --> <button @click.stop.prevent="doThis"></button>
更多事件修饰符请参考官方文档:https://cn.vuejs.org/v2/api/#v-on
实例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .dawa { background: red; width: 400px; height: 400px; } .erwa { background: orange; height: 300px; width: 300px; } .sanwa { background: yellow; height: 200px; width: 200px; } </style> </head> <body> <div id="app"> <!-- 套娃行为 --> <div class="dawa" @click="call_dawa"> <div class="erwa" @click.stop="call_erwa"> <div class="sanwa" @click.stop="call_sanwa"> </div> </div> </div> </div> <script src="./js/vue.js"></script> <script> new Vue({ el: "#app", data: { }, methods:{ call_dawa(){ console.log('大娃:收到'); }, call_erwa(){ console.log('二娃:收到'); }, call_sanwa(){ console.log('三娃:你说啥'); } } }) </script> </body> </html>
按键修饰符
按键修饰符:按键事件
在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on
在监听键盘事件时添加按键修饰符。
<!-- 只有在 `key` 是 `Enter` 回车键的时候调用 --> <input @keyup.enter="submit"> <!-- 只有在 `key` 是 `Delete` 回车键的时候调用 --> <input v-on:keyup.delete="handle">
更多按键修饰符请参考官方文档:https://cn.vuejs.org/v2/guide/events.html#%E6%8C%89%E9%94%AE%E4%BF%AE%E9%A5%B0%E7%AC%A6
循环分支指令
循环指令
作用:根据一组数组或对象的选项列表进行渲染
**指令:**v-for
- 数组遍历使用示例:
<!-- 模板部分 --> <ul> <!-- 直接取值 --> <li v-for='item in fruits'>{{item}}</li> <!-- 带索引 --> <li v-for='(item,index) in fruits'>{{item}}{{index}}</li> </ul> <!-- JavaScript部分 --> ...... data: { fruits: ['apple','pear','banana','orange'] } ......
细节:key的作用,提高性能,不影响显示效果(如果没有id,可以考虑使用索引替代
),切记key
的值不能重复,只要遵循不重复的原则即可,值是什么无所谓。
key的作用就是更新组件时判断两个节点是否相同。相同就复用,不相同就删除旧的创建新的。
<ul> <li :key='item.id' v-for='(item,index) in fruits'>{{item}}</li> </ul>
- 对象遍历使用示例
<!-- 模板部分 --> <ul> <li v-for='(value,name,index) in obj'>{{value + '-' + name + '-' + index}}</li> </ul> <!-- JavaScript部分 --> ...... data: { obj: { username: 'zhangsan', age: 28, gender: 'male' } } ......
示例代码:
<body> <div id="app"> <div> <ul> <li :key="index" v-for="(item,index) in cars">{{item}}</li> </ul> </div> <div> <ul> <li :key="index" v-for="(item,key,index) in user">{{key}}:{{item}}</li> </ul> </div> </div> </body> <script src="./js/vue.js"></script> <script> new Vue({ el: '#app', data: { cars: ['bmw','aodi','benci','haima'], user: { username: 'zhangsan', gender: 'mele',//性别,sex age: 22 } } }) </script>
分支指令
作用:根据表达式的布尔值(true/false)进行判断是否渲染/显示该元素
- v-if
- v-else
- v-else-if
上述三个指令是分支中最常见的。根据需求,v-if可以单独使用,也可以配合v-else一起使用,也可以配合v-else-if和v-else一起使用。
- v-show
v-show是根据表达式之真假值,切换元素的
display
CSS属性(是根据表达式的布尔值来判断是否显示该元素)。
使用示例:
<!-- 模板部分 --> <div v-if="score >= 90"> 优秀 </div> <div v-else-if="score >= 80 && score < 90"> 良好 </div> <div v-else-if="score >= 70 && score < 80"> 一般 </div> <div v-else> 不及格 </div> <!-- v-show --> <div v-show='flag'>测试v-show</div> <!-- JavaScript部分 --> ...... data: { score: 88, flag:false } ......