常用指令
v-bind:xxx
v-bind : 单向绑定解析表达式, 可简写为 :xxx 数据只能从data流向页面。
v-model :xxx
v-model : 双向绑定是vue的一个核心功能,v-model:value 可简写为 v-model
实现mvvm主要包含两个方面,数据变化更新视图,视图变化更新数据(不仅能从data流向页面,还可以从页面流向data。):
关于Vue的双向绑定,核心是Object.defineProperty()方法
vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。简单点来说,就是通过此方法来定义一个值,调用、使用到了get方法,赋值,使用到了set方法
语法:Object.defineProperty(obj,prop,descriptor)
- obj——要在其上定义属性的对象。
- prop——要定义或修改的属性的名称。
- descriptor——将被定义或修改的属性描述符。
v-on:xxx
v-on : 绑定事件监听, 可简写为@
v-for :xxx
v-for : 遍历数组/对象/字符串
<template v-if="shouldShowItem">
<div v-for="item in itemList"></div>
</template>
v-if :xxx
v-if : 条件渲染(动态控制节点是否存在)
【v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”】
适用于:切换频率较低的场景。
特点:不展示的DOM元素直接被移除。
v-else :xxx
v-else : 条件渲染(动态控制节点是否存存在)
v-show :xxx
v-show : 条件渲染 (动态控制节点是否展示)
适用于:切换频率较高的场景。
特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
v-for和v-if的优先级:
(v-for的优先级比v-if高)
如果两者同时使用,那么v-if会在每一个v-for循环渲染出来的项上作用(每次循环就会执行一次判断),造成性能上的浪费。
解决方法:将v-if放到循环列表元素的父元素中或使用template将v-for渲染的元素包起来,再template上使用v-if。
v-if 和v-show本质区别 :
(1)v-show本质就是为该元素添加css--display:none,dom元素依旧还在,控制隐藏
(2)v-if是将dom元素整个添加或删除
内置指令
v-text指令:
1.作用:向其所在的节点中渲染文本内容。
2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。
v-html指令:
1.作用:向指定节点中渲染包含html结构的内容。
2.与插值语法的区别:
(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2).v-html可以识别html结构。
3.严重注意:v-html有安全性问题!!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
v-cloak指令(没有值):
1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。
v-once指令:
1.v-once所在节点在初次动态渲染后,就视为静态内容了。
2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
v-pre指令:
1.跳过其所在节点的编译过程。
2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
自定义指令
定义语法
(1).局部指令
new Vue({
new Vue({
directives:{指令名:配置对象} 或 directives{指令名:回调函数}
}) })
(2).全局指令
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
配置对象中常用的3个回调
(1).bind:指令与元素成功绑定时调用。
(2).inserted:指令所在元素被插入页面时调用。
(3).update:指令所在模板结构被重新解析时调用。
备注
1.指令定义时不加v-,但使用时要加v-;
2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。
eg:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。
eg:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。