Vue笔记—Vue指令
1、v-text指令
使用效果和插值语法的效果一样
<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
2、v-html指令
在vue的插值语法中是不支持输出html代码的,因为在网站上渲染出来html代码是非常危险的,会遭遇XSS攻击。所以可以使用v-html指令来输出你想要打印的内容。
<div v-html="html"></div>
3、v-show指令
根据表达式的真假来切换元素的display属性,使得元素显示或者隐藏。
<div v-show="flag"></div>
或者
<div v-show="flag === 1 ? true : false"></div>
4、v-if指令
根据表达式的结果来决定是否渲染元素。在切换的时候元素和他的数据绑定/组件被销毁并重建,如果元素是,将提出它的内容作为条件快。由于v-if操作的是DOM节点,所以开销比较大 如果需要频繁切换元素的显示与隐藏,尽量使用v-show指令.
注意: v-if 和 v-for 一起使用的时候,因为v-for的优先级比较高,所以不要写在一标签上.
5、v-else-if指令
在前面必须有v-if 或者 v-else-if 指令
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>
6、v-else指令
不需要加表达式,但是需要跟在v-if 或者 v-else-if 的后面
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>
7、v-for指令
基于源数据多次渲染元素或模板快。
<div v-for="item in items">
{{ item.text }}
</div>
可以对数组或者对象进行遍历( 通常我们会在绑定一个key值 )
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, name, index) in object"></div>
<div v-for="item in items" :key="item.id">
{{ item.text }}
</div>
8、v-on(@)指令
绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。
在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event
property:v-on:click="handle('ok', $event)"
。
从 2.4.0
开始,v-on
同样支持不带参数绑定一个事件/监听器键值对的对象。注意当使用对象语法时,是不支持任何修饰器的。
事件修饰符
.stop
- 调用event.stopPropagation()
。.prevent
- 调用event.preventDefault()
。.capture
- 添加事件侦听器时使用 capture 模式。.self
- 只当事件是从侦听器绑定的元素本身触发时才触发回调。.{keyCode | keyAlias}
- 只当事件是从特定键触发时才触发回调。.native
- 监听组件根元素的原生事件。.once
- 只触发一次回调。.left
- (2.2.0) 只当点击鼠标左键时触发。.right
- (2.2.0) 只当点击鼠标右键时触发。.middle
- (2.2.0) 只当点击鼠标中键时触发。.passive
- (2.3.0) 以{ passive: true }
模式添加侦听器
<!-- 方法处理器 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>
<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>
<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>
<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>
<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">
<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">
<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
9、v-bind(:)指令
修饰符
.prop
- 作为一个 DOM property 绑定而不是作为 attribute 绑定。(差别在哪里?).camel
- (2.1.0+) 将 kebab-case attribute 名转换为 camelCase。(从 2.1.0 开始支持).sync
(2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的v-on
侦听器。
动态地绑定一个或者多个attribute,或者一个组件地prop到表达式
绑定class或style地时候,支持其他类型地值,如数组或者对象
绑定prop地时候,prop必须在子组件中声明,可以用修饰符指定不同的绑定类型
<!-- 绑定一个 attribute -->
<img v-bind:src="imageSrc">
<!-- 动态 attribute 名 (2.6.0+) -->
<button v-bind:[key]="value"></button>
<!-- 缩写 -->
<img :src="imageSrc">
<!-- 动态 attribute 名缩写 (2.6.0+) -->
<button :[key]="value"></button>
<!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName">
<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
<div :class="[classA, classB]"></div>
<div :class="[classA, { classB: isB, classC: isC }]">
<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div :style="[styleObjectA, styleObjectB]"></div>
<!-- 绑定一个全是 attribute 的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
<!-- 通过 prop 修饰符绑定 DOM attribute -->
<div v-bind:text-content.prop="text"></div>
<!-- prop 绑定。“prop”必须在 my-component 中声明。-->
<my-component :prop="someThing"></my-component>
<!-- 通过 $props 将父组件的 props 一起传给子组件 -->
<child-component v-bind="$props"></child-component>
<!-- XLink -->
<svg><a :xlink:special="foo"></a></svg>
10、v-model指令
通常用于<input>
和<textarea>
在表单上或者组件上创建双向数据绑定
修饰符
11、v-slot(#)指令
用于在父组件中设置子组件的位置
默认插槽指令的参数为v-slot:default
<!-- 具名插槽 -->
<base-layout>
<template v-slot:header>
Header content
</template>
Default slot content
<template v-slot:footer>
Footer content
</template>
</base-layout>
<!-- 接收 prop 的具名插槽 -->
<infinite-scroll>
<template v-slot:item="slotProps">
<div class="item">
{{ slotProps.item.text }}
</div>
</template>
</infinite-scroll>
<!-- 接收 prop 的默认插槽,使用了解构 -->
<mouse-position v-slot="{ x, y }">
Mouse position: {{ x }}, {{ y }}
</mouse-position>
11、v-once指令
只渲染元素和组件一次,随后的重新渲染元素或者组件及其所有的子节点将被视为静态内容并跳过。可以用于优化更新性能。
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
12、v-pre指令
跳过这个元素和它的子元素的编译过程。跳过大量没有指令的节点会加快编译
<span v-pre>{{ this will not be compiled }}</span>