vue 知识点整理——指令
vue指令:
-
v-text:
用于操作纯文本。如果要更新部分的文本,需要使用 {{ Mustache }} 插值。
示例:
<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
-
v-html:
v-html用于输出html,它与v-text区别在于v-text输出的是纯文本,浏览器不会对其再进行html解析,但v-html会将其当html标签解析后输出。
示例:
<div id="app">
<div v-html='msg'></div>
</div>
<script>
var vm = new Vue({
data: {
msg: '<p>今天真高兴啊</p>'
}
})
</script>
-
v-show:
根据表达式之真假值,切换元素的 display CSS 属性。
-
v-if:
指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。
示例:
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
-
v-else:
你可以使用 v-else 指令来表示 v-if 的“else 块,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。
示例:
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
-
v-else-if:
顾名思义,充当 v-if 的“else-if 块”,可以连续使用,类似于 v-else,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>
-
v-for:
应用v-for遍历dom的时候,要加:key="item.id",加了key(一定要具有唯一性) id的checkbox跟内容进行了一个关联。是我们想达到的效果
<ul>
<li v-for="(item, index) in list" :key="item.id">
<input type="checkbox" > {{item.name}}
</li>
</ul>
-
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 } 模式添加侦听器
用在普通元素上时,可以用 v-on 指令监听原生 DOM 事件,并在触发时运行一些 JavaScript 代码。
<div id="app">
<p>{{counter}}</p>
<div class="add" @click='add'></div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
counter: 0
},
methods: {
add(){
this.counter += 1;
}
},
})
</script>
在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event 属性:v-on:click="handle('ok', $event)"。
<button v-on:click="warn('Form cannot be submitted yet.', $event)">
Submit
</button>
// ...
methods: {
warn: function (message, event) {
// 现在我们可以访问原生事件对象
if (event) event.preventDefault()
alert(message)
}
}
-
v-bind:
缩写: :
修饰符:
-
.prop
- 被用于绑定 DOM 属性 (property)。(差别在哪里?) -
.camel
- (2.1.0+) 将 kebab-case 特性名转换为 camelCase. (从 2.1.0 开始支持) -
.sync
(2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的v-on
侦听器
动态地绑定一个或多个特性,或一个组件 prop 到表达式。
在绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。可以通过下面的教程链接查看详情。
在绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。
指令可以在其名称后面带一个参数,中间放一个冒号隔开,这个参数通常是HTML元素的特性(attribute)
示例:
<!-- 绑定一个属性 -->
<img v-bind:src="imageSrc">
<!-- 动态特性名 (2.6.0+) -->
<button v-bind:[key]="value"></button>
<!-- 缩写 -->
<img :src="imageSrc">
<!-- 动态特性名缩写 (2.6.0+) -->
<button :[key]="value"></button>
<!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName">
<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
// red这个class存在与否,取决于 isRed 是true 或者 false
<div :class="[classA, classB]"></div>
如果你也想根据条件切换列表中的 class,可以用三元表达式:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:
<div :class="[classA, { classB: isB, classC: isC }]">
<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
<div :style="[styleObjectA, styleObjectB]"></div>
<!-- 绑定一个有属性的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
<!-- prop 绑定。“prop”必须在 my-component 中声明。-->
<my-component :prop="someThing"></my-component>
-
v-model:
可以用 v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
示例:
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'hello'
}
})
</script>
从 vue@2.6.x 开始,Vue 为具名和范围插槽引入了一个全新的语法,即我们今天要讲的主角:
v-slot
指令。目的就是想统一slot
和scope-slot
语法,使代码更加规范和清晰。既然有新的语法上位,很明显,slot
和scope-slot
也将会在vue@3.0.x
中彻底的跟我们说拜拜了。而从vue@2.6.0
开始,官方推荐我们使用v-slot
来替代后两者。
-
v-slot:
缩写:
提供具名插槽或需要接收 prop 的插槽
具名插槽:
有时我们需要多个插槽。例如对于一个带有如下模板的 <base-layout> 组件:
<div class="container">
<header>
<!-- 我们希望把页头放这里 -->
</header>
<main>
<!-- 我们希望把主要内容放这里 -->
</main>
<footer>
<!-- 我们希望把页脚放这里 -->
</footer>
</div>
对于这样的情况,<slot> 元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:(vue 2.6.0后废弃)
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
一个不带 name 的 <slot> 出口会带有隐含的名字“default”。
在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称:
<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
现在 <template> 元素中的所有内容都将会被传入相应的插槽。任何没有被包裹在带有 v-slot 的 <template> 中的内容都会被视为默认插槽的内容。
然而,如果你希望更明确一些,仍然可以在一个 <template> 中包裹默认插槽的内容:
<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<template v-slot:default>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</template>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
任何一种写法都会渲染出:
<div class="container">
<header>
<h1>Here might be a page title</h1>
</header>
<main>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</main>
<footer>
<p>Here's some contact info</p>
</footer>
</div>
作用域插槽:
有时让插槽内容能够访问子组件中才有的数据是很有用的。例如,设想一个带有如下模板的 <current-user> 组件:
<span>
<slot>{{ user.lastName }}</slot>(2.6.0以后弃用)
</span>
我们想让它的后备内容显示用户的名,以取代正常情况下用户的姓,如下:
<current-user>
{{ user.firstName }}
</current-user>
然而上述代码不会正常工作,因为只有 <current-user> 组件可以访问到 user 而我们提供的内容是在父级渲染的。
为了让 user 在父级的插槽内容可用,我们可以将 user 作为一个 <slot> 元素的特性绑定上去:
<span>
<slot v-bind:user="user">
{{ user.lastName }}
</slot>
</span>
绑定在 <slot> 元素上的特性被称为插槽 prop。现在在父级作用域中,我们可以给 v-slot 带一个值来定义我们提供的插槽 prop 的名字:
<current-user>
<template v-slot:default="slotProps">
{{ slotProps.user.firstName }}
</template>
</current-user>
在这个例子中,我们选择将包含所有插槽 prop 的对象命名为 slotProps,但你也可以使用任意你喜欢的名字。
-
v-pre:
跳过这个元素和它的子元素的编译过程,不和data数据冲突。
-
v-block:
就是vue渲染完指定的整个DOM后才进行显示。它必须和CSS样式一起使用。
-
v-once:
只显示DOM第一次渲染的值,以后不改了
示例:
<style>
[v-cloak] {
display: none;
}
</style>
<!-- 不和data数据冲突 -->
<div v-pre>{{message}}</div>
<!-- 就是vue渲染完指定的整个DOM后才进行显示。它必须和CSS样式一起使用 -->
<div v-cloak>{{message}}</div>
<!-- 只显示DOM第一次渲染的值,以后不改了 -->
<div v-once>第一次绑定的值:{{message}}</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'hello'
}
})
</script>